-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | An approximate streaming (constant space) unique object counter -- -- This package provides an approximate streaming (constant space) unique -- object counter. -- -- See the original paper for details: -- http://algo.inria.fr/flajolet/Publications/FlFuGaMe07.pdf -- -- Notably it can be used to approximate a set of several billion -- elements with 1-2% inaccuracy in around 1.5k of memory. @package hyperloglog @version 0.4.5 module Data.HyperLogLog.Config numBuckets :: Integer -> Int smallRange :: Integer -> Double interRange :: Double rawFact :: Integer -> Double alpha :: Integer -> Double bucketMask :: Integer -> Word32 type Rank = Int8 calcBucket :: Integer -> Word32 -> Int calcRank :: Integer -> Word32 -> Int8 lim32 :: Double -- | This package provides an approximate streaming (constant space) unique -- object counter. -- -- See the original paper for details: -- http://algo.inria.fr/flajolet/Publications/FlFuGaMe07.pdf module Data.HyperLogLog.Type -- | Initialize a new counter: -- --
-- >>> runHyperLogLog (mempty :: HyperLogLog 3) == V.fromList [0,0,0,0,0,0,0,0] -- True ---- -- Please note how you specify a counter size with the n -- invocation. Sizes of up to 16 are valid, with 7 being a likely good -- minimum for decent accuracy. -- -- Let's count a list of unique items and get the latest estimate: -- --
-- >>> size (foldr insert mempty [1..10] :: HyperLogLog 4)
-- Approximate {_confidence = 0.9972, _lo = 2, _estimate = 9, _hi = 17}
--
--
-- Note how insert can be used to add new observations to the
-- approximate counter.
newtype HyperLogLog p
HyperLogLog :: Vector Rank -> HyperLogLog p
[runHyperLogLog] :: HyperLogLog p -> Vector Rank
class HasHyperLogLog a p | a -> p
hyperLogLog :: HasHyperLogLog a p => Lens' a (HyperLogLog p)
-- | Approximate size of our set
size :: Reifies p Integer => HyperLogLog p -> Approximate Int64
insert :: (Reifies s Integer, Serial a) => a -> HyperLogLog s -> HyperLogLog s
-- | Insert a value that has already been hashed by whatever user defined
-- hash function you want.
insertHash :: Reifies s Integer => Word32 -> HyperLogLog s -> HyperLogLog s
intersectionSize :: Reifies p Integer => [HyperLogLog p] -> Approximate Int64
cast :: forall p q. (Reifies p Integer, Reifies q Integer) => HyperLogLog p -> Maybe (HyperLogLog q)
-- | If two types p and q reify the same configuration,
-- then we can coerce between HyperLogLog p and
-- HyperLogLog q. We do this by building a hole in the
-- nominal role for the configuration parameter.
coerceConfig :: forall p q. (Reifies p Integer, Reifies q Integer) => Maybe (Coercion (HyperLogLog p) (HyperLogLog q))
instance forall k (p :: k). Control.DeepSeq.NFData (Data.HyperLogLog.Type.HyperLogLog p)
instance forall k (p :: k). GHC.Generics.Generic (Data.HyperLogLog.Type.HyperLogLog p)
instance forall k (p :: k). GHC.Show.Show (Data.HyperLogLog.Type.HyperLogLog p)
instance forall k (p :: k). GHC.Classes.Eq (Data.HyperLogLog.Type.HyperLogLog p)
instance forall k (p :: k). Data.HyperLogLog.Type.HasHyperLogLog (Data.HyperLogLog.Type.HyperLogLog p) p
instance forall k (p :: k). Data.Serialize.Serialize (Data.HyperLogLog.Type.HyperLogLog p)
instance forall k (p :: k). Data.Bytes.Serial.Serial (Data.HyperLogLog.Type.HyperLogLog p)
instance forall k (p :: k). Data.Binary.Class.Binary (Data.HyperLogLog.Type.HyperLogLog p)
instance forall k (p :: k). GHC.Base.Semigroup (Data.HyperLogLog.Type.HyperLogLog p)
instance forall k (p :: k). Data.Reflection.Reifies p GHC.Integer.Type.Integer => GHC.Base.Monoid (Data.HyperLogLog.Type.HyperLogLog p)
-- | See the original paper for details:
-- http://algo.inria.fr/flajolet/Publications/FlFuGaMe07.pdf
module Data.HyperLogLog
-- | Initialize a new counter:
--
-- -- >>> runHyperLogLog (mempty :: HyperLogLog 3) == V.fromList [0,0,0,0,0,0,0,0] -- True ---- -- Please note how you specify a counter size with the n -- invocation. Sizes of up to 16 are valid, with 7 being a likely good -- minimum for decent accuracy. -- -- Let's count a list of unique items and get the latest estimate: -- --
-- >>> size (foldr insert mempty [1..10] :: HyperLogLog 4)
-- Approximate {_confidence = 0.9972, _lo = 2, _estimate = 9, _hi = 17}
--
--
-- Note how insert can be used to add new observations to the
-- approximate counter.
data HyperLogLog p
class HasHyperLogLog a p | a -> p
hyperLogLog :: HasHyperLogLog a p => Lens' a (HyperLogLog p)
-- | Approximate size of our set
size :: Reifies p Integer => HyperLogLog p -> Approximate Int64
intersectionSize :: Reifies p Integer => [HyperLogLog p] -> Approximate Int64
insert :: (Reifies s Integer, Serial a) => a -> HyperLogLog s -> HyperLogLog s
-- | Insert a value that has already been hashed by whatever user defined
-- hash function you want.
insertHash :: Reifies s Integer => Word32 -> HyperLogLog s -> HyperLogLog s
cast :: forall p q. (Reifies p Integer, Reifies q Integer) => HyperLogLog p -> Maybe (HyperLogLog q)
-- | If two types p and q reify the same configuration,
-- then we can coerce between HyperLogLog p and
-- HyperLogLog q. We do this by building a hole in the
-- nominal role for the configuration parameter.
coerceConfig :: forall p q. (Reifies p Integer, Reifies q Integer) => Maybe (Coercion (HyperLogLog p) (HyperLogLog q))