class Enumerator

def self.produce(initial = Backports::Undefined)

def self.produce(initial = Backports::Undefined)
  raise ArgumentError, 'no block given' unless block_given?
  Enumerator.new do |y|
    val = initial == Backports::Undefined ? yield() : initial
    loop do
      y << val
      val = yield(val)
    end
  end
end

def initialize_with_optional_block(*arg, &block)

def initialize_with_optional_block(*arg, &block)
  return initialize_without_optional_block(*arg, &nil) unless arg.empty?  # Ruby 1.9 apparently ignores the block if any argument is present
  initialize_without_optional_block(GeneratorBP.new(&block))
end