@@ -1421,28 +1421,35 @@ defmodule Enum do
1421
1421
into_protocol ( enumerable , collectable )
1422
1422
end
1423
1423
1424
- def into ( % { } = enumerable , % { } = collectable ) do
1425
- Map . merge ( collectable , enumerable )
1426
- end
1427
-
1428
- def into ( enumerable , % { } = collectable ) when is_list ( enumerable ) do
1429
- Map . merge ( collectable , :maps . from_list ( enumerable ) )
1430
- end
1431
-
1432
1424
def into ( enumerable , % { } = collectable ) do
1433
- reduce ( enumerable , collectable , fn { key , val } , acc ->
1434
- Map . put ( acc , key , val )
1435
- end )
1425
+ if map_size ( collectable ) == 0 do
1426
+ into_map ( enumerable )
1427
+ else
1428
+ into_map ( enumerable , collectable )
1429
+ end
1436
1430
end
1437
1431
1438
1432
def into ( enumerable , collectable ) do
1439
1433
into_protocol ( enumerable , collectable )
1440
1434
end
1441
1435
1436
+ defp into_map ( % { } = enumerable ) , do: enumerable
1437
+ defp into_map ( enumerable ) when is_list ( enumerable ) , do: :maps . from_list ( enumerable )
1438
+ defp into_map ( enumerable ) , do: enumerable |> Enum . to_list ( ) |> :maps . from_list ( enumerable )
1439
+
1440
+ defp into_map ( % { } = enumerable , collectable ) ,
1441
+ do: Map . merge ( collectable , enumerable )
1442
+
1443
+ defp into_map ( enumerable , collectable ) when is_list ( enumerable ) ,
1444
+ do: Map . merge ( collectable , :maps . from_list ( enumerable ) )
1445
+
1446
+ defp into_map ( enumerable , collectable ) ,
1447
+ do: Enum . reduce ( enumerable , collectable , fn { key , val } , acc -> Map . put ( acc , key , val ) end )
1448
+
1442
1449
defp into_protocol ( enumerable , collectable ) do
1443
1450
{ initial , fun } = Collectable . into ( collectable )
1444
1451
1445
- into ( enumerable , initial , fun , fn entry , acc ->
1452
+ into_protocol ( enumerable , initial , fun , fn entry , acc ->
1446
1453
fun . ( acc , { :cont , entry } )
1447
1454
end )
1448
1455
end
@@ -1461,20 +1468,42 @@ defmodule Enum do
1461
1468
1462
1469
"""
1463
1470
@ spec into ( Enumerable . t ( ) , Collectable . t ( ) , ( term -> term ) ) :: Collectable . t ( )
1464
-
1465
1471
def into ( enumerable , collectable , transform ) when is_list ( collectable ) do
1466
1472
collectable ++ map ( enumerable , transform )
1467
1473
end
1468
1474
1475
+ def into ( % _ { } = enumerable , collectable , transform ) do
1476
+ into_protocol ( enumerable , collectable , transform )
1477
+ end
1478
+
1479
+ def into ( enumerable , % _ { } = collectable , transform ) do
1480
+ into_protocol ( enumerable , collectable , transform )
1481
+ end
1482
+
1483
+ def into ( enumerable , % { } = collectable , transform ) do
1484
+ if map_size ( collectable ) == 0 do
1485
+ enumerable |> Enum . map ( transform ) |> :maps . from_list ( )
1486
+ else
1487
+ Enum . reduce ( enumerable , collectable , fn entry , acc ->
1488
+ { key , val } = transform . ( entry )
1489
+ Map . put ( acc , key , val )
1490
+ end )
1491
+ end
1492
+ end
1493
+
1469
1494
def into ( enumerable , collectable , transform ) do
1495
+ into_protocol ( enumerable , collectable , transform )
1496
+ end
1497
+
1498
+ defp into_protocol ( enumerable , collectable , transform ) do
1470
1499
{ initial , fun } = Collectable . into ( collectable )
1471
1500
1472
- into ( enumerable , initial , fun , fn entry , acc ->
1501
+ into_protocol ( enumerable , initial , fun , fn entry , acc ->
1473
1502
fun . ( acc , { :cont , transform . ( entry ) } )
1474
1503
end )
1475
1504
end
1476
1505
1477
- defp into ( enumerable , initial , fun , callback ) do
1506
+ defp into_protocol ( enumerable , initial , fun , callback ) do
1478
1507
try do
1479
1508
reduce ( enumerable , initial , callback )
1480
1509
catch
0 commit comments