CRDT icon indicating copy to clipboard operation
CRDT copied to clipboard

Convergent and Commutative Replicated Data Types implementation in Swift

CRDT

A Swift package to help build Convergent and Commutative Replicated Data Types.

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.

Usage

Swift Package Manager

Add this package to your Package.swift dependencies and target's dependencies:

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"]
        )
    ]
)

Code

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.

Related Links

CRDT Papers

Other Projects

See other projects which have implementations for CRDTs:

License

Apache-2.0 License