class JsonEmitter::BufferedStream

Represents a stream of JSON to be generated and yielded. It can be treated like any Enumerable. Unlike JsonEmitter::Stream, the yielded output is buffered into (roughly) equally sized chunks.

Public Class Methods

new(enum, buffer_size, unit: :kb) click to toggle source

Initialize a new buffered stream.

@param enum [Enumerator] An enumerator that yields pieces of JSON. @param buffer_size [Integer] The buffer size in kb. This is a size hint, not a hard limit. @param unit [Symbol] :bytes | :kb (default) | :mb

# File lib/json-emitter/buffered_stream.rb, line 16
def initialize(enum, buffer_size, unit: :kb)
  @enum = enum
  @buffer_size = case unit
                 when :bytes then buffer_size
                 when :kb then buffer_size * 1024
                 when :mb then buffer_size * 1024 * 1024
                 else raise ArgumentError, "unknown buffer size unit ':#{unit}'"
                 end
end

Public Instance Methods

each() { |str| ... } click to toggle source

If a block is given, each chunk of JSON is yielded to it. If not block is given, an Enumerator is returned.

@return [Enumerator]

# File lib/json-emitter/buffered_stream.rb, line 51
def each
  if block_given?
    buffer.each { |str|
      yield str
    }
  else
    buffer
  end
end
unbuffered() click to toggle source

Returns an unbuffered version of the stream.

@return [JsonEmitter::Stream]

# File lib/json-emitter/buffered_stream.rb, line 31
def unbuffered
  Stream.new(@enum)
end
write(io) click to toggle source

Write the stream to the specified IO object.

@param io [IO]

# File lib/json-emitter/buffered_stream.rb, line 40
def write(io)
  buffer.each { |str|
    io << str
  }
end

Private Instance Methods

buffer() click to toggle source
# File lib/json-emitter/buffered_stream.rb, line 63
def buffer
  Enumerator.new { |y|
    buff = ""
    @enum.each { |str|
      buff << str
      if buff.bytesize >= @buffer_size
        y << buff
        buff = ""
      end
    }
    y << buff unless buff.empty?
  }
end