Skip to content

Commit 9b44d95

Browse files
authored
Fix Enumerable.Range.member?/2 with empty range (#10819)
1 parent 56ecdb1 commit 9b44d95

File tree

2 files changed

+19
-7
lines changed

2 files changed

+19
-7
lines changed

lib/elixir/lib/range.ex

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -260,11 +260,16 @@ defimpl Enumerable, for: Range do
260260
{:done, acc}
261261
end
262262

263-
def member?(first..last//step, value) when is_integer(value) do
264-
if first <= last do
265-
{:ok, first <= value and value <= last and rem(value - first, step) == 0}
266-
else
267-
{:ok, last <= value and value <= first and rem(value - first, step) == 0}
263+
def member?(first..last//step = range, value) when is_integer(value) do
264+
cond do
265+
Range.empty?(range) ->
266+
{:ok, false}
267+
268+
first <= last ->
269+
{:ok, first <= value and value <= last and rem(value - first, step) == 0}
270+
271+
true ->
272+
{:ok, last <= value and value <= first and rem(value - first, step) == 0}
268273
end
269274
end
270275

lib/elixir/test/elixir/enum_test.exs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1219,7 +1219,7 @@ defmodule EnumTest do
12191219

12201220
assert result == [2, 4, 6, 8, 10]
12211221

1222-
# MAPS
1222+
# Maps
12231223
result = Enum.zip_with(%{a: 7, c: 9}, 3..4, fn {key, value}, b -> {key, value + b} end)
12241224
assert result == [a: 10, c: 13]
12251225

@@ -1272,7 +1272,7 @@ defmodule EnumTest do
12721272

12731273
assert result == [2, 4, 6, 8, 10]
12741274

1275-
# MAPS
1275+
# Maps
12761276
result = Enum.zip_with([%{a: 7, c: 9}, 3..4], fn [{key, value}, b] -> {key, value + b} end)
12771277
assert result == [a: 10, c: 13]
12781278

@@ -1651,6 +1651,13 @@ defmodule EnumTest.Range do
16511651
refute Enum.member?(1..10//2, 10)
16521652
assert Enum.member?(1..2//2, 1)
16531653
refute Enum.member?(1..2//2, 2)
1654+
1655+
assert Enum.member?(-1..-9//-2, -1)
1656+
assert Enum.member?(-1..-9//-2, -9)
1657+
refute Enum.member?(-1..-9//-2, -8)
1658+
1659+
refute Enum.member?(1..0//1, 1)
1660+
refute Enum.member?(0..1//-1, 1)
16541661
end
16551662

16561663
test "min/1" do

0 commit comments

Comments
 (0)