enumerator.rb
def repeatedly Enumerator.new { |a| loop { a << yield } } end repeatedly {rand 100}.take 5 squares = ->() { Enumerator.new {|y, a=1| loop { y << a**2; a+=1 } }.lazy } squares[].select { |e| e % 3 == 0 }.first 10