module Language.Syntactic.Analysis.Hash where
import Data.Hash
import Language.Syntactic.Syntax
import Language.Syntactic.Analysis.Equality
class ExprEq expr => ExprHash expr
where
exprHash :: expr a -> Hash
instance ExprHash dom => ExprHash (AST dom)
where
exprHash (Symbol a) = hashInt 0 `combine` exprHash a
exprHash (f :$: a) = hashInt 1 `combine` exprHash f `combine` exprHash a
instance (ExprHash expr1, ExprHash expr2) => ExprHash (expr1 :+: expr2)
where
exprHash (InjectL a) = hashInt 0 `combine` exprHash a
exprHash (InjectR a) = hashInt 1 `combine` exprHash a