Class: Rubylet::RewindableIO

Inherits:
Object
  • Object
show all
Defined in:
lib/rubylet/rewindable_io.rb

Instance Method Summary collapse

Constructor Details

#initialize(io, limit = MemFileIO::DEFAULT_LIMIT) ⇒ RewindableIO

Returns a new instance of RewindableIO.



11
12
13
14
# File 'lib/rubylet/rewindable_io.rb', line 11

def initialize(io, limit = MemFileIO::DEFAULT_LIMIT)
  @buf = MemFileIO.new(limit)
  @io = TeeIO.new(io, @buf)
end

Instance Method Details

#closeObject



61
62
63
64
# File 'lib/rubylet/rewindable_io.rb', line 61

def close
  @buf.close
  @io.close
end

#eachObject



51
52
53
54
55
# File 'lib/rubylet/rewindable_io.rb', line 51

def each
  while s = gets
    yield s
  end
end

#getsObject



16
17
18
19
20
21
22
23
24
25
# File 'lib/rubylet/rewindable_io.rb', line 16

def gets
  str = @buf.gets
  if str.nil?                 # end of buffer
    @io.gets
  elsif str.end_with?($/)     # good, we got a whole line
    str
  else                        # partial line
    str + (@io.gets || '')
  end
end

#read(length = nil, buffer = nil) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/rubylet/rewindable_io.rb', line 27

def read(length = nil, buffer = nil)
  if length.nil? && buffer.nil?
    @buf.read + @io.read
  elsif length.nil?
    @buf.read(nil, buffer)
    @io.read(nil, buffer)
  elsif buffer.nil?
    str = ''
    @buf.read(length, str)
    if (str.size == length)
      @io.read(length - str.size, str)
    end
    str
  else                        # both non-nil
    size0 = buffer.size
    @buf.read(length, buffer)
    from_buf = buffer.size - size0
    if (from_buf < length)
      @io.read(length - from_buf, buffer)
    end
    buffer
  end
end

#rewindObject



57
58
59
# File 'lib/rubylet/rewindable_io.rb', line 57

def rewind
  @buf.rewind
end