{-# LANGUAGE CPP #-}{-# LANGUAGE RankNTypes #-}{-# LANGUAGE MultiParamTypeClasses #-}{-# LANGUAGE FlexibleInstances #-}{-# LANGUAGE UndecidableInstances #-}------------------------------------------------------------------------------- |-- Module : Data.Machine.Plan-- Copyright : (C) 2012 Edward Kmett, Rúnar Bjarnason-- License : BSD-style (see the file LICENSE)---- Maintainer : Edward Kmett <ekmett@gmail.com>-- Stability : provisional-- Portability : Rank-N Types, MPTCs------------------------------------------------------------------------------moduleData.Machine.Plan(-- * PlansPlan ,runPlan ,PlanT (..),yield ,maybeYield ,await ,stop ,awaits ,exhaust )whereimportControl.ApplicativeimportControl.CategoryimportControl.Monad(MonadPlus(..))importControl.Monad.Trans.ClassimportControl.Monad.IO.ClassimportControl.Monad.State.ClassimportControl.Monad.Reader.ClassimportControl.Monad.Error.ClassimportqualifiedControl.Monad.FailasFailimportControl.Monad.Writer.ClassimportData.Functor.IdentityimportPreludehiding((.),id)--------------------------------------------------------------------------------- Plans--------------------------------------------------------------------------------- | You can 'construct' a 'Plan' (or 'PlanT'), turning it into a-- 'Data.Machine.Type.Machine' (or 'Data.Machine.Type.MachineT').--newtypePlanT k o m a =PlanT {forall (k :: * -> *) o (m :: * -> *) a.
PlanT k o m a
-> forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
runPlanT ::forallr .(a ->m r )->-- Done a(o ->m r ->m r )->-- Yield o (Plan k o a)(forallz .(z ->m r )->k z ->m r ->m r )->-- forall z. Await (z -> Plan k o a) (k z) (Plan k o a)m r ->-- Failm r }-- | A @'Plan' k o a@ is a specification for a pure 'Machine', that reads inputs selected by @k@-- with types based on @i@, writes values of type @o@, and has intermediate results of type @a@.---- A @'Plan' k o a@ can be used as a @'PlanT' k o m a@ for any @'Monad' m@.---- It is perhaps easier to think of 'Plan' in its un-cps'ed form, which would-- look like:---- @-- data 'Plan' k o a-- = Done a-- | Yield o (Plan k o a)-- | forall z. Await (z -> Plan k o a) (k z) (Plan k o a)-- | Fail-- @typePlan k o a =forallm .PlanT k o m a -- | Deconstruct a 'Plan' without reference to a 'Monad'.runPlan ::PlanT k o Identitya ->(a ->r )->(o ->r ->r )->(forallz .(z ->r )->k z ->r ->r )->r ->r runPlan :: forall (k :: * -> *) o a r.
PlanT k o Identity a
-> (a -> r)
-> (o -> r -> r)
-> (forall z. (z -> r) -> k z -> r -> r)
-> r
-> r
runPlan PlanT k o Identity a
m a -> r
kp o -> r -> r
ke forall z. (z -> r) -> k z -> r -> r
kr r
kf =Identity r -> r
forall a. Identity a -> a
runIdentity(Identity r -> r) -> Identity r -> r
forall a b. (a -> b) -> a -> b
$PlanT k o Identity a
-> forall r.
 (a -> Identity r)
 -> (o -> Identity r -> Identity r)
 -> (forall z. (z -> Identity r) -> k z -> Identity r -> Identity r)
 -> Identity r
 -> Identity r
forall (k :: * -> *) o (m :: * -> *) a.
PlanT k o m a
-> forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
runPlanT PlanT k o Identity a
m (r -> Identity r
forall a. a -> Identity a
Identity(r -> Identity r) -> (a -> r) -> a -> Identity r
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
.a -> r
kp )(\o
o (Identityr
r )->r -> Identity r
forall a. a -> Identity a
Identity(o -> r -> r
ke o
o r
r ))(\z -> Identity r
f k z
k (Identityr
r )->r -> Identity r
forall a. a -> Identity a
Identity((z -> r) -> k z -> r -> r
forall z. (z -> r) -> k z -> r -> r
kr (Identity r -> r
forall a. Identity a -> a
runIdentity(Identity r -> r) -> (z -> Identity r) -> z -> r
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
.z -> Identity r
f )k z
k r
r ))(r -> Identity r
forall a. a -> Identity a
Identityr
kf ){-# INLINErunPlan #-}instanceFunctor(PlanT k o m )wherefmap :: forall a b. (a -> b) -> PlanT k o m a -> PlanT k o m b
fmapa -> b
f (PlanT forall r.
(a -> m r)
-> (o -> m r -> m r)
-> (forall z. (z -> m r) -> k z -> m r -> m r)
-> m r
-> m r
m )=(forall r.
 (b -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m b
forall (k :: * -> *) o (m :: * -> *) a.
(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
PlanT ((forall r.
 (b -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
 -> PlanT k o m b)
-> (forall r.
 (b -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m b
forall a b. (a -> b) -> a -> b
$\b -> m r
k ->(a -> m r)
-> (o -> m r -> m r)
-> (forall z. (z -> m r) -> k z -> m r -> m r)
-> m r
-> m r
forall r.
(a -> m r)
-> (o -> m r -> m r)
-> (forall z. (z -> m r) -> k z -> m r -> m r)
-> m r
-> m r
m (b -> m r
k (b -> m r) -> (a -> b) -> a -> m r
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
.a -> b
f ){-# INLINEfmap#-}instanceApplicative(PlanT k o m )wherepure :: forall a. a -> PlanT k o m a
purea
a =(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
forall (k :: * -> *) o (m :: * -> *) a.
(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
PlanT (\a -> m r
kp o -> m r -> m r
_forall z. (z -> m r) -> k z -> m r -> m r
_m r
_->a -> m r
kp a
a ){-# INLINEpure#-}PlanT k o m (a -> b)
m <*> :: forall a b. PlanT k o m (a -> b) -> PlanT k o m a -> PlanT k o m b
<*>PlanT k o m a
n =(forall r.
 (b -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m b
forall (k :: * -> *) o (m :: * -> *) a.
(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
PlanT ((forall r.
 (b -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
 -> PlanT k o m b)
-> (forall r.
 (b -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m b
forall a b. (a -> b) -> a -> b
$\b -> m r
kp o -> m r -> m r
ke forall z. (z -> m r) -> k z -> m r -> m r
kr m r
kf ->PlanT k o m (a -> b)
-> forall r.
 ((a -> b) -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
forall (k :: * -> *) o (m :: * -> *) a.
PlanT k o m a
-> forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
runPlanT PlanT k o m (a -> b)
m (\a -> b
f ->PlanT k o m a
-> forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
forall (k :: * -> *) o (m :: * -> *) a.
PlanT k o m a
-> forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
runPlanT PlanT k o m a
n (\a
a ->b -> m r
kp (a -> b
f a
a ))o -> m r -> m r
ke (z -> m r) -> k z -> m r -> m r
forall z. (z -> m r) -> k z -> m r -> m r
kr m r
kf )o -> m r -> m r
ke (z -> m r) -> k z -> m r -> m r
forall z. (z -> m r) -> k z -> m r -> m r
kr m r
kf {-# INLINE(<*>)#-}PlanT k o m a
m *> :: forall a b. PlanT k o m a -> PlanT k o m b -> PlanT k o m b
*>PlanT k o m b
n =(forall r.
 (b -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m b
forall (k :: * -> *) o (m :: * -> *) a.
(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
PlanT ((forall r.
 (b -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
 -> PlanT k o m b)
-> (forall r.
 (b -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m b
forall a b. (a -> b) -> a -> b
$\b -> m r
kp o -> m r -> m r
ke forall z. (z -> m r) -> k z -> m r -> m r
kr m r
kf ->PlanT k o m a
-> forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
forall (k :: * -> *) o (m :: * -> *) a.
PlanT k o m a
-> forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
runPlanT PlanT k o m a
m (\a
_->PlanT k o m b
-> forall r.
 (b -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
forall (k :: * -> *) o (m :: * -> *) a.
PlanT k o m a
-> forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
runPlanT PlanT k o m b
n b -> m r
kp o -> m r -> m r
ke (z -> m r) -> k z -> m r -> m r
forall z. (z -> m r) -> k z -> m r -> m r
kr m r
kf )o -> m r -> m r
ke (z -> m r) -> k z -> m r -> m r
forall z. (z -> m r) -> k z -> m r -> m r
kr m r
kf {-# INLINE(*>)#-}PlanT k o m a
m <* :: forall a b. PlanT k o m a -> PlanT k o m b -> PlanT k o m a
<* PlanT k o m b
n =(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
forall (k :: * -> *) o (m :: * -> *) a.
(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
PlanT ((forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
 -> PlanT k o m a)
-> (forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
forall a b. (a -> b) -> a -> b
$\a -> m r
kp o -> m r -> m r
ke forall z. (z -> m r) -> k z -> m r -> m r
kr m r
kf ->PlanT k o m a
-> forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
forall (k :: * -> *) o (m :: * -> *) a.
PlanT k o m a
-> forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
runPlanT PlanT k o m a
m (\a
a ->PlanT k o m b
-> forall r.
 (b -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
forall (k :: * -> *) o (m :: * -> *) a.
PlanT k o m a
-> forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
runPlanT PlanT k o m b
n (\b
_->a -> m r
kp a
a )o -> m r -> m r
ke (z -> m r) -> k z -> m r -> m r
forall z. (z -> m r) -> k z -> m r -> m r
kr m r
kf )o -> m r -> m r
ke (z -> m r) -> k z -> m r -> m r
forall z. (z -> m r) -> k z -> m r -> m r
kr m r
kf {-# INLINE(<*)#-}instanceAlternative(PlanT k o m )whereempty :: forall a. PlanT k o m a
empty =(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
forall (k :: * -> *) o (m :: * -> *) a.
(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
PlanT ((forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
 -> PlanT k o m a)
-> (forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
forall a b. (a -> b) -> a -> b
$\a -> m r
_o -> m r -> m r
_forall z. (z -> m r) -> k z -> m r -> m r
_m r
kf ->m r
kf {-# INLINEempty#-}PlanT forall r.
(a -> m r)
-> (o -> m r -> m r)
-> (forall z. (z -> m r) -> k z -> m r -> m r)
-> m r
-> m r
m <|> :: forall a. PlanT k o m a -> PlanT k o m a -> PlanT k o m a
<|> PlanT forall r.
(a -> m r)
-> (o -> m r -> m r)
-> (forall z. (z -> m r) -> k z -> m r -> m r)
-> m r
-> m r
n =(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
forall (k :: * -> *) o (m :: * -> *) a.
(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
PlanT ((forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
 -> PlanT k o m a)
-> (forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
forall a b. (a -> b) -> a -> b
$\a -> m r
kp o -> m r -> m r
ke forall z. (z -> m r) -> k z -> m r -> m r
kr m r
kf ->(a -> m r)
-> (o -> m r -> m r)
-> (forall z. (z -> m r) -> k z -> m r -> m r)
-> m r
-> m r
forall r.
(a -> m r)
-> (o -> m r -> m r)
-> (forall z. (z -> m r) -> k z -> m r -> m r)
-> m r
-> m r
m a -> m r
kp o -> m r -> m r
ke (z -> m r) -> k z -> m r -> m r
forall z. (z -> m r) -> k z -> m r -> m r
kr ((a -> m r)
-> (o -> m r -> m r)
-> (forall z. (z -> m r) -> k z -> m r -> m r)
-> m r
-> m r
forall r.
(a -> m r)
-> (o -> m r -> m r)
-> (forall z. (z -> m r) -> k z -> m r -> m r)
-> m r
-> m r
n a -> m r
kp o -> m r -> m r
ke (z -> m r) -> k z -> m r -> m r
forall z. (z -> m r) -> k z -> m r -> m r
kr m r
kf ){-# INLINE(<|>)#-}instanceMonad(PlanT k o m )wherereturn :: forall a. a -> PlanT k o m a
return=a -> PlanT k o m a
forall a. a -> PlanT k o m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure{-# INLINEreturn#-}PlanT forall r.
(a -> m r)
-> (o -> m r -> m r)
-> (forall z. (z -> m r) -> k z -> m r -> m r)
-> m r
-> m r
m >>= :: forall a b. PlanT k o m a -> (a -> PlanT k o m b) -> PlanT k o m b
>>=a -> PlanT k o m b
f =(forall r.
 (b -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m b
forall (k :: * -> *) o (m :: * -> *) a.
(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
PlanT (\b -> m r
kp o -> m r -> m r
ke forall z. (z -> m r) -> k z -> m r -> m r
kr m r
kf ->(a -> m r)
-> (o -> m r -> m r)
-> (forall z. (z -> m r) -> k z -> m r -> m r)
-> m r
-> m r
forall r.
(a -> m r)
-> (o -> m r -> m r)
-> (forall z. (z -> m r) -> k z -> m r -> m r)
-> m r
-> m r
m (\a
a ->PlanT k o m b
-> forall r.
 (b -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
forall (k :: * -> *) o (m :: * -> *) a.
PlanT k o m a
-> forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
runPlanT (a -> PlanT k o m b
f a
a )b -> m r
kp o -> m r -> m r
ke (z -> m r) -> k z -> m r -> m r
forall z. (z -> m r) -> k z -> m r -> m r
kr m r
kf )o -> m r -> m r
ke (z -> m r) -> k z -> m r -> m r
forall z. (z -> m r) -> k z -> m r -> m r
kr m r
kf ){-# INLINE(>>=)#-}>> :: forall a b. PlanT k o m a -> PlanT k o m b -> PlanT k o m b
(>>)=PlanT k o m a -> PlanT k o m b -> PlanT k o m b
forall a b. PlanT k o m a -> PlanT k o m b -> PlanT k o m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
(*>){-# INLINE(>>)#-}
#if !(MIN_VERSION_base(4,13,0))
fail=Fail.fail
#endif
instanceFail.MonadFail(PlanT k o m )wherefail :: forall a. String -> PlanT k o m a
failString
_=(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
forall (k :: * -> *) o (m :: * -> *) a.
(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
PlanT (\a -> m r
_o -> m r -> m r
_forall z. (z -> m r) -> k z -> m r -> m r
_m r
kf ->m r
kf )instanceMonadPlus(PlanT k o m )wheremzero :: forall a. PlanT k o m a
mzero =PlanT k o m a
forall a. PlanT k o m a
forall (f :: * -> *) a. Alternative f => f a
empty{-# INLINEmzero#-}mplus :: forall a. PlanT k o m a -> PlanT k o m a -> PlanT k o m a
mplus =PlanT k o m a -> PlanT k o m a -> PlanT k o m a
forall a. PlanT k o m a -> PlanT k o m a -> PlanT k o m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
(<|>){-# INLINEmplus#-}instanceMonadTrans(PlanT k o )wherelift :: forall (m :: * -> *) a. Monad m => m a -> PlanT k o m a
lift m a
m =(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
forall (k :: * -> *) o (m :: * -> *) a.
(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
PlanT (\a -> m r
kp o -> m r -> m r
_forall z. (z -> m r) -> k z -> m r -> m r
_m r
_->m a
m m a -> (a -> m r) -> m r
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=a -> m r
kp ){-# INLINElift#-}instanceMonadIOm =>MonadIO(PlanT k o m )whereliftIO :: forall a. IO a -> PlanT k o m a
liftIO IO a
m =(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
forall (k :: * -> *) o (m :: * -> *) a.
(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
PlanT (\a -> m r
kp o -> m r -> m r
_forall z. (z -> m r) -> k z -> m r -> m r
_m r
_->IO a -> m a
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIOIO a
m m a -> (a -> m r) -> m r
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=a -> m r
kp ){-# INLINEliftIO#-}instanceMonadStates m =>MonadStates (PlanT k o m )whereget :: PlanT k o m s
get =m s -> PlanT k o m s
forall (m :: * -> *) a. Monad m => m a -> PlanT k o m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftm s
forall s (m :: * -> *). MonadState s m => m s
get{-# INLINEget#-}put :: s -> PlanT k o m ()
put =m () -> PlanT k o m ()
forall (m :: * -> *) a. Monad m => m a -> PlanT k o m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift(m () -> PlanT k o m ()) -> (s -> m ()) -> s -> PlanT k o m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
.s -> m ()
forall s (m :: * -> *). MonadState s m => s -> m ()
put{-# INLINEput#-}state :: forall a. (s -> (a, s)) -> PlanT k o m a
state s -> (a, s)
f =(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
forall (k :: * -> *) o (m :: * -> *) a.
(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
PlanT ((forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
 -> PlanT k o m a)
-> (forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
forall a b. (a -> b) -> a -> b
$\a -> m r
kp o -> m r -> m r
_forall z. (z -> m r) -> k z -> m r -> m r
_m r
_->(s -> (a, s)) -> m a
forall a. (s -> (a, s)) -> m a
forall s (m :: * -> *) a. MonadState s m => (s -> (a, s)) -> m a
states -> (a, s)
f m a -> (a -> m r) -> m r
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=a -> m r
kp {-# INLINEstate#-}instanceMonadReadere m =>MonadReadere (PlanT k o m )whereask :: PlanT k o m e
ask =m e -> PlanT k o m e
forall (m :: * -> *) a. Monad m => m a -> PlanT k o m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftm e
forall r (m :: * -> *). MonadReader r m => m r
askreader :: forall a. (e -> a) -> PlanT k o m a
reader =m a -> PlanT k o m a
forall (m :: * -> *) a. Monad m => m a -> PlanT k o m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift(m a -> PlanT k o m a)
-> ((e -> a) -> m a) -> (e -> a) -> PlanT k o m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
.(e -> a) -> m a
forall a. (e -> a) -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
readerlocal :: forall a. (e -> e) -> PlanT k o m a -> PlanT k o m a
local e -> e
f PlanT k o m a
m =(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
forall (k :: * -> *) o (m :: * -> *) a.
(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
PlanT ((forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
 -> PlanT k o m a)
-> (forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
forall a b. (a -> b) -> a -> b
$\a -> m r
kp o -> m r -> m r
ke forall z. (z -> m r) -> k z -> m r -> m r
kr m r
kf ->(e -> e) -> m r -> m r
forall a. (e -> e) -> m a -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
locale -> e
f (PlanT k o m a
-> forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
forall (k :: * -> *) o (m :: * -> *) a.
PlanT k o m a
-> forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
runPlanT PlanT k o m a
m a -> m r
kp o -> m r -> m r
ke (z -> m r) -> k z -> m r -> m r
forall z. (z -> m r) -> k z -> m r -> m r
kr m r
kf )instanceMonadWriterw m =>MonadWriterw (PlanT k o m )wherewriter :: forall a. (a, w) -> PlanT k o m a
writer =m a -> PlanT k o m a
forall (m :: * -> *) a. Monad m => m a -> PlanT k o m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift(m a -> PlanT k o m a)
-> ((a, w) -> m a) -> (a, w) -> PlanT k o m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
.(a, w) -> m a
forall a. (a, w) -> m a
forall w (m :: * -> *) a. MonadWriter w m => (a, w) -> m a
writertell :: w -> PlanT k o m ()
tell =m () -> PlanT k o m ()
forall (m :: * -> *) a. Monad m => m a -> PlanT k o m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift(m () -> PlanT k o m ()) -> (w -> m ()) -> w -> PlanT k o m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
.w -> m ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
telllisten :: forall a. PlanT k o m a -> PlanT k o m (a, w)
listen PlanT k o m a
m =(forall r.
 ((a, w) -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m (a, w)
forall (k :: * -> *) o (m :: * -> *) a.
(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
PlanT ((forall r.
 ((a, w) -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
 -> PlanT k o m (a, w))
-> (forall r.
 ((a, w) -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m (a, w)
forall a b. (a -> b) -> a -> b
$\(a, w) -> m r
kp o -> m r -> m r
ke forall z. (z -> m r) -> k z -> m r -> m r
kr m r
kf ->PlanT k o m a
-> forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
forall (k :: * -> *) o (m :: * -> *) a.
PlanT k o m a
-> forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
runPlanT PlanT k o m a
m (((a, w) -> m r
kp ((a, w) -> m r) -> m (a, w) -> m r
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<)(m (a, w) -> m r) -> (a -> m (a, w)) -> a -> m r
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
.m a -> m (a, w)
forall a. m a -> m (a, w)
forall w (m :: * -> *) a. MonadWriter w m => m a -> m (a, w)
listen(m a -> m (a, w)) -> (a -> m a) -> a -> m (a, w)
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
.a -> m a
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return)o -> m r -> m r
ke (z -> m r) -> k z -> m r -> m r
forall z. (z -> m r) -> k z -> m r -> m r
kr m r
kf pass :: forall a. PlanT k o m (a, w -> w) -> PlanT k o m a
pass PlanT k o m (a, w -> w)
m =(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
forall (k :: * -> *) o (m :: * -> *) a.
(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
PlanT ((forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
 -> PlanT k o m a)
-> (forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
forall a b. (a -> b) -> a -> b
$\a -> m r
kp o -> m r -> m r
ke forall z. (z -> m r) -> k z -> m r -> m r
kr m r
kf ->PlanT k o m (a, w -> w)
-> forall r.
 ((a, w -> w) -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
forall (k :: * -> *) o (m :: * -> *) a.
PlanT k o m a
-> forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
runPlanT PlanT k o m (a, w -> w)
m ((a -> m r
kp (a -> m r) -> m a -> m r
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<)(m a -> m r) -> ((a, w -> w) -> m a) -> (a, w -> w) -> m r
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
.m (a, w -> w) -> m a
forall a. m (a, w -> w) -> m a
forall w (m :: * -> *) a. MonadWriter w m => m (a, w -> w) -> m a
pass(m (a, w -> w) -> m a)
-> ((a, w -> w) -> m (a, w -> w)) -> (a, w -> w) -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
.(a, w -> w) -> m (a, w -> w)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return)o -> m r -> m r
ke (z -> m r) -> k z -> m r -> m r
forall z. (z -> m r) -> k z -> m r -> m r
kr m r
kf instanceMonadErrore m =>MonadErrore (PlanT k o m )wherethrowError :: forall a. e -> PlanT k o m a
throwError =m a -> PlanT k o m a
forall (m :: * -> *) a. Monad m => m a -> PlanT k o m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift(m a -> PlanT k o m a) -> (e -> m a) -> e -> PlanT k o m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
.e -> m a
forall a. e -> m a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwErrorcatchError :: forall a. PlanT k o m a -> (e -> PlanT k o m a) -> PlanT k o m a
catchError PlanT k o m a
m e -> PlanT k o m a
k =(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
forall (k :: * -> *) o (m :: * -> *) a.
(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
PlanT ((forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
 -> PlanT k o m a)
-> (forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
forall a b. (a -> b) -> a -> b
$\a -> m r
kp o -> m r -> m r
ke forall z. (z -> m r) -> k z -> m r -> m r
kr m r
kf ->PlanT k o m a
-> forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
forall (k :: * -> *) o (m :: * -> *) a.
PlanT k o m a
-> forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
runPlanT PlanT k o m a
m a -> m r
kp o -> m r -> m r
ke (z -> m r) -> k z -> m r -> m r
forall z. (z -> m r) -> k z -> m r -> m r
kr m r
kf m r -> (e -> m r) -> m r
forall a. m a -> (e -> m a) -> m a
forall e (m :: * -> *) a.
MonadError e m =>
m a -> (e -> m a) -> m a
`catchError`\e
e ->PlanT k o m a
-> forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
forall (k :: * -> *) o (m :: * -> *) a.
PlanT k o m a
-> forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r
runPlanT (e -> PlanT k o m a
k e
e )a -> m r
kp o -> m r -> m r
ke (z -> m r) -> k z -> m r -> m r
forall z. (z -> m r) -> k z -> m r -> m r
kr m r
kf -- | Output a result.yield ::o ->Plan k o ()yield :: forall o (k :: * -> *). o -> Plan k o ()
yield o
o =(forall r.
 (() -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m ()
forall (k :: * -> *) o (m :: * -> *) a.
(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
PlanT (\() -> m r
kp o -> m r -> m r
ke forall z. (z -> m r) -> k z -> m r -> m r
_m r
_->o -> m r -> m r
ke o
o (() -> m r
kp ()))-- | Like yield, except stops if there is no value to yield.maybeYield ::Maybeo ->Plan k o ()maybeYield :: forall o (k :: * -> *). Maybe o -> Plan k o ()
maybeYield Maybe o
m =PlanT k o m ()
-> (o -> PlanT k o m ()) -> Maybe o -> PlanT k o m ()
forall b a. b -> (a -> b) -> Maybe a -> b
maybePlanT k o m ()
forall (k :: * -> *) o a (m :: * -> *). PlanT k o m a
stop (\o
x ->o -> Plan k o ()
forall o (k :: * -> *). o -> Plan k o ()
yield o
x )Maybe o
m -- | Wait for input.---- @'await' = 'awaits' 'id'@await ::Categoryk =>Plan (k i )o i await :: forall (k :: * -> * -> *) i o. Category k => Plan (k i) o i
await =(forall r.
 (i -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k i z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT (k i) o m i
forall (k :: * -> *) o (m :: * -> *) a.
(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
PlanT (\i -> m r
kp o -> m r -> m r
_forall z. (z -> m r) -> k i z -> m r -> m r
kr m r
kf ->(i -> m r) -> k i i -> m r -> m r
forall z. (z -> m r) -> k i z -> m r -> m r
kr i -> m r
kp k i i
forall a. k a a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
idm r
kf )-- | Wait for a particular input.---- @-- awaits 'L' :: 'Plan' ('T' a b) o a-- awaits 'R' :: 'Plan' ('T' a b) o b-- awaits 'id' :: 'Plan' ('Data.Machine.Is.Is' i) o i-- @awaits ::k i ->Plan k o i awaits :: forall (k :: * -> *) i o. k i -> Plan k o i
awaits k i
h =(forall r.
 (i -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m i
forall (k :: * -> *) o (m :: * -> *) a.
(forall r.
 (a -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m a
PlanT ((forall r.
 (i -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
 -> PlanT k o m i)
-> (forall r.
 (i -> m r)
 -> (o -> m r -> m r)
 -> (forall z. (z -> m r) -> k z -> m r -> m r)
 -> m r
 -> m r)
-> PlanT k o m i
forall a b. (a -> b) -> a -> b
$\i -> m r
kp o -> m r -> m r
_forall z. (z -> m r) -> k z -> m r -> m r
kr ->(i -> m r) -> k i -> m r -> m r
forall z. (z -> m r) -> k z -> m r -> m r
kr i -> m r
kp k i
h -- | @'stop' = 'empty'@stop ::Plan k o a stop :: forall (k :: * -> *) o a (m :: * -> *). PlanT k o m a
stop =PlanT k o m a
forall a. PlanT k o m a
forall (f :: * -> *) a. Alternative f => f a
empty-- | Run a monadic action repeatedly yielding its results, until it returns Nothing.exhaust ::Monadm =>m (Maybea )->PlanT k a m ()exhaust :: forall (m :: * -> *) a (k :: * -> *).
Monad m =>
m (Maybe a) -> PlanT k a m ()
exhaust m (Maybe a)
f =doMaybe a
x <-m (Maybe a) -> PlanT k a m (Maybe a)
forall (m :: * -> *) a. Monad m => m a -> PlanT k a m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
liftm (Maybe a)
f Maybe a -> Plan k a ()
forall o (k :: * -> *). Maybe o -> Plan k o ()
maybeYield Maybe a
x m (Maybe a) -> PlanT k a m ()
forall (m :: * -> *) a (k :: * -> *).
Monad m =>
m (Maybe a) -> PlanT k a m ()
exhaust m (Maybe a)
f 

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