Loom.PNCounter

Positive-negative counters

PNCounters are counters that are capable of incrementing and decrementing. They are useful for like counters, where a user may like and then unlike something in succession.

They are not delta-CRDT’s, as they are rather lightweight in general. A delta- CRDT implementation would just return the latest value for an actor.

They do, however, implement the CRDT protocol, and can be coposed into larger CRDT datastructures.

Summary

dec(c, actor, int \\ 1)

Decrement a counter on behalf of the actor

inc(c, actor, int \\ 1)

Increment a counter on behalf of the actor

join(pncounter, pncounter)

Joins 2 counters together

new()

Instantiate a new PNCounter. Starts at 0

new(opts)

Instantiate a new PNCounter with previous values

value(pncounter)

Gets a natural value for the counter

Types

actor :: term

dot :: {actor, pos_integer}

t :: %Loom.PNCounter{p: %{actor => pos_integer}, n: %{actor => pos_integer}}

Functions

dec(c, actor, int \\ 1)

Specs:

Decrement a counter on behalf of the actor.

iex> alias Loom.PNCounter, as: Counter
iex> Counter.new
...> |> Counter.dec(:a, 1)
...> |> Counter.dec(:a, 29)
...> |> Counter.value
-30
iex> Counter.new
...> |> Counter.inc(:a, 1)
...> |> Counter.dec(:a, 1)
...> |> Counter.value
0
inc(c, actor, int \\ 1)

Specs:

Increment a counter on behalf of the actor.

iex> alias Loom.PNCounter, as: Counter
iex> Counter.new
...> |> Counter.inc(:a, 1)
...> |> Counter.inc(:a, 29)
...> |> Counter.value
30
join(pncounter, pncounter)

Specs:

  • join(t, t) :: t

Joins 2 counters together.

iex> alias Loom.PNCounter, as: Counter
iex> ctr1 = Counter.new |> Counter.inc(:a) |> Counter.dec(:a, 10)
iex> ctr2 = Counter.new |> Counter.dec(:b) |> Counter.inc(:b, 5)
iex> Counter.join(ctr1,ctr2) |> Counter.value
-5
new()

Specs:

  • new :: t

Instantiate a new PNCounter. Starts at 0.

iex> Loom.PNCounter.new |> Loom.PNCounter.value
0
new(opts)

Specs:

  • new([{:values, [{actor, {non_neg_integer, non_neg_integer}}]}]) :: t

Instantiate a new PNCounter with previous values.

iex> alias Loom.PNCounter, as: Counter
iex> values = [a: {10,0}, b: {5,5}, c: {37,5}]
iex> Counter.new(values: values) |> Counter.value
42
value(pncounter)

Specs:

  • value(t) :: integer

Gets a natural value for the counter.

For counters, it is an integer.