SHW "bx" "bx" "ay ay[ab]bybxdbx ay" === runEff $ runSimple "b" $ runSimpleHWrapping (fmap (++ "x") act) $ doneCoroutine do
let SHW f s (Yielded () rest) =
runEff $ runSimple "a" $ runSimpleHWrapping (fmap (++ "y") act) $ runCoroutine @() @() do
first <- actH do
a <- act
() <- yield ()
b <- act
pure $ "[" ++ a ++ b ++ "]"
second <- actH $ pure "d"
pure $ first ++ second
result <- rest ()
pure $ f ++ " " ++ result ++ " " ++ s
data Simple :: Effect where
Act :: Simple m String
act :: Simple :> es => Eff lb ub es String
act = send Act
runSimple :: lb Identity => String -> Eff lb ub (Simple : es) a -> Eff lb ub es a
runSimple s = interpret \_ Act -> pure $ pure s
data SimpleH :: Effect where
ActH :: Simple :> es => Eff lb ub es String -> SimpleH (Eff lb ub es) String
runSimpleH :: lb Identity => String -> Eff lb ub (SimpleH : es) a -> Eff lb ub es a
runSimpleH s = interpret \_ (ActH action) -> pure $ fmap (++ s) action
runSimpleHWrapping :: Simple :> es => lb SHW => (forall lb ub es. Simple :> es => Eff lb ub es String) -> Eff lb ub (SimpleH : es) a -> Eff lb ub es (SHW a)
runSimpleHWrapping s = interpretW (pure . SHW "" "") (elabSimpleHWrapping s)
data SHW a = SHW String String a
deriving (Functor, Foldable, Traversable, Eq, Show)
elabSimpleHWrapping :: lb SHW => Simple :> es => (forall lb ub es. Simple :> es => Eff lb ub es String) -> HandlerW SimpleH lb ub es SHW
elabSimpleHWrapping s _ (ActH action) =
( pure
do
fi <- s
result <- action
si <- s
pure $ fi ++ result ++ si
, \act -> do
fo <- s
SHW fr sr result <- runSimpleHWrapping s act
so <- s
pure $ SHW (fo ++ fr) (sr ++ so) result
)
actH :: (SimpleH :> es, Simple :> es) => Eff lb ub es String -> Eff lb ub es String
actH action = send $ ActH action