require 'generator' def coroutine(m, *args) Generator.new {|g| m.call(*args) {|x| g.yield x} } end def generate_fibonacci(a, b) loop do yield a a, b = b, a + b end end fibonacci = coroutine(method(:generate_fibonacci), 1, 1) 10.times do puts fibonacci.next end