@@ -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