úÎ] +      !"#$%& ' ( ) * Safe5State-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 = +.Laws:  commutativity x , y == y , x idempotency x , x == xNoneGrow-only counter.NoneIncrement counter Initial stateGet value from the state replica idNone nPositive-negative counter. Allows incrementing and decrementing. Nice example of combining of existing CvRDT (' in this case) to create another CvRDT.      None#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 .  op1The type of the target valueApply operation to a value(Build state from a series of operations.SafeDRGrow-only counter.Commutativity:  obviously commutes with itself. Initial stateSafeDR0Last write wins. Interesting, this type is both  and . !"#   !"# SafeDR[&@Positive-negative counter. Allows incrementing and decrementing.) Initial state&'()*&'()&'()&'()*-       !"#$%&'   (  )*+,*-./crdt-0.1-9gjeq8et7IHHhs2SKKlnBLCRDT.CvCRDT.GCounter.Cv.InternalCRDT.GCounter.CvCRDT.PNCounter.Cv.InternalCRDT.PNCounter.CvCRDT.CmCRDT.GCounter.CmCRDT.LWWCRDT.PNCounter.CmCvRDTGCounter$fCvRDTGCounter$fSemigroupGCounter $fEqGCounter incrementinitialquery PNCounterpositivenegative$fCvRDTPNCounter$fSemigroupPNCounter $fEqPNCounter decrementCmRDTStateupdate Increment$fCmRDTGCounterLWWWrite timestampvalue Timestamp $fCvRDTLWW $fCmRDTLWW$fSemigroupLWW$fEqLWW$fOrdLWW Decrement$fCmRDTPNCounterbaseGHC.BaseidData.Semigroup<>