module Language.Syntactic.Analysis.Evaluation where
import Language.Syntactic.Syntax
class Eval expr
where
evaluate :: expr a -> a
instance Eval dom => Eval (AST dom)
where
evaluate (Symbol a) = evaluate a
evaluate (f :$: a) = evaluate f $: result (evaluate a)
instance (Eval expr1, Eval expr2) => Eval (expr1 :+: expr2)
where
evaluate (InjectL a) = evaluate a
evaluate (InjectR a) = evaluate a
evalFull :: Eval dom => ASTF dom a -> a
evalFull = result . evaluate
evalSyn :: (Syntactic a dom, Eval dom) => a -> Internal a
evalSyn = evalFull . desugar