Skip to content

Commit 6c0d43c

Browse files
author
José Valim
committed
Merge pull request #992 from meh/enum-member
Implement Enum.member?
2 parents 0b77a54 + 028421f commit 6c0d43c

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

lib/elixir/lib/enum.ex

+36
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,28 @@ defmodule Enum do
759759
end
760760
end
761761

762+
@doc """
763+
Checks if the given `term` is included in the `collection`.
764+
765+
## Examples
766+
767+
iex> Enum.member?(1 .. 3, 1)
768+
true
769+
iex> Enum.member?([1, 2, 3, 4], 10)
770+
false
771+
772+
"""
773+
@spec member?(t, term) :: boolean
774+
def member?(collection, term) do
775+
case I.iterator(collection) do
776+
{ iterator, pointer } ->
777+
do_member?(pointer, iterator, term)
778+
779+
list when is_list(list) ->
780+
List.member?(list, term)
781+
end
782+
end
783+
762784
@doc """
763785
Partitions `collection` into two where the first one contains elements
764786
for which `fun` returns a truthy value, and the second one -- for which `fun`
@@ -1549,6 +1571,20 @@ defmodule Enum do
15491571
{ :lists.reverse(list_acc), acc }
15501572
end
15511573

1574+
## member?
1575+
1576+
def do_member?(:stop, _, _) do
1577+
false
1578+
end
1579+
1580+
def do_member?({ h, _ }, _, term) when h == term do
1581+
true
1582+
end
1583+
1584+
def do_member?({ h, next }, iterator, term) do
1585+
do_member?(iterator.(next), iterator, term)
1586+
end
1587+
15521588
## partition
15531589

15541590
defp do_partition([h|t], fun, acc1, acc2) do

lib/elixir/test/elixir/enum_test.exs

+6
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,12 @@ defmodule EnumTest.List do
182182
assert Enum.map_reduce([1,2,3], 1, fn(x, acc) -> { x * 2, x + acc } end) == { [2,4,6], 7 }
183183
end
184184

185+
test :member? do
186+
refute Enum.member?([], 0)
187+
assert Enum.member?([1, 2, 3], 2)
188+
assert Enum.member?(1 .. 3, 1)
189+
end
190+
185191
test :partition do
186192
assert Enum.partition([1,2,3], fn(x) -> rem(x, 2) == 0 end) == { [2], [1,3] }
187193
assert Enum.partition([2,4,6], fn(x) -> rem(x, 2) == 0 end) == { [2,4,6], [] }

0 commit comments

Comments
 (0)