úÎ">;           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : SafeA semilattice.EIt may be a join-semilattice, or meet-semilattice, it doesn't matter.#If it matters for you, use package lattices.In addition to ; , Semilattice defines this laws:  commutativity x < y == y < x idempotency x < x == xJust (), specialized to .6SafeSafe*5State-based, or convergent (Cv) replicated data type.!Update is any function modifying state.GQuery function is not needed. State itself is exposed. In other words, query = =.$Actually, a CvRDT is nothing more a .SafeGrow-only counter.Safe Increment counter  Initial state Get value from the state  replica id    Safe  Grow-only set    Safeupdateinitialization  SafenPositive-negative counter. Allows incrementing and decrementing. Nice example of combining of existing CvRDT (' in this case) to create another CvRDT. Safe#Get value from the stateDecrement counterIncrement counter Initial state replica id replica id SafeDR:Operation-based, or commutative (Cm) replicated data type. Commutativity law   op1 .   op2 ==   op2 .   op1!Idempotency doesn't need to hold.The type of the target value Apply operation to a value    SafeDR!Grow-only counter.Commutativity: " obviously commutes with itself.# Initial state!"#$!"#!"#!"#$ SafeDR&0Last write wins. Interesting, this type is both  and .*Initialize state+ Change state, Query state/(Merge by choosing more recent timestamp. &'()*+,-./&'()*+,&'()*+,&'()*+,-./ SafeDR[3@Positive-negative counter. Allows incrementing and decrementing.6 Initial state345673456345634567> !"#$%  &   ' ( )  *  +  , - . / 0 1  2 3 4 5 6 7  * 8  9 : ; %<=<=<>?@crdt-0.5-Ay6atAKlELPILtt5U364stData.SemilatticeCRDT.TimestampCRDT.CvCRDT.GCounter.Cv.InternalCRDT.GCounter.CvCRDT.GSet.Cv.Internal CRDT.GSet.CvCRDT.PNCounter.Cv.InternalCRDT.PNCounter.CvCRDT.CmCRDT.GCounter.CmCRDT.LWWCRDT.PNCounter.Cm Semigroup<> Semilatticeslappend TimestampCvRDTGCounter$fSemilatticeGCounter$fSemigroupGCounter $fEqGCounter$fShowGCounter incrementinitialqueryGSet$fSemilatticeSetadd PNCounterpositivenegative$fSemilatticePNCounter$fSemigroupPNCounter $fEqPNCounter$fShowPNCounter decrementCmRDTStateupdate Increment$fCmRDTGCounterLWWWrite timestampvaluepointwrite$fSemilatticeLWW $fCmRDTLWW$fSemigroupLWW$fEqLWW$fOrdLWW $fShowLWW Decrement$fCmRDTPNCounter$fBoundedPNCounter$fEnumPNCounterbaseData.SemigroupGHC.Baseid