Skip to content
Permalink
Browse files
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
  • Loading branch information
ksss committed Nov 11, 2016
1 parent 3d946a8 commit 126d55480d9668a6a313a8e8c428cccfb88d459e
Showing 1 changed file with 26 additions and 23 deletions.
@@ -573,35 +573,38 @@ def reverse_each(&block)
# 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)
end
n = nv.to_int
unless n.kind_of?(Integer)
raise TypeError, "no implicit conversion of #{nv.class} into Integer"
end
else
raise TypeError, "no implicit conversion of #{n.class} into Integer" unless n.respond_to?(:to_int)
return nil if n <= 0
end

n = n.to_int
self.each do|*val|
ary.push val
end
count = 0
while count < n
ary.each do|e|
block.call(*e)
end
count += 1
ary = []
each do |*i|
ary.push(i)
yield(*i)
end
return nil if ary.empty?

while n < 0 || 0 < (n -= 1)
ary.each do |i|
yield(*i)
end
end

nil
end

##

0 comments on commit 126d554

Please sign in to comment.