crdt-0.3: lib/CRDT/GCounter/Cv.hs
module CRDT.GCounter.Cv
( GCounter
, initial
, query
-- * Operation
, increment
) where
import qualified Data.IntMap.Strict as IntMap
import CRDT.GCounter.Cv.Internal
-- | Increment counter
increment
:: Num a
=> Word -- ^ replica id
-> GCounter a
-> GCounter a
increment replicaId (GCounter imap) = GCounter (IntMap.insertWith (+) i 1 imap)
where
i = fromIntegral replicaId
-- | Initial state
initial :: GCounter a
initial = GCounter IntMap.empty
-- | Get value from the state
query :: Num a => GCounter a -> a
query (GCounter v) = mapSum v
where
mapSum = IntMap.foldr (+) 0