packages feed

calculator-0.2.0.0: src/Model/Arithmetic.hs

module Model.Arithmetic (modelEval) where

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

import           Calculator.Parser.Base             (parseNumber)

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

import           Control.Applicative                ((<*))
import           Text.ParserCombinators.Parsec
import           Text.ParserCombinators.Parsec.Expr

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

modelEval :: String -> String
modelEval inp = case parse (expr <* eof) "Expression" inp of
                  Left _  -> ""
                  Right n -> show n

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

expr :: Parser Double
expr = buildExpressionParser table factor <?> "Expression"

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

table :: [[ Operator Char st Double ]]
table = [ [ op "^" (**) AssocRight ]
        , [ op "*" (*) AssocLeft, op "/" (/) AssocLeft ]
        , [ op "+" (+) AssocLeft, op "-" (-) AssocLeft ]
        ]
  where op s f = Infix (string s >> return f)

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

parseFactor :: Parser Double
parseFactor = do
  _ <- char '('
  x <- expr
  _ <- char ')'
  return x

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

factor :: Parser Double
factor = parseFactor <|> parseNumber

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