funcons-values-0.1.0.0: src/Funcons/Operations/Eval.hs
module Funcons.Operations.Eval where
import Funcons.Operations.Expr
import Funcons.Operations.Values hiding (showArgs)
import Control.Monad
import Data.List (intercalate)
data EvalResult t = Error (OpExpr t) (Result t)
| Success t
deriving (Show)
eval :: HasValues t => OpExpr t -> EvalResult t
eval expr = applyEval expr (applyExpr expr)
applyEval :: OpExpr t -> Result t -> EvalResult t
applyEval expr (Normal v) = Success v
applyEval expr res = Error expr res
instance (HasValues t, Show t) => Show (OpExpr t) where
show (ValExpr v) = ppValues show v
show (TermExpr t) = show t
show (NullaryOp nm _) = nm
show (UnaryOp nm _ x) = nm ++ showArgs [x]
show (BinaryOp nm _ x y) = nm ++ showArgs [x,y]
show (TernaryOp nm _ x y z) = nm ++ showArgs [x,y,z]
show (NaryOp nm _ xs) = nm ++ showArgs xs
show (InvalidOp nm _ xs) = nm ++ showArgs xs
show (RewritesTo nm _ xs) = nm ++ showArgs xs
showArgs :: (HasValues t, Show t) => [OpExpr t] -> String
showArgs args = "(" ++ intercalate "," (map show args) ++ ")"