packages feed

Eq-1.0: EqManips/Algorithm/Eval/Types.hs

module EqManips.Algorithm.Eval.Types( EvalOp
                                    , EvalFun
                                    , FormulOperator
                                    , EvalPredicate
                                    , FormulaEvaluator
                                    , taggedEvaluator, deTagEvaluator 
                                    ) where

import EqManips.Types
import EqManips.EvaluationContext

type EvalOp = FormulaPrim
            -> FormulaPrim
            -> EqContext (Either FormulaPrim (FormulaPrim,FormulaPrim))

-- | Type for formula evaluating functions
type EvalFun = FormulaPrim -> EqContext FormulaPrim

-- | Same as EvalFun, but is lingua franca for tagged formula.
type FormulaEvaluator = Formula ListForm -> EqContext (Formula ListForm)

-- | A low-level predicate
type EvalPredicate = FormulaPrim -> FormulaPrim -> Maybe Bool

-- | A binary operator for formula
type FormulOperator = FormulaPrim -> FormulaPrim -> FormulaPrim


-- | Transform an EvalFun to it's tagged counterpart. Just
-- to please the type system.
taggedEvaluator :: EvalFun -> FormulaEvaluator
taggedEvaluator evaluator (Formula a)= do 
    evaluated <- evaluator a
    return $ Formula evaluated

deTagEvaluator :: FormulaEvaluator -> EvalFun
deTagEvaluator eval f = do
    evaluated <- eval $ Formula f
    return $ unTagFormula evaluated