úÎBı:ω      !"#$%&'()*+,-./0123456789:;<=>?@ABCDE F G 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 querySafe·Construct new valueNoneK T Key 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]¼+,-+,-+,-NoneFT9232323None ;=>?FT] ‚;*Empty order, allowing arbitrary reordering89:89:89:Safe%AA 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 == xBJust (), specialized to A.ABABB6 None$FT,ÁEBLast 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.IInitialize stateJdChange state as CvRDT operation. Current value is ignored, because new timestamp is always greater.K Query stateOSee CvRDTP(Merge by choosing more recent timestamp.EFHGIJKLEFGHIJKLEFGH Safe-²ZXXX Internal TODO removeSTUVWXYZSTUVWXYZST None.3_`abcd_`bacd_` None;=.´ijklmnijlknmij Safe0ÎsGrow-only counter.uIncrement counterv Initial statewGet value from the statexSee CvRDTu replica idstuvwstvwustSafe$5‚|nPositive-negative counter. Allows incrementing and decrementing. Nice example of combining of existing CvRDT (s' in this case) to create another CvRDT.€Get value from the stateDecrement counter‚Increment counterƒ Initial state„See 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 A.ˆˆSafe:¨‘’“”•  !!"#$%&'()*+,-./0123456789:;<=>?@AB=CDEFGHIJKLMNOPQRS   T U  V  W X Y Z [ \ ] < <    ^ _ ` a b A B c c   ^  d e f g h i   ^  j k l m n n o   p q r sttuvwoxyz{|}~}€‚ƒ„…†‡ˆcrdt-4.1-7wARLkzAppL9WBGCjwRXuK 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.SemigroupgetMaxMaxGSetaddinitiallookupqueryProcess LamportClockPid LamportTimegetPidgetTimerunLamportClock runProcessadvancegetRealLamportTime$fShowLamportTime$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