{-# LANGUAGE GeneralizedNewtypeDeriving #-}

-- ----------------------------------------------------------------------------

{- |
  Module     : Holumbus.Index.Common.DocId
  Copyright  : Copyright (C) 2011 Sebastian M. Schlatt, Timo B. Huebel, Uwe Schmidt
  License    : MIT

  Maintainer : Timo B. Huebel (tbh@holumbus.org)
  Stability  : experimental
  Portability: none portable

  The document identifier type DocId

-}

-- ----------------------------------------------------------------------------

module Holumbus.Index.Common.DocId
where

import Control.DeepSeq

import Data.Binary              ( Binary (..) )
import qualified
       Data.Binary              as B
import Data.Int                ( Int64 )

import Text.XML.HXT.Core

-- ------------------------------------------------------------

-- | The unique identifier of a document
-- (created upon insertion into the document table).

newtype DocId                   = DocId { theDocId :: Int64 }
                                  deriving (Eq, Ord, Enum, NFData)

instance Show DocId where
    show                        = show . theDocId
    {-# INLINE show #-}

instance Binary DocId where
    put                         = B.put . theDocId
    get                         = B.get >>= return . DocId
    {-# INLINE put #-}
    {-# INLINE get #-}

incrDocId                       :: DocId -> DocId
incrDocId                       = DocId . (1+) . theDocId

addDocId                        :: DocId -> DocId -> DocId
addDocId id1 id2                = DocId $ theDocId id1 + theDocId id2

subDocId                        :: DocId -> DocId -> DocId
subDocId id1 id2                = DocId $ theDocId id1 - theDocId id2

nullDocId                       :: DocId
nullDocId                       = DocId 0

firstDocId                      :: DocId
firstDocId                      = DocId 1

mkDocId                         :: Integer -> DocId
mkDocId                         = DocId . fromIntegral

xpDocId                         :: PU DocId
xpDocId                         = xpWrap (DocId, theDocId) xpPrim

{-# INLINE incrDocId #-}
{-# INLINE addDocId #-}
{-# INLINE subDocId #-}
{-# INLINE nullDocId #-}
{-# INLINE firstDocId #-}
{-# INLINE mkDocId #-}

-- ------------------------------------------------------------