{-# LANGUAGE GADTs #-}{-# LANGUAGE Rank2Types #-}------------------------------------------------------------------------------- |-- Module : Data.Machine.Stack-- Copyright : (C) 2012 Edward Kmett-- License : BSD-style (see the file LICENSE)---- Maintainer : Edward Kmett <ekmett@gmail.com>-- Stability : provisional-- Portability : GADTs------------------------------------------------------------------------------moduleData.Machine.Stack(Stack (..),stack ,peek ,pop ,push )whereimportData.Machine.Plan importData.Machine.Type -- | This is a simple process type that knows how to push back input.dataStack a r wherePush ::a ->Stack a ()Pop ::Stack a a -- | Peek at the next value in the input stream without consuming itpeek ::Plan (Stack a )b a peek :: forall a b (m :: * -> *). PlanT (Stack a) b m a
peek =doa
a <-PlanT (Stack a) b m a
forall a b (m :: * -> *). PlanT (Stack a) b m a
pop a -> Plan (Stack a) b ()
forall a b. a -> Plan (Stack a) b ()
push a
a a -> PlanT (Stack a) b m a
forall a. a -> PlanT (Stack a) b m a
forall (m :: * -> *) a. Monad m => a -> m a
returna
a {-# INLINABLEpeek #-}-- | Push back into the input streampush ::a ->Plan (Stack a )b ()push :: forall a b. a -> Plan (Stack a) b ()
push a
a =Stack a () -> Plan (Stack a) b ()
forall (k :: * -> *) i o. k i -> Plan k o i
awaits (a -> Stack a ()
forall a. a -> Stack a ()
Push a
a ){-# INLINABLEpush #-}-- | Pop the next value in the input streampop ::Plan (Stack a )b a pop :: forall a b (m :: * -> *). PlanT (Stack a) b m a
pop =Stack a a -> Plan (Stack a) b a
forall (k :: * -> *) i o. k i -> Plan k o i
awaits Stack a a
forall a. Stack a a
Pop {-# INLINABLEpop #-}-- | Stream outputs from one 'Machine' into another with the possibility-- of pushing inputs back.stack ::Monadm =>MachineT m k a ->MachineT m (Stack a )o ->MachineT m k o stack :: forall (m :: * -> *) (k :: * -> *) a o.
Monad m =>
MachineT m k a -> MachineT m (Stack a) o -> MachineT m k o
stack MachineT m k a
up MachineT m (Stack a) o
down =MachineT m (Stack a) o
-> (Step (Stack a) o (MachineT m (Stack a) o) -> MachineT m k o)
-> MachineT m k o
forall (m :: * -> *) (k :: * -> *) o (k' :: * -> *) o'.
Monad m =>
MachineT m k o
-> (Step k o (MachineT m k o) -> MachineT m k' o')
-> MachineT m k' o'
stepMachine MachineT m (Stack a) o
down ((Step (Stack a) o (MachineT m (Stack a) o) -> MachineT m k o)
 -> MachineT m k o)
-> (Step (Stack a) o (MachineT m (Stack a) o) -> MachineT m k o)
-> MachineT m k o
forall a b. (a -> b) -> a -> b
$\Step (Stack a) o (MachineT m (Stack a) o)
stepD ->caseStep (Stack a) o (MachineT m (Stack a) o)
stepD ofStep (Stack a) o (MachineT m (Stack a) o)
Stop ->MachineT m k o
forall (k :: * -> *) b (m :: * -> *). Monad m => MachineT m k b
stopped Yield o
o MachineT m (Stack a) o
down' ->Step k o (MachineT m k o) -> MachineT m k o
forall (m :: * -> *) (k :: * -> *) o.
Monad m =>
Step k o (MachineT m k o) -> MachineT m k o
encased (o -> MachineT m k o -> Step k o (MachineT m k o)
forall (k :: * -> *) o r. o -> r -> Step k o r
Yield o
o (MachineT m k a
up MachineT m k a -> MachineT m (Stack a) o -> MachineT m k o
forall (m :: * -> *) (k :: * -> *) a o.
Monad m =>
MachineT m k a -> MachineT m (Stack a) o -> MachineT m k o
`stack` MachineT m (Stack a) o
down' ))Await t -> MachineT m (Stack a) o
down' (Push a
a )MachineT m (Stack a) o
_->Step k a (MachineT m k a) -> MachineT m k a
forall (m :: * -> *) (k :: * -> *) o.
Monad m =>
Step k o (MachineT m k o) -> MachineT m k o
encased (a -> MachineT m k a -> Step k a (MachineT m k a)
forall (k :: * -> *) o r. o -> r -> Step k o r
Yield a
a MachineT m k a
up )MachineT m k a -> MachineT m (Stack a) o -> MachineT m k o
forall (m :: * -> *) (k :: * -> *) a o.
Monad m =>
MachineT m k a -> MachineT m (Stack a) o -> MachineT m k o
`stack` t -> MachineT m (Stack a) o
down' ()Await t -> MachineT m (Stack a) o
down' Stack a t
Pop MachineT m (Stack a) o
ffD ->MachineT m k a
-> (Step k a (MachineT m k a) -> MachineT m k o) -> MachineT m k o
forall (m :: * -> *) (k :: * -> *) o (k' :: * -> *) o'.
Monad m =>
MachineT m k o
-> (Step k o (MachineT m k o) -> MachineT m k' o')
-> MachineT m k' o'
stepMachine MachineT m k a
up ((Step k a (MachineT m k a) -> MachineT m k o) -> MachineT m k o)
-> (Step k a (MachineT m k a) -> MachineT m k o) -> MachineT m k o
forall a b. (a -> b) -> a -> b
$\Step k a (MachineT m k a)
stepU ->caseStep k a (MachineT m k a)
stepU ofStep k a (MachineT m k a)
Stop ->MachineT m k a
forall (k :: * -> *) b (m :: * -> *). Monad m => MachineT m k b
stopped MachineT m k a -> MachineT m (Stack a) o -> MachineT m k o
forall (m :: * -> *) (k :: * -> *) a o.
Monad m =>
MachineT m k a -> MachineT m (Stack a) o -> MachineT m k o
`stack` MachineT m (Stack a) o
ffD Yield a
o MachineT m k a
up' ->MachineT m k a
up' MachineT m k a -> MachineT m (Stack a) o -> MachineT m k o
forall (m :: * -> *) (k :: * -> *) a o.
Monad m =>
MachineT m k a -> MachineT m (Stack a) o -> MachineT m k o
`stack` t -> MachineT m (Stack a) o
down' a
t
o Await t -> MachineT m k a
up' k t
req MachineT m k a
ffU ->Step k o (MachineT m k o) -> MachineT m k o
forall (m :: * -> *) (k :: * -> *) o.
Monad m =>
Step k o (MachineT m k o) -> MachineT m k o
encased ((t -> MachineT m k o)
-> k t -> MachineT m k o -> Step k o (MachineT m k o)
forall (k :: * -> *) o r t. (t -> r) -> k t -> r -> Step k o r
Await (\t
a ->t -> MachineT m k a
up' t
a MachineT m k a -> MachineT m (Stack a) o -> MachineT m k o
forall (m :: * -> *) (k :: * -> *) a o.
Monad m =>
MachineT m k a -> MachineT m (Stack a) o -> MachineT m k o
`stack` Step (Stack a) o (MachineT m (Stack a) o) -> MachineT m (Stack a) o
forall (m :: * -> *) (k :: * -> *) o.
Monad m =>
Step k o (MachineT m k o) -> MachineT m k o
encased Step (Stack a) o (MachineT m (Stack a) o)
stepD )k t
req (MachineT m k a
ffU MachineT m k a -> MachineT m (Stack a) o -> MachineT m k o
forall (m :: * -> *) (k :: * -> *) a o.
Monad m =>
MachineT m k a -> MachineT m (Stack a) o -> MachineT m k o
`stack` Step (Stack a) o (MachineT m (Stack a) o) -> MachineT m (Stack a) o
forall (m :: * -> *) (k :: * -> *) o.
Monad m =>
Step k o (MachineT m k o) -> MachineT m k o
encased Step (Stack a) o (MachineT m (Stack a) o)
stepD )){-# INLINABLEstack #-}

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