0 | module Control.Monad.Free
2 | import Control.EffectAlgebra
7 | data Free : (sig : (Type -> Type) -> (Type -> Type))
10 | Return : a -> Free sig a
11 | Op : sig (Free sig) a -> Free sig a
14 | Syntax sig => Functor (Free sig) where
15 | map f (Return x) = Return (f x)
16 | map f (Op op) = Op (emap (map f) op)
19 | Syntax sig => Applicative (Free sig) where
22 | Return v <*> prog = map v prog
23 | Op op <*> prog = Op (emap (<*> prog) op)
25 | public export covering
26 | Syntax sig => Monad (Free sig) where
27 | Return v >>= prog = prog v
28 | Op op >>= prog = Op (emap (>>= prog) op)
31 | return : a -> Free sig a
35 | inject : Inj sub sup => sub (Free sup) a -> Free sup a
39 | project : Prj sup sub => Free sup a -> Maybe (sub (Free sup) a)
40 | project (Op s) = Just (prj s)