module Calculator.Evaluator.Base (evaluate, evalTest) where -------------------------------------------------------------------------------- import Calculator.Evaluator.Statement (evalStat) import Calculator.Parser.Statement (parseStat) import Calculator.Prim.Bindings (Bindings, mkBind) import Calculator.Prim.Expr (Expr (..)) -------------------------------------------------------------------------------- import Control.Applicative ((<*)) import Data.List (nub) import Text.ParserCombinators.Parsec (eof, parse, spaces) -------------------------------------------------------------------------------- eval :: Bindings -> String -> Either Expr Bindings eval b i = case parse (spaces >> parseStat <* spaces <* eof) "Statement" i of Left e -> Left . Message . tail . lines . show $ e Right s -> evalStat b s -------------------------------------------------------------------------------- result :: Either Expr Bindings -> Either String Bindings result e = case e of Left (Constant c) -> Left $ " == " ++ show c Left (Message x) -> Left . init . unlines . map (" -!- " ++ ) . nub $ x Right b -> Right b Left _ -> Left " ~~ Erroneous Result ~~" -------------------------------------------------------------------------------- evaluate :: Bindings -> String -> Either String Bindings evaluate b s = result $ eval b s -------------------------------------------------------------------------------- evalTest :: String -> String evalTest s = case eval (mkBind [] []) s of Left (Constant n) -> show n _ -> "" --------------------------------------------------------------------------------