diff --git a/lib/elixir/lib/enum.ex b/lib/elixir/lib/enum.ex index 0bdff3f47f..16aac0e1d3 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 @@ -1572,8 +1580,12 @@ defmodule Enum do map(enumerable, transform) end - def into(%_{} = enumerable, collectable, transform) do - into_protocol(enumerable, collectable, transform) + 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 diff --git a/lib/elixir/test/elixir/enum_test.exs b/lib/elixir/test/elixir/enum_test.exs index fbea90f13a..7396f04663 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 @@ -475,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 @@ -2039,11 +2046,13 @@ 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 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