Ruby Enumeration: Taken first n where block returns true
enumerable, ruby
Solution
Ruby 2.0 implements lazy enumerables, for older versions use the gem enumerable-lazy:
require 'enumerable/lazy'
(1..Float::INFINITY).lazy.select(&:even?).take(5).to_a
#=> [2, 4, 6, 8, 10]
Problem
I want to take the first "n" entries which pass the block ``` a = 1..100_000_000 # Basically a long array # This iterates over the whole array -- no good b = a.select{|x| x.expensive_operation?}.take(n) ``` I want to short circuit the iteration once i've got n entries where 'expensive' condition is true. What do you suggest? take_while and keep count of n? ``` # This is the code i have; which i think can be written better, but how? a = 1..100_000_000 # Basically a long array n = 20 i = 0 b = a.take_while do |x| ((i < n) && (x.expensive_operation?)).tap do |r| i += 1 end end ```