]P      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\] ^ _ ` 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 valueNone$3KjUnique process identifierDUnix time in 10^{-7} seconds (100 ns), as in RFC 4122 and Swarm RON.        None 7<FTVh$&: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).0KMake op and apply it to the payload -- a common routine at the source node. &'(+)*,-./01 ,-&'()**+./01&'()**+,-NoneFT]%234234234None$<FHTj)G:id of previous vertex,  means the beginningatomid of this vertex= means the beginningB indices in A vectorUsing  as an identifier for verticesIs added and is not removed.9:;<>=?@ABCDEF9:;<=>?@ABDFEC9:;<=>?@ABNoneFT*:NONONONone ;=>?FT]+W*Empty order, allowing arbitrary reorderingTUVTUVTUV None$;=>?K].-^+ProcessSim inside Lamport clock simulation.a!Lamport clock simulation. Key is 3. Non-present value is equivalent to (0, initial). ]^_`abcdef `ab]^_cdef^_ab Safe/|.If no key in the map then the result is empty. tuvwxyz{|} tuvwxyz{|}tu None$FT0@  Safe5OA 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 .6 None$FT]<BLast 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.Initialize statedChange state as CvRDT operation. Current value is ignored, because new timestamp is always greater. Query stateSee CvRDT(Merge by choosing more recent timestamp.Safe= XXX InternalNoneHN]BCompact version of  . For each 5, the corresponding sequence of vetices has the same Pid and sequentially growing  LocalTime", starting with the specified one.%TODO(cblp, 2018-02-06) Vector.UnboxedMReplace content with specified, applying changed found by the diff algorithm NoneCeNone;=CSafeFGrow-only counter.Increment counter Initial stateGet value from the stateSee CvRDT replica idSafe$JnPositive-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+O5State-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 .SafeO ! "#$%&'())**+,-./0123456789:;<=>?@ ABCDE"FGHIJKLMNOPQRSJTTUVWXYZ[\]^_`aIbcdefghijklmn o p o q r q s t u v w x y z { | } ~    !   @ @ ? I J   Q "    " HH MNOOYX`a ! ! "" #!crdt-8.0-BvfwJoGA18NAdrziQuhz61 CRDT.Cv.Max CRDT.Cv.GSetCRDT.LamportClockCRDT.CmCRDT.Cm.TwoPSet CRDT.Cm.RGA CRDT.Cm.GSetCRDT.Cm.CounterCRDT.LamportClock.Simulation Data.MultiMap CRDT.Cm.ORSetData.SemilatticeCRDT.LWWCRDT.Cv.TwoPSet CRDT.Cv.RGA CRDT.Cv.ORSetCRDT.Cv.LwwElementSetCRDT.Cv.GCounterCRDT.Cv.PNCounterCRDT.Cv CRDT.Cm.LWWLWW Semigroup<> Paths_crdtbaseData.SemigroupgetMaxMaxGSetaddinitiallookupquery LamportClockClockgetTimeadvanceProcessgetPidPid LamportTime LocalTimegetRealLocalTimerunLamportClock$fShowLamportTime$fProcessStateT$fProcessReaderT $fClockStateT$fClockReaderT$fClockLamportClock$fProcessLamportClock$fEqPid$fOrdPid $fShowPid$fEqLamportTime$fOrdLamportTime$fApplicativeLamportClock$fFunctorLamportClock$fMonadLamportClock$fMonadIOLamportClockCmRDTIntentPayloadmakeOpapply CausalOrdprecedes concurrentmakeAndApplyOpmakeAndApplyOpsTwoPSetAddRemove$fCausalOrdTwoPSet$fCmRDTTwoPSet $fEqTwoPSet $fShowTwoPSetRGA OpAddAfterOpRemove RgaIntentAddAfter RgaPayloadvertices vertexIxstoVector fromStringtoStringload $fCmRDTRGA$fCausalOrdRGA$fEqRgaPayload$fShowRgaPayload$fShowRgaIntent$fEqRGA $fShowRGA$fCausalOrdGSet $fCmRDTGSet$fEqGSet $fShowGSetCounter Increment Decrement$fCausalOrdCounter$fCmRDTCounter$fBoundedCounter $fEnumCounter $fEqCounter $fShowCounter ProcessSim ProcessSimTLamportClockSimLamportClockSimTrunLamportClockSimrunLamportClockSimT runProcessSimrunProcessSimT$fMonadFailLamportClockSimT$fMonadTransLamportClockSimT$fClockProcessSimT$fProcessProcessSimT$fMonadTransProcessSimT$fApplicativeLamportClockSimT$fFunctorLamportClockSimT$fMonadLamportClockSimT$fMonadErrorLamportClockSimT$fApplicativeProcessSimT$fFunctorProcessSimT$fMonadProcessSimT$fMonadFailProcessSimTMultiMapassocsdelete deleteManyemptyinsertkeysSet singleton $fEqMultiMap$fShowMultiMapTagelementsversionORSetOpAdd $fShowTag$fCausalOrdORSet $fCmRDTORSet $fShowIntent$fEqTag$fOrdTag $fShowORSet $fEqPayload $fShowPayload Semilatticemerge$fSemilatticeSet$fSemilatticeMaxvaluetime initializeassignadvanceFromLWW $fCmRDTLWW$fCausalOrdLWW$fSemilatticeLWW$fSemigroupLWW$fEqLWW $fShowLWWmemberremoveisKnown$fSemilatticeTwoPSet$fSemigroupTwoPSet RgaPacked RgaStringtoListfromListeditpackunpack $fMonoidRGA$fSemilatticeRGA$fSemigroupRGA$fSemilatticeORSet$fSemigroupORSet $fEqORSet LwwElementSetLES$fSemilatticeLwwElementSet$fSemigroupLwwElementSet$fEqLwwElementSet$fShowLwwElementSetGCounter increment$fSemilatticeGCounter$fSemigroupGCounter $fEqGCounter$fShowGCounter PNCounterpositivenegative decrement$fSemilatticePNCounter$fSemigroupPNCounter $fEqPNCounter$fShowPNCounterCvRDTGHC.BaseNothingVertexIdid getBinDir getLibDir getDynLibDir getDataDir getLibexecDir getSysconfDirgetDataFileName