module Hunt.Index
where
import Prelude hiding (map)
import GHC.Exts (Constraint)
import Control.Arrow (second)
import qualified Data.List as L
import Hunt.Common.BasicTypes
import Hunt.Common.DocId
import Hunt.Common.DocIdSet (DocIdSet)
import qualified Hunt.Common.DocIdSet as DS
import Hunt.Common.IntermediateValue
class (IndexValue (IVal i)) => Index i where
type IKey i :: *
type IVal i :: *
type ICon i :: Constraint
type ICon i = ()
search :: ICon i => TextSearchOp -> IKey i -> i -> [(IKey i, IntermediateValue)]
searchSc :: ICon i => TextSearchOp -> IKey i -> i -> [(IKey i, (Score, IntermediateValue))]
searchSc op k ix = addDefScore $ search op k ix
lookupRange :: ICon i => IKey i -> IKey i -> i -> [(IKey i, IntermediateValue)]
lookupRangeSc :: ICon i => IKey i -> IKey i -> i -> [(IKey i, (Score, IntermediateValue))]
lookupRangeSc k1 k2 ix
= addDefScore $ lookupRange k1 k2 ix
insertList :: ICon i =>
[(IKey i, IntermediateValue)] -> i -> i
insert :: ICon i =>
IKey i -> IntermediateValue -> i -> i
insert k v = insertList [(k,v)]
deleteDocs :: ICon i => DocIdSet -> i -> i
delete :: ICon i => DocId -> i -> i
delete = deleteDocs . DS.singleton
empty :: ICon i => i
toList :: ICon i => i -> [(IKey i, IntermediateValue)]
fromList :: ICon i => [(IKey i, IntermediateValue)] -> i
unionWith :: ICon i
=> (IVal i -> IVal i -> IVal i)
-> i -> i -> i
map :: ICon i
=> (IVal i -> IVal i)
-> i -> i
map f = mapMaybe (Just . f)
mapMaybe :: ICon i
=> (IVal i -> Maybe (IVal i))
-> i -> i
keys :: ICon i
=> i -> [IKey i]
class Monad m => IndexM m i where
type IKeyM i :: *
type IValM i :: *
type IConM i :: Constraint
type IConM i = ()
searchM :: IConM i => TextSearchOp -> IKeyM i -> i -> m [(IKeyM i, IntermediateValue)]
searchMSc :: IConM i => TextSearchOp -> IKeyM i -> i -> m [(IKeyM i, (Score, IntermediateValue))]
searchMSc op k ix
= searchM op k ix >>= return . addDefScore
lookupRangeM :: IConM i => IKeyM i -> IKeyM i -> i -> m [(IKeyM i, IntermediateValue)]
lookupRangeMSc :: IConM i => IKeyM i -> IKeyM i -> i -> m [(IKeyM i, (Score, IntermediateValue))]
lookupRangeMSc k1 k2 ix
= lookupRangeM k1 k2 ix >>= return . addDefScore
insertListM :: IConM i =>
[(IKeyM i, IntermediateValue)] -> i -> m (i)
insertM :: IConM i =>
IKeyM i -> IntermediateValue -> i -> m (i)
insertM k v = insertListM [(k,v)]
deleteDocsM :: IConM i => DocIdSet -> i -> m (i)
deleteM :: IConM i => DocId -> i -> m (i)
deleteM k i = deleteDocsM (DS.singleton k) i
emptyM :: IConM i => m (i)
toListM :: IConM i => i -> m [(IKeyM i, IntermediateValue)]
fromListM :: IConM i => [(IKeyM i, IntermediateValue)] -> m (i)
unionWithM :: IConM i =>
(IValM i -> IValM i -> IValM i) ->
i -> i -> m (i)
mapM :: IConM i
=> (IValM i -> IValM i)
-> i -> m (i)
mapM f = mapMaybeM (Just . f)
mapMaybeM :: IConM i
=> (IValM i -> Maybe (IValM i))
-> i -> m (i)
keysM :: IConM i
=> i -> m [IKeyM i]
instance (Index i, Monad m) => IndexM m i where
type IKeyM i = IKey i
type IValM i = IVal i
type IConM i = ICon i
searchM op s i = return $ search op s i
searchMSc op s i = return $ searchSc op s i
lookupRangeM l u i = return $ lookupRange l u i
lookupRangeMSc l u i = return $ lookupRangeSc l u i
insertListM vs i = return $! insertList vs i
deleteDocsM ds i = return $! deleteDocs ds i
insertM k v i = return $! insert k v i
deleteM k i = return $! delete k i
emptyM = return $! empty
toListM i = return $ toList i
fromListM l = return $! fromList l
unionWithM f i1 i2 = return $! unionWith f i1 i2
mapM f i = return $! map f i
mapMaybeM f i = return $! mapMaybe f i
keysM i = return $ keys i
addDefScore :: [(a, b)] -> [(a, (Score, b))]
addDefScore = L.map (second (\ x -> (defScore, x)))