# DeltaCrdt
[](https://hex.pm/packages/delta_crdt) [](https://circleci.com/gh/derekkraan/delta_crdt_ex)
DeltaCrdt implements Delta CRDTs in Elixir. There is an [introductory blog post](https://medium.com/@derek.kraan2/dc838c383ad5) and the official documentation on [hexdocs.pm](https://hexdocs.pm/delta_crdt) 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`](https://arxiv.org/pdf/1603.01529.pdf)
- [`Efficient Synchronization of State-based CRDTs – Enes et al. 2018`](https://arxiv.org/pdf/1803.02750.pdf)
DeltaCrdt also depends on [`MerkleMap`](https://github.com/derekkraan/merkle_map), which is used to determine which keys need to be synced between nodes.
## Usage
Documentation can be found on [hexdocs.pm](https://hexdocs.pm/delta_crdt).
Here's a short example to illustrate adding an entry to a map:
```elixir
# 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
DeltaCrdt.read(crdt1)
%{}
# add a key/value in crdt1
DeltaCrdt.mutate(crdt1, :add, ["CRDT", "is magic!"])
# read it after it has been replicated to crdt2
DeltaCrdt.read(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`:
```elixir
def deps do
[
{:delta_crdt, "~> 0.5.0"}
]
end
```