{-# LANGUAGE DeriveAnyClass #-}
module Data.CuckooFilter.Pure (
Filter(..)
) where
import Data.CuckooFilter.Internal (Bucket, emptyBucket, Size(..), CuckooFilter(..))
import Data.Aeson (ToJSON, FromJSON)
import qualified Data.IntMap.Strict as IM
import Data.Maybe (fromMaybe)
import Data.Serialize (Serialize)
import Data.Word (Word32, Word8)
import GHC.Generics (Generic)
import Numeric.Natural (Natural)
data Filter a = F {
buckets :: IM.IntMap Bucket,
numBuckets :: !Natural,
size :: !Size
}
deriving (Show, Eq, Generic, Serialize, ToJSON, FromJSON)
instance Monad m => CuckooFilter Filter m where
initialize (Size s) = pure $
F {
buckets = IM.empty,
numBuckets = numBuckets,
size = Size s
}
where
numBuckets = s `div` 4
{-# INLINE bucketCount #-}
bucketCount F {numBuckets} = pure numBuckets
{-# INLINE writeBucket #-}
writeBucket index bucket filt@(F {buckets} )= pure $
filt {buckets = IM.insert index bucket buckets}
{-# INLINE readBucket #-}
readBucket index F {buckets} = pure . fromMaybe emptyBucket $ IM.lookup index buckets