packages feed

calculator-0.2.0.0: src/Calculator/Evaluator/Func.hs

module Calculator.Evaluator.Func where

--------------------------------------------------------------------------------

import           Calculator.Evaluator.Expr (evalExpr)
import           Calculator.Prim.Bindings  (Bindings, appendVars)
import           Calculator.Prim.Cmd       (Cmd (Func))
import           Calculator.Prim.Expr      (Expr (Constant, Message))
import           Calculator.Prim.Function  (Function, mkFuncEither)

--------------------------------------------------------------------------------

execFunc :: Bindings -> Cmd -> Function Double
execFunc b (Func _ args e) =
    mkFuncEither (length args) $ \xs ->
        case evalExpr (appendVars (zip args xs) b) e of
          Constant z -> Right z
          Message ms -> Left ms
          _          -> error "Invalid Result"
execFunc _ _            = error "Making function from invalid cmd"

--------------------------------------------------------------------------------