Enum एक बहुत उपयोगी मॉड्यूल है, जो इन्यूमरेबल के साथ काम करने के लिए कई एल्गोरिदम देता है। यह कई काम करता है:
sort/2, sort_by/2),filter/2),group_by/3),count/2)find/3),min/3, max/3),reduce/3, reduce_while/3),और भी बहुत कुछ! पूरी सूची के लिए Enum मॉड्यूल का डॉक्युमेंटेशन देखिए।
सामान्य तौर पर, इन्यूमरेबल ऐसा कोई भी डेटा होता है जिस पर इटरेशन किया जा सके, यानी एक संग्रह। Elixir में, इन्यूमरेबल ऐसा कोई भी डेटा टाइप होता है जो Enumerable प्रोटोकॉल को लागू करता है। ये हैं:
अगर आप इन सबको अभी नहीं जानते, तो चिंता न कीजिए।
कोई भी अपने खुद के डेटा स्ट्रक्चर के लिए Enumerable प्रोटोकॉल लागू कर सकता है।
Enum.reduce/2 की मदद से आप पूरे इन्यूमरेबल को एक ही वैल्यू तक रिड्यूस कर सकते हैं। ऐसा करने के लिए एक खास वेरिएबल इस्तेमाल होता है, जिसे एक्युमुलेटर कहते हैं। एक्युमुलेटर हर इटरेशन के बीच रिड्यूस की बीच की स्थिति अपने पास रखता है। इसी वजह से यह इन्यूमरेबल के लिए सबसे शक्तिशाली फंक्शनों में से एक है। कई और खास फंक्शनों की जगह ज़्यादा सामान्य reduce से काम चलाया जा सकता है। उदाहरण के लिए...
अधिकतम वैल्यू ढूँढना:
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
और मैपिंग भी (लेकिन इसके लिए परिणाम को बाद में उलटना पड़ता है):
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]
Map.new/2 के साथ:
%{a: 1, b: 2}
|> Map.new(fn {key, value} -> {key, value * 10} end)
Enum.into/3 के साथ:
%{a: 1, b: 2}
|> Enum.into(%{}, fn {key, value} -> {key, value * 10} end)
Enum.map/2 के साथ:
%{a: 1, b: 2}
|> Enum.map(fn {key, value} -> {key, value * 10} end)
|> Enum.into(%{})