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 pueda iterar, es decir, una colección. En Elixir, un enumerable es cualquier tipo de dato que implementa 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 único valor. Para lograrlo, se utiliza una variable especial llamada acumulador. El acumulador lleva el estado intermedio de la reducción entre iteraciones. Esto lo convierte en una de las funciones más potentes para trabajar con enumerables. Muchas otras funciones especializadas podrían sustituirse 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 (aunque 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(%{})