Enum é um módulo muito útil que oferece um conjunto de algoritmos para trabalhar com enumerables. Ele oferece:
sort/2, sort_by/2),filter/2),group_by/3),count/2)find/3),min/3, max/3),reduce/3, reduce_while/3),E muito mais! Consulte a documentação do módulo Enum para ver a lista completa.
Em geral, um enumerable é qualquer dado sobre o qual se pode iterar, uma coleção. No Elixir, um enumerable é qualquer tipo de dado que implemente o protocolo Enumerable. São eles:
Não se preocupe se você ainda não conhece todos eles.
Qualquer pessoa pode implementar o protocolo Enumerable para a própria estrutura de dados personalizada.
Enum.reduce/2 permite reduzir todo o enumerable a um único valor. Para isso, usa-se uma variável especial chamada acumulador. O acumulador carrega o estado intermediário da redução entre as iterações. Isso faz dele uma das funções mais poderosas para enumerables. Muitas outras funções especializadas poderiam ser substituídas pelo reduce, que é mais geral. Por exemplo...
Encontrar o valor máximo:
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
E até mesmo o mapeamento (mas exige inverter o resultado depois):
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]
Com Map.new/2:
%{a: 1, b: 2}
|> Map.new(fn {key, value} -> {key, value * 10} end)
Com Enum.into/3:
%{a: 1, b: 2}
|> Enum.into(%{}, fn {key, value} -> {key, value * 10} end)
Com Enum.map/2:
%{a: 1, b: 2}
|> Enum.map(fn {key, value} -> {key, value * 10} end)
|> Enum.into(%{})