From ace7e5ee2ff127a8409190714f1b6463b992bd7e Mon Sep 17 00:00:00 2001 From: sabiwara Date: Tue, 16 Sep 2025 20:44:49 +0900 Subject: [PATCH 1/3] Optimize Enum.into(struct, map, fun) --- lib/elixir/lib/enum.ex | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/elixir/lib/enum.ex b/lib/elixir/lib/enum.ex index 0bdff3f47f..4a46b6a097 100644 --- a/lib/elixir/lib/enum.ex +++ b/lib/elixir/lib/enum.ex @@ -1572,10 +1572,6 @@ defmodule Enum do map(enumerable, transform) end - def into(%_{} = enumerable, collectable, transform) do - into_protocol(enumerable, collectable, transform) - end - def into(enumerable, %_{} = collectable, transform) do into_protocol(enumerable, collectable, transform) end From 389809809fc4f0ce879fbe6482687e57be94a3ca Mon Sep 17 00:00:00 2001 From: sabiwara Date: Tue, 16 Sep 2025 20:56:36 +0900 Subject: [PATCH 2/3] Optimize Enum.into(enum, map_set) --- lib/elixir/lib/enum.ex | 8 ++++++++ lib/elixir/test/elixir/enum_test.exs | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/lib/elixir/lib/enum.ex b/lib/elixir/lib/enum.ex index 4a46b6a097..7fc74335f3 100644 --- a/lib/elixir/lib/enum.ex +++ b/lib/elixir/lib/enum.ex @@ -1496,6 +1496,14 @@ defmodule Enum do to_list(enumerable) end + def into(enumerable, collectable) when is_struct(collectable, MapSet) do + if MapSet.size(collectable) == 0 do + MapSet.new(enumerable) + else + MapSet.new(enumerable) |> MapSet.union(collectable) + end + end + def into(%_{} = enumerable, collectable) do into_protocol(enumerable, collectable) end diff --git a/lib/elixir/test/elixir/enum_test.exs b/lib/elixir/test/elixir/enum_test.exs index fbea90f13a..09097a5ffc 100644 --- a/lib/elixir/test/elixir/enum_test.exs +++ b/lib/elixir/test/elixir/enum_test.exs @@ -455,6 +455,10 @@ defmodule EnumTest do assert Enum.into(%{a: 1, b: 2}, []) |> Enum.sort() == [a: 1, b: 2] assert Enum.into(1..3, []) == [1, 2, 3] assert Enum.into(["H", "i"], "") == "Hi" + + assert Enum.into([a: 1, b: 2], MapSet.new()) == MapSet.new(a: 1, b: 2) + assert Enum.into(%{a: 1, b: 2}, MapSet.new()) == MapSet.new(a: 1, b: 2) + assert Enum.into([a: 1, b: 2], MapSet.new(a: 1, c: 3)) == MapSet.new(a: 1, b: 2, c: 3) end test "into/2 exceptions" do @@ -2039,6 +2043,7 @@ defmodule EnumTest.Range do test "into/2" do assert Enum.into(1..5, []) == [1, 2, 3, 4, 5] + assert Enum.into(1..5, MapSet.new()) == MapSet.new([1, 2, 3, 4, 5]) end test "into/3" do From 2759d1214bc37d5e92459cfe98be38a140631fbb Mon Sep 17 00:00:00 2001 From: sabiwara Date: Tue, 16 Sep 2025 20:59:45 +0900 Subject: [PATCH 3/3] Optimize Enum.into(enum, map_set, fun) --- lib/elixir/lib/enum.ex | 8 ++++++++ lib/elixir/test/elixir/enum_test.exs | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/lib/elixir/lib/enum.ex b/lib/elixir/lib/enum.ex index 7fc74335f3..16aac0e1d3 100644 --- a/lib/elixir/lib/enum.ex +++ b/lib/elixir/lib/enum.ex @@ -1580,6 +1580,14 @@ defmodule Enum do map(enumerable, transform) end + def into(enumerable, collectable, transform) when is_struct(collectable, MapSet) do + if MapSet.size(collectable) == 0 do + MapSet.new(enumerable, transform) + else + MapSet.new(enumerable, transform) |> MapSet.union(collectable) + end + end + def into(enumerable, %_{} = collectable, transform) do into_protocol(enumerable, collectable, transform) end diff --git a/lib/elixir/test/elixir/enum_test.exs b/lib/elixir/test/elixir/enum_test.exs index 09097a5ffc..7396f04663 100644 --- a/lib/elixir/test/elixir/enum_test.exs +++ b/lib/elixir/test/elixir/enum_test.exs @@ -479,6 +479,9 @@ defmodule EnumTest do assert Enum.into([1, 2, 3], [], fn x -> x * 2 end) == [2, 4, 6] assert Enum.into([1, 2, 3], "numbers: ", &to_string/1) == "numbers: 123" + assert Enum.into([1, 2, 3], MapSet.new(), &(&1 * 2)) == MapSet.new([2, 4, 6]) + assert Enum.into([1, 2, 3], MapSet.new([0, 2]), &(&1 * 2)) == MapSet.new([0, 2, 4, 6]) + assert_raise MatchError, fn -> Enum.into([2, 3], %{a: 1}, & &1) end @@ -2049,6 +2052,7 @@ defmodule EnumTest.Range do test "into/3" do assert Enum.into(1..5, [], fn x -> x * 2 end) == [2, 4, 6, 8, 10] assert Enum.into(1..3, "numbers: ", &to_string/1) == "numbers: 123" + assert Enum.into(1..3, MapSet.new(), &(&1 * 2)) == MapSet.new([2, 4, 6]) end test "join/2" do