-- | Literal expressions module Language.Syntactic.Constructs.Literal where import Data.Typeable import Data.Hash import Language.Syntactic data Literal sig where Literal :: (Eq a, Show a, Typeable a) => a -> Literal (Full a) instance Constrained Literal where {-# SPECIALIZE instance Constrained Literal #-} {-# INLINABLE exprDict #-} type Sat Literal = Eq :/\: Show :/\: Typeable :/\: Top exprDict (Literal _) = Dict instance Equality Literal where {-# INLINABLE equal #-} {-# INLINABLE exprHash #-} Literal a `equal` Literal b = case cast a of Just a' -> a'==b Nothing -> False exprHash (Literal a) = hash (show a) instance Render Literal where {-# INLINABLE renderSym #-} renderSym (Literal a) = show a instance StringTree Literal instance Eval Literal where {-# SPECIALIZE instance Eval Literal #-} {-# INLINABLE evaluate #-} evaluate (Literal a) = a