class Enumerator::IO::Reader

Public Class Methods

new(enumerator, &block) click to toggle source
# File lib/enumerator/io/reader.rb, line 4
def initialize(enumerator, &block)
  @enumerator = enumerator
  @reader, @writer = ::IO.pipe
  @end_of_read_window = 0
  @read_bytes = 0
  @block = block
end

Public Instance Methods

eof?() click to toggle source
# File lib/enumerator/io/reader.rb, line 27
def eof?
  moar_data if @read_bytes == 0
  @reader.eof?
end
read(*args) click to toggle source
# File lib/enumerator/io/reader.rb, line 12
def read(*args)
  length = args.first
  if length
    required_read_window = @read_bytes + length 
    if required_read_window > @end_of_read_window
      increase_read_window!(required_read_window - @end_of_read_window)
    end
  else
    slurp!
  end
  result = @reader.read(*args)
  @read_bytes += result.size if result
  result
end

Private Instance Methods

increase_read_window!(bytes_left) click to toggle source
# File lib/enumerator/io/reader.rb, line 34
def increase_read_window!(bytes_left)
  while bytes_left >= 0 && (written = moar_data) > 0
    bytes_left -= written
  end
ensure
  @writer.flush unless @writer.closed?
end
moar_data() click to toggle source
# File lib/enumerator/io/reader.rb, line 48
def moar_data
  entry = @enumerator.next
  chunck = if @block
    @block.call(entry)
  else
    entry.to_s
  end
  @writer.write(chunck)
  @end_of_read_window += chunck.size
  chunck.size
rescue StopIteration
  unless @writer.closed?
    @writer.flush
    @writer.close
  end
  0
end
slurp!() click to toggle source
# File lib/enumerator/io/reader.rb, line 42
def slurp!
  return if @writer.closed?
  while moar_data > 0
  end
end