Enum
is a very useful module that provides a set of algorithms for working with enumerables. It offers:
sort/2
, sort_by/2
),filter/2
),group_by/3
),count/2
)find/3
),min/3
, max/3
),reduce/3
, reduce_while/3
),And much more! Refer to the Enum
module documentation for a full list.
In general, an enumerable is any data that can be iterated over, a collection. In Elixir, an enumerable is any data type that implements the Enumerable
protocol. Those are:
Don't worry if you don't know them all yet.
Anyone can implement the Enumerable
protocol for their own custom data structure.
Enum.reduce/2
allows you to reduce the whole enumerable to a single value. To achieve this, a special variable called the accumulator is used. The accumulator carries the intermediate state of the reduction between iterations. This makes it one of the most powerful functions for enumerables. Many other specialized functions could be replaced by the more general reduce
. For example...
Finding the maximum value:
Enum.max([4, 20, 31, 9, 2])
# => 31
Enum.reduce([4, 20, 31, 9, 2], nil, fn x, acc ->
cond do
acc == nil -> x
x > acc -> x
x <= acc -> acc
end
end)
# => 31
And even mapping (but it requires reversing the result afterwards):
Enum.map([1, 2, 3, 4, 5], fn x -> x + 10 end)
# => [11, 12, 13, 14, 15]
Enum.reduce([1, 2, 3, 4, 5], [], fn x, acc -> [x + 10 | acc] end)
# => [15, 14, 13, 12, 11]
With Map.new/2
:
%{a: 1, b: 2}
|> Map.new(fn {key, value} -> {key, value * 10} end)
With Enum.into/3
:
%{a: 1, b: 2}
|> Enum.into(%{}, fn {key, value} -> {key, value * 10} end)
With Enum.map/2
:
%{a: 1, b: 2}
|> Enum.map(fn {key, value} -> {key, value * 10} end)
|> Enum.into(%{})