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 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" --------------------------------------------------------------------------------