{-# 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