0 | module Control.Monad.Trans.Free
2 | import Control.Monad.Trans
4 | import Control.Monad.Free
6 | data FreeF : (f : Type -> Type) -> (a : Type) -> (b : Type) -> Type where
7 | Pure : a -> FreeF f a b
8 | Free : f b -> FreeF f a b
10 | Functor f => Functor (FreeF f a) where
11 | map _ (Pure a) = Pure a
12 | map g (Free as) = Free $
map g as
14 | transFreeF : (forall x. f x -> g x) -> FreeF f a b -> FreeF g a b
15 | transFreeF _ (Pure a) = Pure a
16 | transFreeF phi (Free as) = Free $
phi as
18 | record FreeT f m a where
20 | runFreeT : m (FreeF f a (FreeT f m a))
24 | iterT : {f : _} -> (Functor f, Monad m) => (f (m a) -> m a) -> FreeT f m a -> m a
25 | iterT f (MkFreeT m) = do
27 | case map (iterT f) val of