module CRDT.Cm.TPSet
( TPSet (..)
, updateAtSource
, updateDownstream
) where
import Data.Set (Set)
import qualified Data.Set as Set
import CRDT.Cm (CausalOrd (..), CmRDT (..))
data TPSet a = Add a | Remove a
deriving (Eq, Show)
instance Ord a => CmRDT (TPSet a) where
type Payload (TPSet a) = Set a
updateAtSourcePre op payload = case op of
Add _ -> True
Remove a -> Set.member a payload
updateDownstream = \case
Add a -> Set.insert a
Remove a -> Set.delete a
instance Eq a => CausalOrd (TPSet a) where
Remove a `before` Add b = a == b
_ `before` _ = False