packages feed

datalog-0.1.0.0: src/Database/Datalog/Adornment.hs

module Database.Datalog.Adornment (
  Binding(..),
  BindingPattern(..),
  Adornment(..)
  ) where

import Data.Hashable

data Binding = B {- Bound -} | F {- Free -}
             deriving (Eq, Ord, Show)

instance Hashable Binding where
  hashWithSalt s B = s `hashWithSalt` (105 :: Int)
  hashWithSalt s F = s `hashWithSalt` (709 :: Int)

newtype BindingPattern = BindingPattern { bindingPattern :: [Binding] }
                       deriving (Eq, Ord)

instance Show BindingPattern where
  show (BindingPattern bs) = concatMap show bs

instance Hashable BindingPattern where
  hashWithSalt s (BindingPattern bs) = s `hashWithSalt` bs

data Adornment = Free !Int -- ^ The index to bind a free variable
               | BoundAtom
               | Bound !Int -- ^ The index to look for the binding of this variable
               deriving (Eq, Show)

instance Hashable Adornment where
  hashWithSalt s BoundAtom = s `hashWithSalt` (7776 :: Int)
  hashWithSalt s (Free i) =
    s `hashWithSalt` (1 :: Int) `hashWithSalt` i
  hashWithSalt s (Bound i) =
    s `hashWithSalt` (2 :: Int) `hashWithSalt` i