hyperloglog-0.4.1: An approximate streaming (constant space) unique object counter

Copyright(c) Edward Kmett 2013-2015
LicenseBSD3
MaintainerEdward Kmett <ekmett@gmail.com>
Stabilityexperimental
Portabilitynon-portable
Safe HaskellNone
LanguageHaskell98

Data.HyperLogLog.Type

Contents

Description

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

Synopsis

HyperLogLog

newtype HyperLogLog p Source #

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.

Constructors

HyperLogLog 

Instances

HasHyperLogLog k (HyperLogLog k p) p Source # 
Eq (HyperLogLog k p) Source # 

Methods

(==) :: HyperLogLog k p -> HyperLogLog k p -> Bool #

(/=) :: HyperLogLog k p -> HyperLogLog k p -> Bool #

Show (HyperLogLog k p) Source # 

Methods

showsPrec :: Int -> HyperLogLog k p -> ShowS #

show :: HyperLogLog k p -> String #

showList :: [HyperLogLog k p] -> ShowS #

Generic (HyperLogLog k p) Source # 

Associated Types

type Rep (HyperLogLog k p) :: * -> * #

Methods

from :: HyperLogLog k p -> Rep (HyperLogLog k p) x #

to :: Rep (HyperLogLog k p) x -> HyperLogLog k p #

Semigroup (HyperLogLog k p) Source # 

Methods

(<>) :: HyperLogLog k p -> HyperLogLog k p -> HyperLogLog k p #

sconcat :: NonEmpty (HyperLogLog k p) -> HyperLogLog k p #

stimes :: Integral b => b -> HyperLogLog k p -> HyperLogLog k p #

Reifies k p Integer => Monoid (HyperLogLog k p) Source # 

Methods

mempty :: HyperLogLog k p #

mappend :: HyperLogLog k p -> HyperLogLog k p -> HyperLogLog k p #

mconcat :: [HyperLogLog k p] -> HyperLogLog k p #

Binary (HyperLogLog k p) Source # 

Methods

put :: HyperLogLog k p -> Put #

get :: Get (HyperLogLog k p) #

putList :: [HyperLogLog k p] -> Put #

Serial (HyperLogLog k p) Source # 

Methods

serialize :: MonadPut m => HyperLogLog k p -> m () #

deserialize :: MonadGet m => m (HyperLogLog k p) #

Serialize (HyperLogLog k p) Source # 

Methods

put :: Putter (HyperLogLog k p) #

get :: Get (HyperLogLog k p) #

NFData (HyperLogLog k p) Source # 

Methods

rnf :: HyperLogLog k p -> () #

type Rep (HyperLogLog k p) Source # 
type Rep (HyperLogLog k p) = D1 (MetaData "HyperLogLog" "Data.HyperLogLog.Type" "hyperloglog-0.4.1-6bdlExmiJ8kIRjufpXgd0B" True) (C1 (MetaCons "HyperLogLog" PrefixI True) (S1 (MetaSel (Just Symbol "runHyperLogLog") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (Vector Rank))))

class HasHyperLogLog a p | a -> p where Source #

Minimal complete definition

hyperLogLog

Instances

size :: Reifies p Integer => HyperLogLog p -> Approximate Int64 Source #

Approximate size of our set

insertHash :: Reifies s Integer => Word32 -> HyperLogLog s -> HyperLogLog s Source #

Insert a value that has already been hashed by whatever user defined hash function you want.

coerceConfig :: forall p q. (Reifies p Integer, Reifies q Integer) => Maybe (Coercion (HyperLogLog p) (HyperLogLog q)) Source #

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.