module Language.Embedded.Traversal where
import Control.Monad.Operational.Higher
import Control.Monads
class DryInterp instr
where
dryInterp :: MonadSupply m => instr m a -> m a
observe_ :: (DryInterp instr, HFunctor instr, MonadSupply m)
=> (forall a . instr m a -> a -> m ())
-> Program instr a
-> m a
observe_ obs = interpretWithMonad $ \i -> do
a <- dryInterp i
obs i a
return a
observe :: (DryInterp instr, HFunctor instr, MonadSupply m)
=> (forall a . instr m a -> a -> m a)
-> Program instr a
-> m a
observe obs = interpretWithMonad $ \i -> do
a <- dryInterp i
obs i a
instance (DryInterp i1, DryInterp i2) => DryInterp (i1 :+: i2)
where
dryInterp (Inl i) = dryInterp i
dryInterp (Inr i) = dryInterp i