Actions
Feature #21135
closedFeature request: Enumerable.compare_count
Status:
Closed
Assignee:
-
Target version:
-
Description
Enumerables at times can be quite expensive to complete expand. If all is desired is to compare the count, we can terminate the enumeration once the result is known.
The functionality that I envision, if implemented in ruby, might look like this:
module Enumerable
def compare_count(operation, standard, &blk)
case operation
when :<
compare_count_lt(standard, &blk)
when :>=
!compare_count_lt(standard, &blk)
when :>
compare_count_spaceship(standard, &blk) == 1
when :<=
compare_count_spaceship(standard, &blk) != 1
when :==
compare_count_spaceship(standard, &blk) == 0
when :!=
compare_count_spaceship(standard, &blk) != 0
end
end
def compare_count_lt(standard, &blk)
truncate_count(standard - 1, &blk) < standard
end
def compare_count_spaceship(standard, &blk)
truncate_count(standard, &blk) <=> standard
end
def truncate_count(limit, &blk)
return 0 if limit < 0
found = 0
each do |ele|
found += 1 unless blk && !yield(ele)
break if found > limit
end
found
end
end
class Demo
include Enumerable
attr_reader :capacity
attr_reader :cnt
def initialize(capacity)
@capacity = capacity
end
def each
@cnt = 0
while cnt < capacity
@cnt += 1
yield cnt
end
end
end
%i{< <= >= > == !=}.each do |op|
d = Demo.new(3)
(-1..5).each do |x|
puts [op, x, d.compare_count(op, x), d].inspect
end
end
require 'prime'
%i{< <= >= > == !=}.each do |op|
d = Demo.new(6)
(-1..5).each do |x|
puts [op, x, d.compare_count(op, x){|p| Prime.prime?(p)} , d].inspect
end
end
[:<, -1, false, #<Demo:0x034d567c @capacity=3>]
[:<, 0, false, #<Demo:0x034d567c @capacity=3>]
[:<, 1, false, #<Demo:0x034d567c @capacity=3, @cnt=1>]
[:<, 2, false, #<Demo:0x034d567c @capacity=3, @cnt=2>]
[:<, 3, false, #<Demo:0x034d567c @capacity=3, @cnt=3>]
[:<, 4, true, #<Demo:0x034d567c @capacity=3, @cnt=3>]
[:<, 5, true, #<Demo:0x034d567c @capacity=3, @cnt=3>]
[:<=, -1, false, #<Demo:0x034d512c @capacity=3>]
[:<=, 0, false, #<Demo:0x034d512c @capacity=3, @cnt=1>]
[:<=, 1, false, #<Demo:0x034d512c @capacity=3, @cnt=2>]
[:<=, 2, false, #<Demo:0x034d512c @capacity=3, @cnt=3>]
[:<=, 3, true, #<Demo:0x034d512c @capacity=3, @cnt=3>]
[:<=, 4, true, #<Demo:0x034d512c @capacity=3, @cnt=3>]
[:<=, 5, true, #<Demo:0x034d512c @capacity=3, @cnt=3>]
[:>=, -1, true, #<Demo:0x034d4d44 @capacity=3>]
[:>=, 0, true, #<Demo:0x034d4d44 @capacity=3>]
[:>=, 1, true, #<Demo:0x034d4d44 @capacity=3, @cnt=1>]
[:>=, 2, true, #<Demo:0x034d4d44 @capacity=3, @cnt=2>]
[:>=, 3, true, #<Demo:0x034d4d44 @capacity=3, @cnt=3>]
[:>=, 4, false, #<Demo:0x034d4d44 @capacity=3, @cnt=3>]
[:>=, 5, false, #<Demo:0x034d4d44 @capacity=3, @cnt=3>]
[:>, -1, true, #<Demo:0x034d4998 @capacity=3>]
[:>, 0, true, #<Demo:0x034d4998 @capacity=3, @cnt=1>]
[:>, 1, true, #<Demo:0x034d4998 @capacity=3, @cnt=2>]
[:>, 2, true, #<Demo:0x034d4998 @capacity=3, @cnt=3>]
[:>, 3, false, #<Demo:0x034d4998 @capacity=3, @cnt=3>]
[:>, 4, false, #<Demo:0x034d4998 @capacity=3, @cnt=3>]
[:>, 5, false, #<Demo:0x034d4998 @capacity=3, @cnt=3>]
[:==, -1, false, #<Demo:0x034d4600 @capacity=3>]
[:==, 0, false, #<Demo:0x034d4600 @capacity=3, @cnt=1>]
[:==, 1, false, #<Demo:0x034d4600 @capacity=3, @cnt=2>]
[:==, 2, false, #<Demo:0x034d4600 @capacity=3, @cnt=3>]
[:==, 3, true, #<Demo:0x034d4600 @capacity=3, @cnt=3>]
[:==, 4, false, #<Demo:0x034d4600 @capacity=3, @cnt=3>]
[:==, 5, false, #<Demo:0x034d4600 @capacity=3, @cnt=3>]
[:!=, -1, true, #<Demo:0x034d4268 @capacity=3>]
[:!=, 0, true, #<Demo:0x034d4268 @capacity=3, @cnt=1>]
[:!=, 1, true, #<Demo:0x034d4268 @capacity=3, @cnt=2>]
[:!=, 2, true, #<Demo:0x034d4268 @capacity=3, @cnt=3>]
[:!=, 3, false, #<Demo:0x034d4268 @capacity=3, @cnt=3>]
[:!=, 4, true, #<Demo:0x034d4268 @capacity=3, @cnt=3>]
[:!=, 5, true, #<Demo:0x034d4268 @capacity=3, @cnt=3>]
[:<, -1, false, #<Demo:0x00007f64147c37e0 @capacity=6>]
[:<, 0, false, #<Demo:0x00007f64147c37e0 @capacity=6>]
[:<, 1, false, #<Demo:0x00007f64147c37e0 @capacity=6, @cnt=2>]
[:<, 2, false, #<Demo:0x00007f64147c37e0 @capacity=6, @cnt=3>]
[:<, 3, false, #<Demo:0x00007f64147c37e0 @capacity=6, @cnt=5>]
[:<, 4, true, #<Demo:0x00007f64147c37e0 @capacity=6, @cnt=6>]
[:<, 5, true, #<Demo:0x00007f64147c37e0 @capacity=6, @cnt=6>]
[:<=, -1, false, #<Demo:0x00007f64147c21d8 @capacity=6>]
[:<=, 0, false, #<Demo:0x00007f64147c21d8 @capacity=6, @cnt=2>]
[:<=, 1, false, #<Demo:0x00007f64147c21d8 @capacity=6, @cnt=3>]
[:<=, 2, false, #<Demo:0x00007f64147c21d8 @capacity=6, @cnt=5>]
[:<=, 3, true, #<Demo:0x00007f64147c21d8 @capacity=6, @cnt=6>]
[:<=, 4, true, #<Demo:0x00007f64147c21d8 @capacity=6, @cnt=6>]
[:<=, 5, true, #<Demo:0x00007f64147c21d8 @capacity=6, @cnt=6>]
[:>=, -1, true, #<Demo:0x00007f64147c0860 @capacity=6>]
[:>=, 0, true, #<Demo:0x00007f64147c0860 @capacity=6>]
[:>=, 1, true, #<Demo:0x00007f64147c0860 @capacity=6, @cnt=2>]
[:>=, 2, true, #<Demo:0x00007f64147c0860 @capacity=6, @cnt=3>]
[:>=, 3, true, #<Demo:0x00007f64147c0860 @capacity=6, @cnt=5>]
[:>=, 4, false, #<Demo:0x00007f64147c0860 @capacity=6, @cnt=6>]
[:>=, 5, false, #<Demo:0x00007f64147c0860 @capacity=6, @cnt=6>]
[:>, -1, true, #<Demo:0x00007f64147df260 @capacity=6>]
[:>, 0, true, #<Demo:0x00007f64147df260 @capacity=6, @cnt=2>]
[:>, 1, true, #<Demo:0x00007f64147df260 @capacity=6, @cnt=3>]
[:>, 2, true, #<Demo:0x00007f64147df260 @capacity=6, @cnt=5>]
[:>, 3, false, #<Demo:0x00007f64147df260 @capacity=6, @cnt=6>]
[:>, 4, false, #<Demo:0x00007f64147df260 @capacity=6, @cnt=6>]
[:>, 5, false, #<Demo:0x00007f64147df260 @capacity=6, @cnt=6>]
[:==, -1, false, #<Demo:0x00007f64147dd898 @capacity=6>]
[:==, 0, false, #<Demo:0x00007f64147dd898 @capacity=6, @cnt=2>]
[:==, 1, false, #<Demo:0x00007f64147dd898 @capacity=6, @cnt=3>]
[:==, 2, false, #<Demo:0x00007f64147dd898 @capacity=6, @cnt=5>]
[:==, 3, true, #<Demo:0x00007f64147dd898 @capacity=6, @cnt=6>]
[:==, 4, false, #<Demo:0x00007f64147dd898 @capacity=6, @cnt=6>]
[:==, 5, false, #<Demo:0x00007f64147dd898 @capacity=6, @cnt=6>]
[:!=, -1, true, #<Demo:0x00007f64147dbf20 @capacity=6>]
[:!=, 0, true, #<Demo:0x00007f64147dbf20 @capacity=6, @cnt=2>]
[:!=, 1, true, #<Demo:0x00007f64147dbf20 @capacity=6, @cnt=3>]
[:!=, 2, true, #<Demo:0x00007f64147dbf20 @capacity=6, @cnt=5>]
[:!=, 3, false, #<Demo:0x00007f64147dbf20 @capacity=6, @cnt=6>]
[:!=, 4, true, #<Demo:0x00007f64147dbf20 @capacity=6, @cnt=6>]
[:!=, 5, true, #<Demo:0x00007f64147dbf20 @capacity=6, @cnt=6>]
Actions
Like0
Like0Like0Like0