Feature #6824
closedStopIteration gets a source method
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
Updated by nobu (Nobuyoshi Nakada) over 12 years ago
- Description updated (diff)
=begin
You should use (({assert_same})) instead of (({assert_equal})), I think.
=end
Updated by dsisnero (Dominic Sisneros) over 12 years ago
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
Updated by ko1 (Koichi Sasada) about 12 years ago
- Assignee set to mame (Yusuke Endoh)
mame-san, could you judge this ticket?
Updated by mame (Yusuke Endoh) about 12 years ago
- 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