F=      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQR 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 =,ProcessSim inside Lamport clock simpulation."Lamport clock simpulation. Key is (. Non-present value is equivalent to 0.Unique process identifierDUnix time in 10^{-7} seconds (100 ns), as in RFC 4122 and Swarm RON.       None7<FT!&0: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 . 7 op1 op2 ==> 4 op1 . 4 op2 == 4 op2 . 4 op1 !Idempotency doesn't need to hold.34Generate an update to the local and remote replicas.Returns - if the intended operation is not applicable.4PApply 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.5lPartial order for causal semantics. Values of some type may be ordered and causally-ordered different ways.6x 6 y means that x must go before y and y can not go before x.7*Not comparable, i. e. (a "d b) "' (b "d a).02143567 56012334701233456NoneFT]!89:89:89:NoneFT"i?@?@?@None ;=>?FT]#H*Empty order, allowing arbitrary reorderingEFGEFGEFGSafe(JNA 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 == xOJust (), specialized to N.NONOO6 None$FT/RBLast write wins. Assuming timestamp is unique. This type is both 0 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.VInitialize stateWdChange state as CvRDT operation. Current value is ignored, because new timestamp is always greater.X Query state\See CvRDT](Merge by choosing more recent timestamp.RSUTVWXYRSTUVWXYRSTU Safe0gXXX Internal TODO remove`abcdefg`abcdefg`a None1clmnopqlmonpqlm None;=1vwxyz{vwyx{zvw Safe3Grow-only counter.Increment counter Initial stateGet value from the stateSee CvRDT replica idSafe$8nPositive-negative counter. Allows incrementing and decrementing. Nice example of combining of existing CvRDT (' in this case) to create another CvRDT.Get value from the stateDecrement counterIncrement counter Initial stateSee CvRDT replica id replica idSafe+=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 N.Safe= !"#$$%%&&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOJPQRSTUVWXYZ[\]^_`   a b  c  d e f g h i j I I    k l m n o N O p p   k  q r s t u v   k  w x y z { { |   } ~  |crdt-6.1-F07XvAr7meG8UhZhdUdoUG 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.SemigroupgetMaxMaxGSetaddinitiallookupquery LamportClockClockgetTimeadvanceProcessgetPid ProcessSimLamportClockSimPid LamportTime LocalTimerunLamportClockSim runProcessSimgetRealLocalTimerunLamportClock$fShowLamportTime$fProcessProcessSim$fClockProcessSim$fClockLamportClock$fProcessLamportClock$fEqPid$fOrdPid $fShowPid$fEqLamportTime$fOrdLamportTime$fApplicativeLamportClockSim$fFunctorLamportClockSim$fMonadLamportClockSim$fApplicativeProcessSim$fFunctorProcessSim$fMonadProcessSim$fApplicativeLamportClock$fFunctorLamportClock$fMonadLamportClock$fMonadIOLamportClockCmRDTIntentPayloadmakeOpapply 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