0 | module Control.Cont.Out
2 | import Control.HigherOrder
4 | import Control.Monad.Free
7 | data Out cnt = MkOut String cnt
11 | map f (MkOut x y) = MkOut x (f y)
14 | HOut : (Type -> Type) -> (Type -> Type)
18 | runOut : Free HOut a -> IO a
19 | runOut (Return x) = pure x
20 | runOut (Op (MkLift (MkOut s p))) =
21 | putStrLn s `io_bind` \_ => runOut p
24 | out : Inj HOut sig => String -> Free sig ()
25 | out x = inject {sub = HOut} $
MkLift $
MkOut x (return ())