Make Enumerable#many? iterate only over what is necessary

This commit is contained in:
Marc-Andre Lafortune
2011-07-23 15:40:58 -04:00
parent a96e824c53
commit c785038839
2 changed files with 17 additions and 3 deletions

View File

@@ -95,9 +95,16 @@ module Enumerable
# Returns true if the enumerable has more than 1 element. Functionally equivalent to enum.to_a.size > 1.
# Can be called with a block too, much like any?, so people.many? { |p| p.age > 26 } returns true if more than 1 person is over 26.
def many?(&block)
size = block_given? ? count(&block) : to_a.size
size > 1
def many?
cnt = 0
if block_given?
any? do |element|
cnt += 1 if yield element
cnt > 1
end
else
any?{ (cnt += 1) > 1 }
end
end
# The negative of the Enumerable#include?. Returns true if the collection does not include the object.

View File

@@ -104,6 +104,13 @@ class EnumerableTests < Test::Unit::TestCase
assert_equal true, GenericEnumerable.new([ 1, 2, 2 ]).many? {|x| x > 1 }
end
def test_many_iterates_only_on_what_is_needed
infinity = 1.0/0.0
very_long_enum = 0..infinity
assert_equal true, very_long_enum.many?
assert_equal true, very_long_enum.many?{|x| x > 100}
end
def test_exclude?
assert_equal true, GenericEnumerable.new([ 1 ]).exclude?(2)
assert_equal false, GenericEnumerable.new([ 1 ]).exclude?(1)