syntactic-2.0: src/Data/Syntactic/Sugar/MonadT.hs
{-# LANGUAGE UndecidableInstances #-}
-- | 'Syntactic' instance for 'Remon' using 'BindingT' to handle variable binding
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
-- | One-layer sugaring of monadic actions
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