packages feed

Holumbus-Searchengine-1.2.0: src/Holumbus/Index/Common/DocIdMap.hs

{-# OPTIONS -XTypeSynonymInstances -fno-warn-orphans #-}

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

{- |
  Module     : Holumbus.Index.Common.DocIdMap
  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

  DocId maps

-}

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

module Holumbus.Index.Common.DocIdMap
where

import Control.DeepSeq

import Data.Binary              ( Binary (..) )
import qualified
       Data.Binary              as B
import qualified
       Data.EnumMap             as IM

import Holumbus.Index.Common.DocId

-- import Text.XML.HXT.Core

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

type DocIdMap v                 = IM.EnumMap DocId v

emptyDocIdMap                   :: DocIdMap v
emptyDocIdMap                   = IM.empty

singletonDocIdMap               :: DocId -> v -> DocIdMap v
singletonDocIdMap d v           = insertDocIdMap d v emptyDocIdMap

nullDocIdMap                    :: DocIdMap v -> Bool
nullDocIdMap                    = IM.null

memberDocIdMap                  :: DocId -> DocIdMap v -> Bool
memberDocIdMap                  = IM.member

lookupDocIdMap                  :: DocId -> DocIdMap v -> Maybe v
lookupDocIdMap                  = IM.lookup

insertDocIdMap                  :: DocId -> v -> DocIdMap v -> DocIdMap v
insertDocIdMap                  = IM.insert

deleteDocIdMap                  :: DocId -> DocIdMap v -> DocIdMap v
deleteDocIdMap                  = IM.delete

insertWithDocIdMap              :: (v -> v -> v) -> DocId -> v -> DocIdMap v -> DocIdMap v
insertWithDocIdMap              = IM.insertWith

sizeDocIdMap                    :: DocIdMap v -> Int
sizeDocIdMap                    = IM.size

minKeyDocIdMap                  :: DocIdMap v -> DocId
minKeyDocIdMap                  = maybe nullDocId (fst . fst) . IM.minViewWithKey

maxKeyDocIdMap                  :: DocIdMap v -> DocId
maxKeyDocIdMap                  = maybe nullDocId (fst . fst) . IM.maxViewWithKey

isIntervallDocIdMap             :: DocIdMap v -> Bool
isIntervallDocIdMap m           = nullDocIdMap m
                                  ||
                                  ( fromEnum (theDocId (minKeyDocIdMap m) - theDocId (maxKeyDocIdMap m))
                                    == sizeDocIdMap m
                                  )

unionDocIdMap                   :: DocIdMap v -> DocIdMap v -> DocIdMap v
unionDocIdMap                   = IM.union

differenceDocIdMap              :: DocIdMap v -> DocIdMap v -> DocIdMap v
differenceDocIdMap              = IM.difference

unionWithDocIdMap               :: (v -> v -> v) -> DocIdMap v -> DocIdMap v -> DocIdMap v
unionWithDocIdMap               = IM.unionWith

intersectionWithDocIdMap        :: (v -> v -> v) -> DocIdMap v -> DocIdMap v -> DocIdMap v
intersectionWithDocIdMap        = IM.intersectionWith

unionsWithDocIdMap              :: (v -> v -> v) -> [DocIdMap v] -> DocIdMap v
unionsWithDocIdMap              = IM.unionsWith

mapDocIdMap                     :: (v -> r) -> DocIdMap v -> DocIdMap r
mapDocIdMap                     = IM.map

filterDocIdMap                  :: (v -> Bool) -> DocIdMap v -> DocIdMap v
filterDocIdMap                  = IM.filter

filterWithKeyDocIdMap           :: (DocId -> v -> Bool) -> DocIdMap v -> DocIdMap v
filterWithKeyDocIdMap           = IM.filterWithKey

mapWithKeyDocIdMap              :: (DocId -> v -> r) -> DocIdMap v -> DocIdMap r
mapWithKeyDocIdMap              = IM.mapWithKey

foldDocIdMap                    :: (v -> b -> b) -> b -> DocIdMap v -> b
foldDocIdMap                    = IM.fold

foldWithKeyDocIdMap             :: (DocId -> v -> b -> b) -> b -> DocIdMap v -> b
foldWithKeyDocIdMap             = IM.foldWithKey

fromListDocIdMap                :: [(DocId, v)] -> DocIdMap v
fromListDocIdMap                = IM.fromList

toListDocIdMap                  :: DocIdMap v -> [(DocId, v)]
toListDocIdMap                  = IM.toList

keysDocIdMap                    :: DocIdMap v -> [DocId]
keysDocIdMap                    = IM.keys

elemsDocIdMap                    :: DocIdMap v -> [v]
elemsDocIdMap                    = IM.elems

instance NFData v => NFData (DocIdMap v) where
    rnf m                       = rnf (IM.toList m)

instance Binary v => Binary (DocIdMap v) where
    put                         = B.put . IM.toList
    get                         = B.get >>= return . IM.fromList

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