subhask-0.1.0.0: src/SubHask/Compatibility/BloomFilter.hs
module SubHask.Compatibility.BloomFilter
( BloomFilter
)
where
import SubHask.Algebra
import SubHask.Category
import SubHask.Internal.Prelude
import qualified Data.BloomFilter as BF
--------------------------------------------------------------------------------
newtype BloomFilter (n::Nat) a = BloomFilter (BF.Bloom a)
mkMutable [t| forall n a. BloomFilter n a |]
type instance Scalar (BloomFilter n a) = Int
type instance Logic (BloomFilter n a) = Bool
type instance Elem (BloomFilter n a) = a
type instance SetElem (BloomFilter n a) b = BloomFilter n b
hash = undefined
instance KnownNat n => Semigroup (BloomFilter n a)
-- FIXME: need access to the underlying representation of BF.Bloom to implement
instance KnownNat n => Monoid (BloomFilter n a) where
zero = BloomFilter (BF.empty hash n)
where
n = fromInteger $ natVal (Proxy::Proxy n)
instance KnownNat n => Constructible (BloomFilter n a)
-- FIXME: need a good way to handle the hash generically
instance KnownNat n => Container (BloomFilter n a) where
elem a (BloomFilter b) = BF.elem a b
instance KnownNat n => Normed (BloomFilter n a) where
size (BloomFilter b) = BF.length b
-- formula for number of elements in a bloom filter
-- http://stackoverflow.com/questions/6099562/combining-bloom-filters
-- c = log(z / N) / ((h * log(1 - 1 / N))