src/Data/Machine/Unread.hs

{-# LANGUAGE GADTs #-}
{-# LANGUAGE Rank2Types #-}
-----------------------------------------------------------------------------
-- |
-- Module : Data.Machine.Unread
-- Copyright : (C) 2012 Edward Kmett
-- License : BSD-style (see the file LICENSE)
--
-- Maintainer : Edward Kmett <ekmett@gmail.com>
-- Stability : provisional
-- Portability : GADTs
--
----------------------------------------------------------------------------
module Data.Machine.Unread
 ( Unread(..)
 , peek
 , unread
 ) where

import Data.Machine.Plan

-- | This is a simple process type that knows how to push back input.
data Unread a r where
 Unread :: a -> Unread a ()
 Read :: Unread a a

-- | Peek at the next value in the input stream without consuming it
peek :: Plan (Unread a) b a
peek = do
 a <- awaits Read
 awaits (Unread a)
 return a

-- | Push back into the input stream
unread :: a -> Plan (Unread a) b ()
unread a = awaits (Unread a)

-- TODO: make this a class?

AltStyle によって変換されたページ (->オリジナル) /