{-# LANGUAGE TypeFamilies #-}

module CRDT.Cm.GSet
    ( GSet (..)
    ) where

import           Data.Set (Set)
import qualified Data.Set as Set

import           CRDT.Cm (CausalOrd (..), CmRDT (..))

newtype GSet a = Add a
    deriving (GSet a -> GSet a -> Bool
(GSet a -> GSet a -> Bool)
-> (GSet a -> GSet a -> Bool) -> Eq (GSet a)
forall a. Eq a => GSet a -> GSet a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GSet a -> GSet a -> Bool
$c/= :: forall a. Eq a => GSet a -> GSet a -> Bool
== :: GSet a -> GSet a -> Bool
$c== :: forall a. Eq a => GSet a -> GSet a -> Bool
Eq, Int -> GSet a -> ShowS
[GSet a] -> ShowS
GSet a -> String
(Int -> GSet a -> ShowS)
-> (GSet a -> String) -> ([GSet a] -> ShowS) -> Show (GSet a)
forall a. Show a => Int -> GSet a -> ShowS
forall a. Show a => [GSet a] -> ShowS
forall a. Show a => GSet a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GSet a] -> ShowS
$cshowList :: forall a. Show a => [GSet a] -> ShowS
show :: GSet a -> String
$cshow :: forall a. Show a => GSet a -> String
showsPrec :: Int -> GSet a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> GSet a -> ShowS
Show)

instance Ord a => CmRDT (GSet a) where
    type Payload (GSet a) = Set a

    initial :: Payload (GSet a)
initial = Payload (GSet a)
forall a. Set a
Set.empty

    apply :: GSet a -> Payload (GSet a) -> Payload (GSet a)
apply (Add a
a) = a -> Set a -> Set a
forall a. Ord a => a -> Set a -> Set a
Set.insert a
a

instance CausalOrd (GSet a) where
    precedes :: GSet a -> GSet a -> Bool
precedes GSet a
_ GSet a
_ = Bool
False