Sha256: 6b4c7e163e9390cafe2484a962d0b1e467ec10712c2ec1536ce5ff2f9cca7baa

Contents?: true

Size: 727 Bytes

Versions: 1

Compression:

Stored size: 727 Bytes

Contents

class IO
  # @param [String] sep Line separtor (default: $/)
  # @param [Fixnum] bufsz Buffer size (default: 8192 bytes)
  # @return [Enumerator]
  def each_line_reverse sep = $/, bufsz = 8192
    raise ArgumentError, "invalid buffer size" unless bufsz.is_a?(Integer) && bufsz > 0
    return enum_for(:each_line_reverse, sep, bufsz) unless block_given?

    buffer = ''
    seplen = sep.length

    seek 0, SEEK_END
    while pos > 0
      bytes = [bufsz, pos].min
      seek -bytes, SEEK_CUR
      buffer = read(bytes) << buffer
      seek -bytes, SEEK_CUR

      while ridx = buffer.rindex(sep, -1 - seplen)
        yield buffer.slice!((ridx + seplen)..-1)
      end
    end

    yield buffer unless buffer.empty?
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
each_line_reverse-1.0.0 lib/each_line_reverse.rb