module CRDT.GCounter.Cv.Internal where

import           Data.Semigroup (Semigroup ((<>)))
import           Data.IntMap.Strict (IntMap)
import qualified Data.IntMap.Strict as IntMap

import CRDT.Cv (CvRDT)

-- | Grow-only counter.
newtype GCounter a = GCounter (IntMap a)
    deriving (Eq, Show)

instance Ord a => Semigroup (GCounter a) where
    GCounter x <> GCounter y = GCounter $ IntMap.unionWith max x y

instance Ord a => CvRDT (GCounter a)