calamity-commands-0.1.0.0: CalamityCommands/Internal/RunIntoM.hs
{-# LANGUAGE TemplateHaskell #-}
-- | Something for converting polysemy actions into monadic actions
module CalamityCommands.Internal.RunIntoM
( runSemToM
, bindSemToM ) where
import Data.Functor
import qualified Polysemy as P
import qualified Polysemy.Final as P
runSemToM :: forall m r a. (Monad m, P.Member (P.Final m) r) => P.Sem r a -> P.Sem r (m (Maybe a))
runSemToM m = P.withStrategicToFinal $ do
m' <- P.runS m
ins <- P.getInspectorS
P.liftS $ pure (P.inspect ins <$> m')
bindSemToM :: forall m r p a. (Monad m, P.Member (P.Final m) r) => (p -> P.Sem r a) -> P.Sem r (p -> m (Maybe a))
bindSemToM m = P.withStrategicToFinal $ do
istate <- P.getInitialStateS
m' <- P.bindS m
ins <- P.getInspectorS
P.liftS $ pure (\x -> P.inspect ins <$> m' (istate $> x))