diff --git a/Data/BloomFilter.hs b/Data/BloomFilter.hs index 2210cef..d4b324e 100644 --- a/Data/BloomFilter.hs +++ b/Data/BloomFilter.hs @@ -70,6 +70,8 @@ module Data.BloomFilter -- | The raw bit array used by the immutable 'Bloom' type. , bitArray + , serialize + , unsafeDeserialize ) where import Control.Monad (liftM, forM_) @@ -85,6 +87,9 @@ import qualified Data.BloomFilter.Mutable.Internal as MB import Data.BloomFilter.Mutable.Internal (Hash, MBloom) import Data.Word (Word32) +import Data.Serialize +import Data.ByteString (ByteString) + import Prelude hiding (elem, length, notElem, (/), (*), div, divMod, mod, rem) @@ -320,6 +325,21 @@ logPower2 k = go 0 k where go j 1 = j go j n = go (j+1) (n `shiftR` 1) +serialize :: Bloom a -> ByteString +serialize bloom = encode (shift bloom, mask bloom, bitArray bloom) + +unsafeDeserialize :: (a -> [Hash]) -> ByteString -> Either String (Bloom a) +unsafeDeserialize hashes bs = + case decode bs of + Left err -> Left err + Right (shift, mask, bitArray) -> Right $ B + { hashes = hashes + , shift = shift + , mask = mask + , bitArray = bitArray + } + + -- $overview -- -- Each of the functions for creating Bloom filters accepts two parameters: diff --git a/bloomfilter.cabal b/bloomfilter.cabal index 821a5d7..6cd6107 100644 --- a/bloomfilter.cabal +++ b/bloomfilter.cabal @@ -20,6 +20,7 @@ library array, base >= 4.4 && < 5, bytestring >= 0.9, + cereal >= 0.4, deepseq exposed-modules: Data.BloomFilter Data.BloomFilter.Easy