Skip to content

Commit 99b79af

Browse files
authored
Optimize Enum.to_list for ranges (#12384)
Closes #12383
1 parent 5d103ea commit 99b79af

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

lib/elixir/lib/enum.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3675,6 +3675,7 @@ defmodule Enum do
36753675
"""
36763676
@spec to_list(t) :: [element]
36773677
def to_list(enumerable) when is_list(enumerable), do: enumerable
3678+
def to_list(%{__struct__: Range} = range), do: Range.to_list(range)
36783679
def to_list(%_{} = enumerable), do: reverse(enumerable) |> :lists.reverse()
36793680
def to_list(%{} = enumerable), do: Map.to_list(enumerable)
36803681
def to_list(enumerable), do: reverse(enumerable) |> :lists.reverse()

lib/elixir/lib/range.ex

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,26 @@ defmodule Range do
389389
end
390390
end
391391

392+
@doc """
393+
Converts a range to a list.
394+
"""
395+
@doc since: "1.15.0"
396+
def to_list(first..last//step)
397+
when step > 0 and first <= last
398+
when step < 0 and first >= last do
399+
:lists.seq(first, last, step)
400+
end
401+
402+
def to_list(_first.._last//_step) do
403+
[]
404+
end
405+
406+
# TODO: Remove me on v2.0
407+
def to_list(%{__struct__: Range, first: first, last: last}) do
408+
step = if first <= last, do: 1, else: -1
409+
:lists.seq(first, last, step)
410+
end
411+
392412
@doc """
393413
Checks if two ranges are disjoint.
394414

0 commit comments

Comments
 (0)