module Language.Syntactic.Features.Literal where
import Data.Typeable
import Data.Hash
import Language.Syntactic.Syntax
import Language.Syntactic.Analysis.Equality
import Language.Syntactic.Analysis.Render
import Language.Syntactic.Analysis.Evaluation
import Language.Syntactic.Analysis.Hash
data Literal a
where
Literal :: (Eq a, Show a, Typeable a) => a -> Literal (Full a)
instance ExprEq Literal
where
Literal a `exprEq` Literal b = case cast a of
Just a' -> a'==b
Nothing -> False
instance Render Literal
where
render (Literal a) = show a
instance ToTree Literal
instance Eval Literal
where
evaluate (Literal a) = consEval a
instance ExprHash Literal
where
exprHash (Literal a) = hash (show a)
lit :: (Eq a, Show a, Typeable a, Literal :<: expr) => a -> ASTF expr a
lit = inject . Literal