Feature #6824 closed
StopIteration gets a source method
Added by jasiek (Jan Szumiec) over 12 years ago.
Updated over 12 years ago.
Description
=begin
I'd like to add a method to StopIteration that returns an instance of the enumerator which triggered this exception. Eg:
enum = [].each
begin
enum.next
rescue StopIteration => ex
puts "same" if ex.source == enum
end
This is useful when you're merging multiple collections using min/max - when one of the collections is exhausted it can be easily ignored.
enumerators = 100.times.map do
rand(100).times.map do
rand
end.sort.each
end
merged = []
while !enumerators.empty?
begin
enumerators.map(&:peek)
values = enumerators.map(&:next)
merged += values.sort
rescue StopIteration => e
enumerators.delete(e.source)
retry
end
end
fail unless merged != merged.sort
Attached is a patch against trunk.
=end
Files
Description updated (diff )
=begin
You should use (({assert_same})) instead of (({assert_equal})), I think.
=end
I use the following method to weave enumerators together
#Intersperse several iterables, until all are exhausted
def weave(*enumerators)
enums = enumerators.map{|e| e.to_enum}
result = Enumerator.new do |y|
while !enums.empty?
loop_enum = enums.dup
loop_enum.each_with_index do |enum,i|
begin
y << enum.next
rescue StopIteration
#raise StopIteration if enums.empty?
enums.delete_at(i)
end
end
end
#raise StopIteration
end
end
Assignee set to mame (Yusuke Endoh)
mame-san, could you judge this ticket?
Status changed from Open to Rejected
Assignee changed from mame (Yusuke Endoh) to matz (Yukihiro Matsumoto)
Target version changed from 2.0.0 to 2.6
Hello,
jasiek (Jan Szumiec) wrote:
This is useful when you're merging multiple collections using min/max - when one of the collections is exhausted it can be easily ignored.
You are misunderstanding merge sort.
Your example does never work as intended.
fail unless merged != merged.sort
I bet this condition is inverted.
The proposal itself might be useful, but this ticket is based on misconception.
So I'm closing it. Please open another one if you wish.
--
Yusuke Endoh mame@tsg.ne.jp
Also available in: Atom
PDF
Like 0
Like 0 Like 0 Like 0 Like 0