Enum es un módulo muy útil que proporciona un conjunto de algoritmos para trabajar con enumerables. Ofrece:
sort/2, sort_by/2),filter/2),group_by/3),count/2)find/3),min/3, max/3),reduce/3, reduce_while/3),¡Y mucho más! Consulta la documentación del módulo Enum para ver la lista completa.
En general, un enumerable es cualquier dato sobre el que se puede iterar, es decir, una colección. En Elixir, un enumerable es cualquier tipo de dato que implemente el protocolo Enumerable. Estos son:
No te preocupes si todavía no los conoces todos.
Cualquiera puede implementar el protocolo Enumerable para su propia estructura de datos personalizada.
Enum.reduce/2 te permite reducir todo el enumerable a un solo valor. Para lograrlo, se usa una variable especial llamada el acumulador. El acumulador lleva el estado intermedio de la reducción entre iteraciones. Esto lo convierte en una de las funciones más poderosas para trabajar con enumerables. Muchas otras funciones especializadas podrían reemplazarse por la más general reduce. Por ejemplo...
Encontrar el 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 incluso el mapeo (pero requiere invertir el resultado después):
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]
Con Map.new/2:
%{a: 1, b: 2}
|> Map.new(fn {key, value} -> {key, value * 10} end)
Con Enum.into/3:
%{a: 1, b: 2}
|> Enum.into(%{}, fn {key, value} -> {key, value * 10} end)
Con Enum.map/2:
%{a: 1, b: 2}
|> Enum.map(fn {key, value} -> {key, value * 10} end)
|> Enum.into(%{})