module Data.Syntactic.Sugar.MonadT where
import Control.Monad.Cont
import Data.Typeable
import Data.Syntactic
import Data.Syntactic.Functional
import Data.Syntactic.Sugar.BindingT
sugarMonad :: (BindingT :<: sym, Typeable a) => ASTF sym (m a) -> Remon sym m (ASTF sym a)
sugarMonad ma = Remon $ cont $ sugarSym Bind ma
instance
( Syntactic a
, Domain a ~ sym
, BindingT :<: sym
, MONAD m :<: sym
, Monad m
, Typeable (Internal a)
) =>
Syntactic (Remon sym m a)
where
type Domain (Remon sym m a) = sym
type Internal (Remon sym m a) = m (Internal a)
desugar = desugarMonad . fmap desugar
sugar = fmap sugar . sugarMonad