packages feed

calculator-0.1.5.4: src/Calculator/Evaluator/Cmd.hs

module Calculator.Evaluator.Cmd (evalCmd) where

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

import           Calculator.Evaluator.Expr (evalExpr)
import           Calculator.Evaluator.Func (mkFun)
import           Calculator.Help           (help)
import           Calculator.Prim.Cmd       (Cmd (..))
import           Calculator.Prim.Expr      (Bindings, Expr (Message, Constant),
                                            addFun, addVar, defBinds)

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

evalCmd :: Bindings -> Cmd -> Either [String] Bindings
evalCmd _ (Help)         = Left help
evalCmd _ (Reset)        = Right defBinds
evalCmd b (Assign s e)   =
    case evalExpr b e of
      Message xxs -> Left xxs
      Constant c  -> Right $ addVar (s, c) b
      _           -> Left [" ~~ Erroneous Result ~~ "]
evalCmd b f@(Func i _ _) = Right $ addFun (i, mkFun b f) b

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