# DeltaCrdt

[![Hex pm](]( [![CircleCI badge](](

DeltaCrdt implements Delta CRDTs in Elixir. There is an [introductory blog post]( and the official documentation on []( is also very good.

CRDTs currently offered include:
- Add Wins Last Write Wins Map

Please open an issue or a pull request if you'd like to see any additional Delta CRDTs included.

The following papers have used to implement this library:
- [`Delta State Replicated Data Types – Almeida et al. 2016`](
- [`Efficient Synchronization of State-based CRDTs – Enes et al. 2018`](

DeltaCrdt also depends on [`MerkleMap`](, which is used to determine which keys need to be synced between nodes.

## Usage

Documentation can be found on [](

Here's a short example to illustrate adding an entry to a map:

# start 2 Delta CRDTs
{:ok, crdt1} = DeltaCrdt.start_link(DeltaCrdt.AWLWWMap)
{:ok, crdt2} = DeltaCrdt.start_link(DeltaCrdt.AWLWWMap)

# make them aware of each other
DeltaCrdt.set_neighbours(crdt1, [crdt2])

# show the initial value

# add a key/value in crdt1
DeltaCrdt.mutate(crdt1, :add, ["CRDT", "is magic!"])

# read it after it has been replicated to crdt2
%{"CRDT" => "is magic!"}

## Telemetry metrics

DeltaCrdt publishes the metric `[:delta_crdt, :sync, :done]`.

## Installation

The package can be installed by adding `delta_crdt` to your list of dependencies in `mix.exs`:

def deps do
    {:delta_crdt, "~> 0.5.0"}