Skip to content

Commit 29e8883

Browse files
authored
Optimize Enum.into/2 and Enum.into/3 (#14774)
* Optimize Enum.into(struct, map, fun) * Optimize Enum.into(enum, map_set) * Optimize Enum.into(enum, map_set, fun)
1 parent 2ee1d0e commit 29e8883

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

lib/elixir/lib/enum.ex

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1496,6 +1496,14 @@ defmodule Enum do
14961496
to_list(enumerable)
14971497
end
14981498

1499+
def into(enumerable, collectable) when is_struct(collectable, MapSet) do
1500+
if MapSet.size(collectable) == 0 do
1501+
MapSet.new(enumerable)
1502+
else
1503+
MapSet.new(enumerable) |> MapSet.union(collectable)
1504+
end
1505+
end
1506+
14991507
def into(%_{} = enumerable, collectable) do
15001508
into_protocol(enumerable, collectable)
15011509
end
@@ -1572,8 +1580,12 @@ defmodule Enum do
15721580
map(enumerable, transform)
15731581
end
15741582

1575-
def into(%_{} = enumerable, collectable, transform) do
1576-
into_protocol(enumerable, collectable, transform)
1583+
def into(enumerable, collectable, transform) when is_struct(collectable, MapSet) do
1584+
if MapSet.size(collectable) == 0 do
1585+
MapSet.new(enumerable, transform)
1586+
else
1587+
MapSet.new(enumerable, transform) |> MapSet.union(collectable)
1588+
end
15771589
end
15781590

15791591
def into(enumerable, %_{} = collectable, transform) do

lib/elixir/test/elixir/enum_test.exs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,10 @@ defmodule EnumTest do
455455
assert Enum.into(%{a: 1, b: 2}, []) |> Enum.sort() == [a: 1, b: 2]
456456
assert Enum.into(1..3, []) == [1, 2, 3]
457457
assert Enum.into(["H", "i"], "") == "Hi"
458+
459+
assert Enum.into([a: 1, b: 2], MapSet.new()) == MapSet.new(a: 1, b: 2)
460+
assert Enum.into(%{a: 1, b: 2}, MapSet.new()) == MapSet.new(a: 1, b: 2)
461+
assert Enum.into([a: 1, b: 2], MapSet.new(a: 1, c: 3)) == MapSet.new(a: 1, b: 2, c: 3)
458462
end
459463

460464
test "into/2 exceptions" do
@@ -475,6 +479,9 @@ defmodule EnumTest do
475479
assert Enum.into([1, 2, 3], [], fn x -> x * 2 end) == [2, 4, 6]
476480
assert Enum.into([1, 2, 3], "numbers: ", &to_string/1) == "numbers: 123"
477481

482+
assert Enum.into([1, 2, 3], MapSet.new(), &(&1 * 2)) == MapSet.new([2, 4, 6])
483+
assert Enum.into([1, 2, 3], MapSet.new([0, 2]), &(&1 * 2)) == MapSet.new([0, 2, 4, 6])
484+
478485
assert_raise MatchError, fn ->
479486
Enum.into([2, 3], %{a: 1}, & &1)
480487
end
@@ -2039,11 +2046,13 @@ defmodule EnumTest.Range do
20392046

20402047
test "into/2" do
20412048
assert Enum.into(1..5, []) == [1, 2, 3, 4, 5]
2049+
assert Enum.into(1..5, MapSet.new()) == MapSet.new([1, 2, 3, 4, 5])
20422050
end
20432051

20442052
test "into/3" do
20452053
assert Enum.into(1..5, [], fn x -> x * 2 end) == [2, 4, 6, 8, 10]
20462054
assert Enum.into(1..3, "numbers: ", &to_string/1) == "numbers: 123"
2055+
assert Enum.into(1..3, MapSet.new(), &(&1 * 2)) == MapSet.new([2, 4, 6])
20472056
end
20482057

20492058
test "join/2" do

0 commit comments

Comments
 (0)