module Model.Arithmetic (modelEval) where import Calculator.Primitives (Number) import Control.Applicative ((<*)) import Text.ParserCombinators.Parsec import Text.ParserCombinators.Parsec.Expr modelEval :: String -> Either ParseError Number modelEval = parse (expr <* eof) "expression" expr :: Parser Number expr = buildExpressionParser table factor "Expression" table :: [[ Operator Char st Number ]] table = [ [ op "^" (**) AssocRight ] , [ op "*" (*) AssocLeft, op "/" (/) AssocLeft ] , [ op "+" (+) AssocLeft, op "-" (-) AssocLeft ] ] where op s f = Infix (string s >> return f) parseFactor :: Parser Number parseFactor = do _ <- char '(' x <- expr _ <- char ')' return x factor :: Parser Number factor = parseFactor <|> number "Simple expression" number :: Parser Number number = fmap read $ do ch <- many1 digit de <- option "" $ do dot <- char '.' flt <- many1 digit return $ dot : flt return $ if null de then ch else ch ++ de