@@ -214,7 +214,24 @@ defmodule Map do
214
214
215
215
"""
216
216
@ 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
218
235
enumerable
219
236
|> Enum . map ( transform )
220
237
|> :maps . from_list ( )
0 commit comments