packages feed

syntactic-0.7: Language/Syntactic/Constructs/Monad.hs

-- | Monadic constructs

module Language.Syntactic.Constructs.Monad where



import Control.Monad

import Language.Syntactic
import Language.Syntactic.Constructs.Symbol

import Data.Proxy



data MONAD m a
  where
    Return :: MONAD m (a    :-> Full (m a))
    Bind   :: MONAD m (m a  :-> (a -> m b) :-> Full (m b))
    Then   :: MONAD m (m a  :-> m b        :-> Full (m b))
    When   :: MONAD m (Bool :-> m ()       :-> Full (m ()))

instance WitnessCons (MONAD m)
  where
    witnessCons Return = ConsWit
    witnessCons Bind   = ConsWit
    witnessCons Then   = ConsWit
    witnessCons When   = ConsWit

instance MaybeWitnessSat ctx (MONAD m)
  where
    maybeWitnessSat _ _ = Nothing

instance Monad m => IsSymbol (MONAD m)
  where
    toSym Return = Sym "return" return
    toSym Bind   = Sym "bind"   (>>=)
    toSym Then   = Sym "then"   (>>)
    toSym When   = Sym "when"   when

instance Monad m => ExprEq (MONAD m) where exprEq = exprEqSym; exprHash = exprHashSym
instance Monad m => Render (MONAD m) where renderPart = renderPartSym
instance Monad m => Eval   (MONAD m) where evaluate   = evaluateSym
instance Monad m => ToTree (MONAD m)

-- | Projection with explicit monad type
prjMonad :: (MONAD m :<: sup) => Proxy (m ()) -> sup a -> Maybe (MONAD m a)
prjMonad _ = project