module Control.Monad.Hefty.Coroutine (
module Control.Monad.Hefty.Coroutine,
module Data.Effect.Coroutine,
module Data.Effect.Input,
module Data.Effect.Output,
)
where
import Control.Monad.Hefty (Eff, FOEs, interpretBy)
import Data.Effect.Coroutine
import Data.Effect.Input
import Data.Effect.Output
runCoroutine
:: forall ans a b es
. (FOEs es)
=> Eff (Yield a b ': es) ans
-> Eff es (Status (Eff es) a b ans)
runCoroutine :: forall ans a b (es :: [Effect]).
FOEs es =>
Eff (Yield a b : es) ans -> Eff es (Status (Eff es) a b ans)
runCoroutine = (ans -> Eff es (Status (Eff Freer es) a b ans))
-> AlgHandler
(Yield a b)
(Eff (Yield a b : es))
(Eff Freer es)
(Status (Eff Freer es) a b ans)
-> Eff (Yield a b : es) ans
-> Eff es (Status (Eff Freer es) a b ans)
forall (e :: Effect) (es :: [Effect]) ans a.
(KnownOrder e, FOEs es) =>
(a -> Eff es ans)
-> AlgHandler e (Eff (e : es)) (Eff es) ans
-> Eff (e : es) a
-> Eff es ans
interpretBy (Status (Eff Freer es) a b ans
-> Eff es (Status (Eff Freer es) a b ans)
forall a. a -> Eff Freer es a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Status (Eff Freer es) a b ans
-> Eff es (Status (Eff Freer es) a b ans))
-> (ans -> Status (Eff Freer es) a b ans)
-> ans
-> Eff es (Status (Eff Freer es) a b ans)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ans -> Status (Eff Freer es) a b ans
forall (f :: * -> *) a b r. r -> Status f a b r
Done) (\(Yield a
a) x -> Eff es (Status (Eff Freer es) a b ans)
k -> Status (Eff Freer es) a b ans
-> Eff es (Status (Eff Freer es) a b ans)
forall a. a -> Eff Freer es a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Status (Eff Freer es) a b ans
-> Eff es (Status (Eff Freer es) a b ans))
-> Status (Eff Freer es) a b ans
-> Eff es (Status (Eff Freer es) a b ans)
forall a b. (a -> b) -> a -> b
$ a
-> (b -> Eff es (Status (Eff Freer es) a b ans))
-> Status (Eff Freer es) a b ans
forall (f :: * -> *) a b r.
a -> (b -> f (Status f a b r)) -> Status f a b r
Continue a
a b -> Eff es (Status (Eff Freer es) a b ans)
x -> Eff es (Status (Eff Freer es) a b ans)
k)
{-# INLINE runCoroutine #-}