ex_aequo

Build Status Hex.pm Coverage Status Inline docs

ExAequo Elixir Tools

Meaning of the name. All nice latin expressions starting with Ex are consumed at an alarming rate, so, all things being equal, I choose this one.

ExAequo.Enum offers some extension functions for Elixir's Enum module

Grouped Accumulation

Groupes accumulated values of an Enum according to a function that indicates if two consequent items are of the same kind and if so how to accumulate their two values.

The grouped_reduce function returns the groupes in reverse order, as, during traversal of lists quite often reversing the result of the classical "take first and push a function of it to the result" pattern cancels out.

An optional, reverse: true keyword option can be provided to reverse the final result for convenience.

iex> add_same = fn {x, a}, {y, b} ->
...> cond do
...> x == y -> {:cont, {x, a + b}}
...> true -> {:stop, nil} end end
...> E.grouped_reduce(
...> [{:a, 1}, {:a, 2}, {:b, 3}, {:b, 4}], add_same)
[{:b, 7}, {:a, 3}]

The grouped_inject function behaves almost identically to grouped_reduce, however an initial value is provided.

iex> sub_same = fn {x, a}, {y, b} ->
...> cond do
...> x == y -> {:cont, {x, a - b}}
...> true -> {:stop, nil}
...> end
...> end
...> E.grouped_inject(
...> [{:a, 1}, {:b, 2}, {:b, 2}, {:c, 2}, {:c, 1}, {:c, 1}],
...> {:a, 43}, sub_same, reverse: true)
[a: 42, b: 0, c: 0]