packages feed

datalog-0.2.0.1: src/Database/Datalog/Relation.hs

module Database.Datalog.Relation (
  Relation(..)
  ) where

import Data.Hashable
import Data.Text ( Text, unpack )
import Text.Printf

import Database.Datalog.Adornment

-- Let Relation be user exposed, use this for internal versions:
--
-- data InternalRelation = InternalRelation BindingPattern Text
--                       | MagicRelation BindingPattern Text


-- | A wrapper to expose the relation name to callers without
-- revealing details of its implementation
data Relation = Relation Text
              | MagicRelation BindingPattern Text
              deriving (Eq, Ord)

instance Show Relation where
  show (Relation t) = unpack t
  show (MagicRelation bs t) = printf "Magic_%s[%s]" (unpack t) (show bs)

-- FIXME: May need a new relation that tracks its binding pattern,
-- too.  This is probably important for cases where the same relation
-- appears in the same body literal with different binding patterns in
-- a given rule.  These seem like they should be referencing different
-- tables...
--
-- The transformRules step will have to be the one to do the
-- translation

instance Hashable Relation where
  hashWithSalt s (Relation t) =
    s `hashWithSalt` t `hashWithSalt` (99 :: Int)
  hashWithSalt s (MagicRelation p t) =
    s `hashWithSalt` p `hashWithSalt` t `hashWithSalt` (2 :: Int)