Swiss.Enum (swiss v3.12.0) View Source

Helper functions for dealing with Enumerables.

Link to this section Summary

Functions

Calculates the average of values in an enumerable. Currently supports maps and lists only.

Finds an element and its index in enumerable for which fun returns true.

Finds the first element in enumerable where its key equals value.

Finds the first element in enumerable where its key equals value.

Same as Enum.group_by/3 but expects each group to have a single element, and therefore returns only that element per key, instead of a list.

Finds the index of a value inside an enumerable.

Reduces the given enumerable while its elements match :ok or {:ok, _}, halting otherwise. Returns the last iterated term.

Applies cb to all elements in enum, ignores the return and returns enum.

Link to this section Functions

Link to this function

avg(enum, mapper \\ &(&1))

View Source

Specs

avg(list() | map(), (any() -> number())) :: number()

Calculates the average of values in an enumerable. Currently supports maps and lists only.

Examples

iex> Swiss.Enum.avg([1, 2, 3, 4])
2.5

iex> Swiss.Enum.avg([%{key: 1}, %{key: 2}, %{key: 3}, %{key: 4}], & &1.key)
2.5

iex> Swiss.Enum.avg(%{a: 1, b: 2, c: 3, d: 4}, &elem(&1, 1))
2.5

iex> Swiss.Enum.avg(%{})
0

iex> Swiss.Enum.avg([])
0
Link to this function

find_both(enumerable, fun)

View Source

Finds an element and its index in enumerable for which fun returns true.

Examples

iex> Swiss.Enum.find_both([42, 44, 46], fn num -> num == 44 end)
{44, 1}

iex> Swiss.Enum.find_both([42, 44, 46], fn num -> num == 45 end)
{nil, nil}
Link to this function

find_by(enumerable, default \\ nil, key, value)

View Source

Specs

find_by(Enumerable.t(), any(), any(), any()) :: any()

Finds the first element in enumerable where its key equals value.

Returns default if not found.

Examples

iex> Swiss.Enum.find_by([%{life: 11}, %{life: 42}], :life, 42)
%{life: 42}

iex> Swiss.Enum.find_by([%{life: 11}, %{life: 42}], :wat, 42)
nil

iex> Swiss.Enum.find_by([%{life: 11}, %{life: 42}], 42, :wat, 42)
42

iex> Swiss.Enum.find_by([%Swiss.TestStruct{life: 42}], :life, 42)
%Swiss.TestStruct{life: 42}
Link to this function

find_by!(enumerable, key, value)

View Source

Specs

find_by!(Enumerable.t(), any(), any()) :: any()

Finds the first element in enumerable where its key equals value.

Raises if not found.

Examples

iex> Swiss.Enum.find_by!([%{life: 11}, %{life: 42}], :life, 42)
%{life: 42}

iex> Swiss.Enum.find_by!([%{life: 11}, %{life: 42}], :wat, 42)
** (Swiss.Enum.KeyValueError) key :wat with value 42 not found in: [%{life: 11}, %{life: 42}]
Link to this function

group_by_single(enum, key_fn, value_fn \\ fn x -> x end)

View Source

Specs

group_by_single(Enumerable.t(), (any() -> any()), (any() -> any())) :: map()

Same as Enum.group_by/3 but expects each group to have a single element, and therefore returns only that element per key, instead of a list.

Examples

iex> Swiss.Enum.group_by_single(
...>   [%{k: "life", v: 42}, %{k: "death", v: 13}, %{k: "ooo", v: 0}],
...>   & &1.k,
...>   & &1.v
...> )
%{"life" => 42, "death" => 13, "ooo" => 0}

Specs

index_of(Enumerable.t(), any()) :: non_neg_integer() | nil

Finds the index of a value inside an enumerable.

Examples

iex> Swiss.Enum.index_of([1, 2, 3, 4], 3)
2

iex> Swiss.Enum.index_of([1, 2, 3, 4], 1)
0

iex> Swiss.Enum.index_of([1, 2, 3, 4], 5)
nil

Specs

reduce_while_ok(Enumerable.t()) :: :ok | {:ok, any()} | any()

Reduces the given enumerable while its elements match :ok or {:ok, _}, halting otherwise. Returns the last iterated term.

Examples

iex> Swiss.Enum.reduce_while_ok([:ok, :ok, :ok])
:ok

iex> Swiss.Enum.reduce_while_ok([:ok, {:ok, 15}])
{:ok, 15}

iex> Swiss.Enum.reduce_while_ok([:ok, {:ok, 15}, {:error, :oh_no}])
{:error, :oh_no}

iex> Swiss.Enum.reduce_while_ok([])
:ok

Specs

Applies cb to all elements in enum, ignores the return and returns enum.

Examples

iex> Swiss.Enum.thru([1, 2, 3], fn a -> a + 1 end)
[1, 2, 3]