module CRDT.LWW
( LWW (..)
, point
, write
, query
) where
import Data.Semigroup (Semigroup (..))
import CRDT.Cm (CmRDT, State)
import qualified CRDT.Cm as Cm
import CRDT.Cv (CvRDT)
import CRDT.Timestamp (Timestamp)
data LWW a = Write
{ timestamp :: !Timestamp
, value :: !a
}
deriving (Eq, Ord, Show)
instance Ord a => Semigroup (LWW a) where
(<>) = max
instance Ord a => CmRDT (LWW a) where
type State (LWW a) = LWW a
update = max
instance Ord a => CvRDT (LWW a)
point :: Timestamp -> a -> LWW a
point = Write
write :: Ord a => Timestamp -> a -> LWW a -> LWW a
write t v s = Write t v <> s
query :: LWW a -> a
query = value