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 :<: dom) => a -> ASTF dom a
lit = inject . Literal
litSyn
:: ( Eq (Internal a)
, Show (Internal a)
, Syntactic a dom
, Literal :<: dom
)
=> Internal a -> a
litSyn = sugar . inject . Literal