CH:      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFG H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~Safe% Grow-only setupdateinitialization lookup querySafeConstruct new valueNoneK nKey is '. Non-present value is equivalent to 0.Unique process identifier      None7<FT%%:Operation-based, or commutative (Cm) replicated data type.Implementation;In Haskell, a CmRDT implementation consists of 3 types  a payload, an  operation (op ) and an intent. PayloadInternal state of a replica.IntentUser's request to update.Operation (Op)*Operation to be applied to other replicas.For many types  operation and intent may be the same. But for i, for instance, this rule doesn't hold: user can request only value, and type attaches a timestamp to it.)Additional constraint  commutativity law(Concurrent updates are observed equally.  " op1 op2 . , op1 op2 ==> ) op1 . ) op2 == ) op2 . ) op1 !Idempotency doesn't need to hold.(4Generate an update to the local and remote replicas.Returns - if the intended operation is not applicable.)PApply an update to the payload (downstream). An invalid update must be ignored.hTODO(Syrovetsky, 2017-12-05) There is no downstream precondition yet. We must make a test for it first.*lPartial order for causal semantics. Values of some type may be ordered and causally-ordered different ways.+x + y means that x must go before y and y can not go before x.,*Not comparable, i. e. (a "d b) "' (b "d a).%'&)(*+, *+%&'((),%&'(()*+NoneFT]-./-./-./NoneFTh454545None ;=>?FT] =*Empty order, allowing arbitrary reordering:;<:;<:;<Safe%ICA 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 == xDJust (), specialized to C.CDCDD6 None$FT,GBLast write wins. Assuming timestamp is unique. This type is both % and CvRDT.Timestamps are assumed unique, totally ordered, and consistent with causal order; i.e., if assignment 1 happened-before assignment 2, the former s timestamp is less than the latter s.KInitialize stateLdChange state as CvRDT operation. Current value is ignored, because new timestamp is always greater.M Query stateQSee CvRDTR(Merge by choosing more recent timestamp.GHJIKLMNGHIJKLMNGHIJ Safe-\XXX Internal TODO removeUVWXYZ[\UVWXYZ[\UV None.babcdefabdcefab None;=.klmnopklnmpokl Safe0uGrow-only counter.wIncrement counterx Initial stateyGet value from the statezSee CvRDTw replica iduvwxyuvxywuvSafe$5~nPositive-negative counter. Allows incrementing and decrementing. Nice example of combining of existing CvRDT (u' in this case) to create another CvRDT.Get value from the stateDecrement counterIncrement counter Initial stateSee CvRDT replica id replica id~~~Safe+: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 = 7. Some types may offer more convenient query functions.$Actually, a CvRDT is nothing more a C.Safe: !!""##$$%&'()*+,-./0123456789:;<=>?@ABCD?EFGHIJKLMNOPQRSTU   V W  X  Y Z [ \ ] ^ _ > >    ` a b c d C D e e   `  f g h i j k   `  l m n o p p q   r s t uvvwxyqz{|}~crdt-4.2-HniGcsXRWwlKEzZDAMTFSB CRDT.Cv.Max CRDT.Cv.GSetCRDT.LamportClockCRDT.CmCRDT.Cm.TwoPSet CRDT.Cm.GSetCRDT.Cm.CounterData.SemilatticeCRDT.LWWCRDT.Cv.TwoPSet CRDT.Cv.ORSetCRDT.Cv.LwwElementSetCRDT.Cv.GCounterCRDT.Cv.PNCounterCRDT.Cv CRDT.Cm.LWWLWW Semigroup<> Paths_crdtbaseData.SemigroupgetMaxMaxGSetaddinitiallookupqueryClockgetTimeadvanceProcess LamportClockPid LamportTimegetPidrunLamportClock runProcessgetRealLamportTime$fShowLamportTime$fClockProcess$fEqPid$fOrdPid $fShowPid$fEqLamportTime$fOrdLamportTime$fApplicativeLamportClock$fFunctorLamportClock$fMonadLamportClock$fApplicativeProcess$fFunctorProcess$fMonadProcessCmRDTIntentPayloadmakeOpapply CausalOrdprecedes concurrentTwoPSetAddRemove$fCausalOrdTwoPSet$fCmRDTTwoPSet $fEqTwoPSet $fShowTwoPSet$fCausalOrdGSet $fCmRDTGSet$fEqGSet $fShowGSetCounter Increment Decrement$fCausalOrdCounter$fCmRDTCounter$fBoundedCounter $fEnumCounter $fEqCounter $fShowCounter Semilatticemerge$fSemilatticeSet$fSemilatticeMaxvaluetimeassignadvanceFromLWW $fCmRDTLWW$fCausalOrdLWW$fSemilatticeLWW$fSemigroupLWW$fEqLWW $fShowLWWremove singletonisKnown$fSemilatticeTwoPSet$fSemigroupTwoPSetORSet$fSemilatticeORSet$fSemigroupORSet $fEqORSet $fShowORSet LwwElementSetLES$fSemilatticeLwwElementSet$fSemigroupLwwElementSet$fEqLwwElementSet$fShowLwwElementSetGCounter increment$fSemilatticeGCounter$fSemigroupGCounter $fEqGCounter$fShowGCounter PNCounterpositivenegative decrement$fSemilatticePNCounter$fSemigroupPNCounter $fEqPNCounter$fShowPNCounterCvRDTGHC.BaseNothingidversion getBinDir getLibDir getDynLibDir getDataDir getLibexecDir getSysconfDirgetDataFileName