úÎEĥ<ҕ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQ 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 SConstruct new valueNoneK ,ProcessSim inside Lamport clock simpulation."Lamport clock simpulation. 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 . 6 op1 op2 ==> 3 op1 . 3 op2 == 3 op2 . 3 op1 !Idempotency doesn't need to hold.24Generate an update to the local and remote replicas.Returns –- if the intended operation is not applicable.3PApply 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.4lPartial order for causal semantics. Values of some type may be ordered and causally-ordered different ways.5x 5 y means that x must go before y and y can not go before x.6*Not comparable, i. e. Ĵ(a "d b) "' Ĵ(b "d a)./1032456 45/012236/0122345NoneFT] ż789789789NoneFT!<>?>?>?None ;=>?FT]"…G*Empty order, allowing arbitrary reorderingDEFDEFDEFSafe'MA 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 == xNJust (), specialized to M.MNMNN6 None$FT.ÄQBLast 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.UInitialize stateVdChange state as CvRDT operation. Current value is ignored, because new timestamp is always greater.W Query state[See CvRDT\(Merge by choosing more recent timestamp.QRTSUVWXQRSTUVWXQRST Safe/µfXXX Internal TODO remove_`abcdef_`abcdef_` None06klmnopklnmopkl None;=0·uvwxyzuvxwzyuv Safe2ÑGrow-only counter.Increment counter‚ Initial stateƒGet value from the state„See CvRDT replica id€‚ƒ€‚ƒ€Safe$7…ˆnPositive-negative counter. Allows incrementing and decrementing. Nice example of combining of existing CvRDT (' in this case) to create another CvRDT.ŒGet value from the stateDecrement counterŽIncrement counter Initial stateSee CvRDT replica idŽ replica idˆ‰Š‹ŒŽˆ‰Š‹ŒŽˆ‰Š‹Safe+?@ABCDEFGHIJKLMNIOPQRSTUVWXYZ[\]^_   ` a  b  c d e f g h i H H    j k l m n M N o o   j  p q r s t u   j  v w x y z z {   | } ~ €€‚ƒ{„…†‡ˆ‰Š‰‹ŒŽ‘’“”crdt-5.1-KWOtOKrNUKV2cd5o9k92gl 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 runProcessSimrunLamportClock$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