Skip to content

Commit c99a17b

Browse files
committed
Optimize Map.new/2
1 parent 9ad1829 commit c99a17b

File tree

1 file changed

+18
-1
lines changed

1 file changed

+18
-1
lines changed

lib/elixir/lib/map.ex

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,24 @@ defmodule Map do
214214
215215
"""
216216
@spec new(Enumerable.t(), (term -> {key, value})) :: map
217-
def new(enumerable, transform) when is_function(transform, 1) do
217+
def new(enumerable, transform)
218+
def new(%_{} = enumerable, transform), do: new_from_enum(enumerable, transform)
219+
def new(%{} = map, transform), do: new_from_map(map, transform)
220+
def new(enumerable, transform), do: new_from_enum(enumerable, transform)
221+
222+
defp new_from_map(map, transform) when is_function(transform, 1) do
223+
iter = :maps.iterator(map)
224+
next = :maps.next(iter)
225+
:maps.from_list(do_map(next, transform))
226+
end
227+
228+
defp do_map(:none, _fun), do: []
229+
230+
defp do_map({key, value, iter}, transform) do
231+
[transform.({key, value}) | do_map(:maps.next(iter), transform)]
232+
end
233+
234+
defp new_from_enum(enumerable, transform) when is_function(transform, 1) do
218235
enumerable
219236
|> Enum.map(transform)
220237
|> :maps.from_list()

0 commit comments

Comments
 (0)