Turns out you iterate over a Map exactly like you do over a Keyword List (i.e. you use a tuple):
Enum.each(%{a: 1, b: 2, c: 3}, fn {k, v} ->
IO.puts("#{k} --> #{v}")
end)
Comprehensions also work:
for {k, v} <- %{a: 1, b: 2, c: 3} do
IO.puts("#{k} --> #{v}")
end
Note: If you use Enum.map/2 and return a tuple, you’ll end up with a Keyword List instead of Map. To convert it into a map, use Enum.into/2 or Map.new/2.