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 ef es String
act = send Act
runSimple :: ef Identity => String -> Eff ef (Simple : es) a -> Eff ef es a
runSimple s = interpret \_ Act -> pure $ pure s
data SimpleH :: Effect where
ActH :: Simple :> es => Eff ef es String -> SimpleH (Eff ef es) String
runSimpleH :: ef Identity => String -> Eff ef (SimpleH : es) a -> Eff ef es a
runSimpleH s = interpret \_ (ActH action) -> pure $ fmap (++ s) action
runSimpleHWrapping :: Simple :> es => ef SHW => (forall ef es. Simple :> es => Eff ef es String) -> Eff ef (SimpleH : es) a -> Eff ef es (SHW a)
runSimpleHWrapping s = interpretW (pure . SHW "" "") (elabSimpleHWrapping s)
data SHW a = SHW String String a
deriving (Functor, Foldable, Traversable, Eq, Show)
elabSimpleHWrapping :: ef SHW => Simple :> es => (forall ef es. Simple :> es => Eff ef es String) -> HandlerW SimpleH ef es SHW
elabSimpleHWrapping s _ (ActH action) = do
fo <- s
pure
( do
fi <- s
result <- action
si <- s
pure $ fi ++ result ++ si
, \act -> do
SHW fr sr result <- runSimpleHWrapping s act
so <- s
pure $ SHW (fo ++ fr) (sr ++ so) result
)
actH :: (SimpleH :> es, Simple :> es) => Eff ef es String -> Eff ef es String
actH action = send $ ActH action