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 করতে পারেন। এটি করতে অ্যাকুমুলেটর নামের একটি বিশেষ ভ্যারিয়েবল ব্যবহার করা হয়। অ্যাকুমুলেটর ইটারেশনগুলোর মাঝে রিডাকশনের মধ্যবর্তী অবস্থা বহন করে। এই কারণেই এটি এনুমারেবলের জন্য সবচেয়ে শক্তিশালী ফাংশনগুলোর একটি। আরও অনেক বিশেষায়িত ফাংশনের কাজ এই বেশি সাধারণ 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(%{})