class X
def initialize(obj)
@obj = obj
@calls = []
end
def collect(&block)
@calls.push([:collect, block])
self
end
def each(&block)
@calls.push([:each, block])
@obj.each do |x|
@calls.each do |c|
r = c[1].call(x)
x = r if c[0] == :collect
end
end
@calls = []
end
end
module Enumerable
def lazy
X.new(self)
end
end
[1, 2, 3].lazy.collect { |x|
x * 2
}.collect { |x|
x + 1
}.each { |x|
puts x
break if x > 4
} |