packages feed

g2-0.2.0.0: src/G2/Language/Monad/Primitives.hs

module G2.Language.Monad.Primitives ( mkGeE
                                              , mkGtE
                                              , mkEqE
                                              , mkNeqE
                                              , mkLtE
                                              , mkLeE
                                              , mkAndE
                                              , mkOrE
                                              , mkNotE
                                              , mkPlusE
                                              , mkMinusE
                                              , mkMultE
                                              , mkDivE
                                              , mkModE
                                              , mkNegateE
                                              , mkImpliesE
                                              , mkIffE
                                              , mkFromIntegerE
                                              , mkToIntegerE
                                              , mkEqPrimIntE
                                              , mkEqPrimFloatE
                                              , mkEqPrimDoubleE
                                              , mkEqPrimCharE ) where

import G2.Language.KnownValues
import G2.Language.Primitives
import G2.Language.Syntax
import G2.Language.Typing

import G2.Language.Monad.ExprEnv
import G2.Language.Monad.Support

mkGeE :: ExState s m => m Expr
mkGeE = appKVEEnv geFunc

mkGtE :: ExState s m => m Expr
mkGtE = appKVEEnv gtFunc

mkEqE :: ExState s m => m Expr
mkEqE = appKVEEnv eqFunc

mkNeqE :: ExState s m => m Expr
mkNeqE = appKVEEnv neqFunc

mkLtE :: ExState s m => m Expr
mkLtE = appKVEEnv ltFunc

mkLeE :: ExState s m => m Expr
mkLeE = appKVEEnv leFunc

mkAndE :: ExState s m => m Expr
mkAndE = appKVEEnv andFunc

mkOrE :: ExState s m => m Expr
mkOrE = appKVEEnv orFunc

mkNotE :: ExState s m => m Expr
mkNotE = appKVEEnv notFunc

mkPlusE :: ExState s m => m Expr
mkPlusE = appKVEEnv plusFunc

mkMinusE :: ExState s m => m Expr
mkMinusE = appKVEEnv minusFunc

mkMultE :: ExState s m => m Expr
mkMultE = appKVEEnv timesFunc

mkDivE :: ExState s m => m Expr
mkDivE = appKVEEnv divFunc

mkModE :: ExState s m => m Expr
mkModE = appKVEEnv modFunc

mkNegateE :: ExState s m => m Expr
mkNegateE = appKVEEnv negateFunc

mkImpliesE :: ExState s m => m Expr
mkImpliesE = appKVEEnv impliesFunc

mkIffE :: ExState s m => m Expr
mkIffE = appKVEEnv iffFunc

mkFromIntegerE :: ExState s m => m Expr
mkFromIntegerE = appKVEEnv fromIntegerFunc

mkToIntegerE :: ExState s m => m Expr
mkToIntegerE = appKVEEnv toIntegerFunc

appKVEEnv :: ExState s m => (KnownValues -> Name) -> m Expr
appKVEEnv f = do
    n <- return . f =<< knownValues
    e <- lookupE n
    case e of
        Just e' -> return . Var $ Id n (typeOf e')
        Nothing -> error "appKVEEnv: not found"

appKV :: ExState s m => (KnownValues -> Expr) -> m Expr
appKV f = return . f =<< knownValues

mkEqPrimIntE :: ExState s m => m Expr
mkEqPrimIntE = appKV mkEqPrimInt

mkEqPrimFloatE :: ExState s m => m Expr
mkEqPrimFloatE = appKV mkEqPrimFloat

mkEqPrimDoubleE :: ExState s m => m Expr
mkEqPrimDoubleE = appKV mkEqPrimDouble

mkEqPrimCharE :: ExState s m => m Expr
mkEqPrimCharE = appKV mkEqPrimChar