{-# 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