{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
module CRDT.Cm.Counter
( Counter (..)
) where
import CRDT.Cm (CausalOrd (..), CmRDT (..))
data Counter a = Increment | Decrement
deriving (Bounded, Enum, Eq, Show)
instance (Num a, Eq a) => CmRDT (Counter a) where
type Payload (Counter a) = a
initial = 0
apply = \case
Increment -> (+ 1)
Decrement -> subtract 1
instance CausalOrd (Counter a) where
precedes _ _ = False