Actions
Bug #7691
closed3 bugs with Lazy enumerators with state
Description
I found the following 3 bugs with Lazy#drop, drop_while and zip:
drop = (1..4).lazy.drop(2)
drop.to_a # => [3, 4]
drop.to_a # => [1, 2, 3, 4], should be same as above
drop_while = (1..4).lazy.drop_while(&:odd?)
drop_while.to_a # => [2, 3, 4]
drop_while.to_a # => [1, 2, 3, 4], should be same as above
zip = (1..2).lazy.zip([3, 4]) # or (3..4)
zip.to_a # => [[1, 3], [2, 4]]
zip.to_a # => [[1, nil], [2, nil]] should be same as above
I found them when writing a Ruby implementation of Enumerator::Lazy.
My implementation created the same bug with #take as described in https://bugs.ruby-lang.org/issues/6428.
This made me realize that the api of Lazy.new makes it near impossible to write most lazy enumerators requiring a state, as there is no general way to reset that state.
When looking at my code, I used a state for drop, drop_while and zip. A quick verification showed me that the MRI implementation also has the same bugs!gene
So the meta question is: should there not be a general way to initialize the state of the lazy enum?
Actions
Like0
Like0