Unverified Commit 126d5548 authored by ksss's avatar ksss

Reimplement Enumerable#cycle

Fix pattern of infinite loop
And support all specs in https://github.com/ruby/spec/blob/27960d06e0ce92c37f074450f0eab4b0519b118c/core/enumerable/cycle_spec.rb without Enumerable#size
parent 3d946a80
......@@ -573,35 +573,38 @@ module Enumerable
# a.cycle(2) { |x| puts x } # print, a, b, c, a, b, c.
#
def cycle(n=nil, &block)
return to_enum(:cycle, n) if !block && n.nil?
def cycle(nv = nil, &block)
return to_enum(:cycle, nv) unless block
ary = []
if n.nil?
self.each do|*val|
ary.push val
block.call(*val)
n = nil
if nv.nil?
n = -1
else
unless nv.respond_to?(:to_int)
raise TypeError, "no implicit conversion of #{nv.class} into Integer"
end
loop do
ary.each do|e|
block.call(*e)
n = nv.to_int
unless n.kind_of?(Integer)
raise TypeError, "no implicit conversion of #{nv.class} into Integer"
end
return nil if n <= 0
end
else
raise TypeError, "no implicit conversion of #{n.class} into Integer" unless n.respond_to?(:to_int)
n = n.to_int
self.each do|*val|
ary.push val
end
count = 0
while count < n
ary.each do|e|
block.call(*e)
ary = []
each do |*i|
ary.push(i)
yield(*i)
end
count += 1
return nil if ary.empty?
while n < 0 || 0 < (n -= 1)
ary.each do |i|
yield(*i)
end
end
nil
end
##
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment