calculator-0.2.0.0: src/Calculator/Prim/Expr.hs
module Calculator.Prim.Expr
( Expr (..)
, Operator (..)
, constEq
, isConst
, joinMessage
) where
--------------------------------------------------------------------------------
-- | Represents an expression-tree
data Expr = Constant Double
| Call String [Expr]
| UnOp Operator Expr
| BinOp (Expr, [(Operator, Expr)])
| Variable String
| Message [String]
-- | Represents an operator
data Operator = UnaryOp (Double -> Double)
| BinaryOp (Double -> Double -> Double)
--------------------------------------------------------------------------------
-- | Check whether two expressions are the same numeric value
-- assuming they have been evaluated fully
constEq :: Expr -> Expr -> Bool
constEq (Constant x) (Constant y) = x == y
constEq _ _ = False
--------------------------------------------------------------------------------
-- | Checks whether an expression is a constant
isConst :: Expr -> Bool
isConst (Constant _) = True
isConst _ = False
--------------------------------------------------------------------------------
joinMessage :: Expr -> Expr -> Expr
joinMessage (Message e1) (Message e2) = Message (e1 ++ e2)
joinMessage m@(Message _) _ = m
joinMessage _ m@(Message _) = m
joinMessage _ _ = error "joinMessage used on non-message Expr"
--------------------------------------------------------------------------------