Hume.EventOrder (hume v0.0.9)
View SourceProvides utilities for working with ordered event sequences.
Events are tuples of {sequence_number, event_data} where sequence numbers
are integers used to maintain ordering. This module provides functions to
check ordering, ensure ordering, and merge ordered event sequences.
Summary
Functions
Ensures a list of events is ordered, sorting if necessary.
Returns the length of the event list.
Merges two ordered event sequences into a single ordered sequence.
Checks if a list of events is ordered by sequence number.
Converts an {:ordered, events} tuple to a raw event list.
If given a raw event list, returns it as-is.
Types
Functions
Ensures a list of events is ordered, sorting if necessary.
Returns an {:ordered, events} tuple. If the input is already ordered,
it returns the events as-is. Otherwise, it sorts them by sequence number.
Examples
iex> Hume.EventOrder.ensure_ordered([{1, :foo}, {2, :bar}])
{:ordered, [{1, :foo}, {2, :bar}]}
iex> Hume.EventOrder.ensure_ordered([{2, :bar}, {1, :foo}])
{:ordered, [{1, :foo}, {2, :bar}]}
iex> Hume.EventOrder.ensure_ordered([])
{:ordered, []}
@spec len(ordered() | [event()]) :: non_neg_integer()
Returns the length of the event list.
Works with both raw event lists and {:ordered, events} tuples.
Examples
iex> Hume.EventOrder.len([])
0
iex> Hume.EventOrder.len([{1, :foo}, {2, :bar}])
2
iex> Hume.EventOrder.len({:ordered, [{1, :foo}, {2, :bar}]})
2
Merges two ordered event sequences into a single ordered sequence.
When events have the same sequence number (conflict), the "later wins" policy is applied - the event from the second list takes precedence.
Examples
iex> Hume.EventOrder.merge_ordered({:ordered, [{1, :a}]}, {:ordered, [{2, :b}]})
{:ordered, [{1, :a}, {2, :b}]}
iex> Hume.EventOrder.merge_ordered({:ordered, [{1, :a}, {3, :c}]}, {:ordered, [{2, :b}]})
{:ordered, [{1, :a}, {2, :b}, {3, :c}]}
iex> Hume.EventOrder.merge_ordered({:ordered, [{1, :old}]}, {:ordered, [{1, :new}]})
{:ordered, [{1, :new}]}
iex> Hume.EventOrder.merge_ordered({:ordered, []}, {:ordered, [{1, :a}]})
{:ordered, [{1, :a}]}
Checks if a list of events is ordered by sequence number.
Examples
iex> Hume.EventOrder.ordered?([])
true
iex> Hume.EventOrder.ordered?([{1, :foo}])
true
iex> Hume.EventOrder.ordered?([{1, :foo}, {2, :bar}, {3, :baz}])
true
iex> Hume.EventOrder.ordered?([{1, :foo}, {3, :bar}, {2, :baz}])
false
iex> Hume.EventOrder.ordered?([{2, :foo}, {1, :bar}])
false
Converts an {:ordered, events} tuple to a raw event list.
If given a raw event list, returns it as-is.
Examples
iex> Hume.EventOrder.to_list({:ordered, [{1, :foo}, {2, :bar}]})
[{1, :foo}, {2, :bar}]
iex> Hume.EventOrder.to_list([{1, :foo}, {2, :bar}])
[{1, :foo}, {2, :bar}]