-- SPDX-License-Identifier: MPL-2.0

module Control.Monad.Hefty.Coroutine where

import Control.Monad.Hefty.Interpret (interpretBy)
import Control.Monad.Hefty.Types (Eff)
import Data.Effect.Coroutine (Status (Continue, Done), Yield (Yield))

runCoroutine
    :: forall a b ans r
     . Eff '[] (Yield a b ': r) ans
    -> Eff '[] r (Status (Eff '[] r) a b ans)
runCoroutine :: forall a b ans (r :: [* -> *]).
Eff '[] (Yield a b : r) ans
-> Eff '[] r (Status (Eff '[] r) a b ans)
runCoroutine = (ans -> Eff '[] r (Status (Eff '[] r) a b ans))
-> Interpreter (Yield a b) (Eff '[] r) (Status (Eff '[] r) a b ans)
-> Eff '[] (Yield a b : r) ans
-> Eff '[] r (Status (Eff '[] r) a b ans)
forall (e :: * -> *) (ef :: [* -> *]) ans a.
(a -> Eff '[] ef ans)
-> Interpreter e (Eff '[] ef) ans
-> Eff '[] (e : ef) a
-> Eff '[] ef ans
interpretBy (Status (Eff '[] r) a b ans
-> Eff '[] r (Status (Eff '[] r) a b ans)
forall a. a -> Eff '[] r a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Status (Eff '[] r) a b ans
 -> Eff '[] r (Status (Eff '[] r) a b ans))
-> (ans -> Status (Eff '[] r) a b ans)
-> ans
-> Eff '[] r (Status (Eff '[] r) a b ans)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ans -> Status (Eff '[] r) a b ans
forall (f :: * -> *) a b r. r -> Status f a b r
Done) (\(Yield a
a) x -> Eff '[] r (Status (Eff '[] r) a b ans)
k -> Status (Eff '[] r) a b ans
-> Eff '[] r (Status (Eff '[] r) a b ans)
forall a. a -> Eff '[] r a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Status (Eff '[] r) a b ans
 -> Eff '[] r (Status (Eff '[] r) a b ans))
-> Status (Eff '[] r) a b ans
-> Eff '[] r (Status (Eff '[] r) a b ans)
forall a b. (a -> b) -> a -> b
$ a
-> (b -> Eff '[] r (Status (Eff '[] r) a b ans))
-> Status (Eff '[] r) 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 '[] r (Status (Eff '[] r) a b ans)
x -> Eff '[] r (Status (Eff '[] r) a b ans)
k)