CRDTs are useful for synchronizing data which eventually converges to a consistent state. CRDTs can be useful when nodes/replicas may not be able to directly communicate with each other. CRDTs can be used instead of an always active foreground synchronization protocol.
Swift Package Manager
Add this package to your
dependencies and target's
import PackageDescription let package = Package( name: "Example", dependencies: [ .package( url: "https://github.com/bluk/CRDT", from: "0.1.0" ), ], targets: [ .target( name: "YourProject", dependencies: ["CRDT"] ) ] )
import Foundation import CRDT // First system let actorA = UUID() var a = GCounter<UUID>() a.incrementCounter(for: actorA) // a.value == 1 // Second system let actorB = UUID() var b = GCounter<UUID>() b.incrementCounter(for: actorB) // b.value == 1 try b.merge(a) // b.value == 2 a.incrementCounter(for: actorA) a.incrementCounter(for: actorA) // a.value == 3 try b.merge(a) // b.value == 4
See the tests for more examples.
- Convergent and Commutative Replicated Data Types
- LSEQ, an Adaptive Structure for Sequences in Distributed Collaborative Editing
See other projects which have implementations for CRDTs: