Enumerator::Generator:select should return another Enumerator::Generator
The current implementation of Enumerator:select fails when applied to an open ended Enumerator:Generator,
resulting in an endless loop.
In the current implementation, :select seems to collect all values from the enumerator before applying the selection.
If that Enumeration is not bound, this results in an endless loop.
Instead, applying :select to a Generator should be applied to each object in turn and should itself return a Enumerator::Generator.
For example to select the first 5 even numbers starting at 123 should work as:
but this currently results in an endless loop.
The same problem applies for :map and some other operators on Enumerations
However changing :select and :map to make them work with open ended Enumerations
might also change the api contract as they are currently defined to return an array.
We might want to have a look at the SICSP on streams,
I came up with this prototype:
# return a generator for all elements from enumeration where block returns true
def select &block
Enumerator.new do |y|
self.each do |obj|
Let's wrap an open ended Range in a Generator:
=> [124, 126, 128, 130, 132]