0 | module Control.Cont.IO
2 | import Control.HigherOrder
4 | import Control.Monad.Free
7 | data HIO : (Type -> Type) -> (Type -> Type) where
8 | MkHIO : forall t. IO t -> (t -> m a) -> HIO m a
12 | hmap f (MkHIO x k) = MkHIO x (f . k)
16 | emap f (MkHIO x k) = MkHIO x (f . k)
18 | weave f hdl (MkHIO x k) =
19 | MkHIO (map (\x => map (const x) f) x)
23 | runIO : Free HIO a -> IO a
24 | runIO (Return x) = pure x
25 | runIO (Op (MkHIO x k)) = x `io_bind` runIO . k
28 | io : Syntax sig => Inj HIO sig => IO a -> Free sig a
29 | io x = inject {sub = HIO} (MkHIO x Return)