module IO::Stream::Readable

def peek(size = nil)

@returns [String] The data in the buffer without consuming it.
@parameter size [Integer | Nil] The number of bytes to peek at. If nil, peek at all available data.
Peek at data in the buffer without consuming it.
def peek(size = nil)
	if size
		until @finished or @read_buffer.bytesize >= size
			# Compute the amount of data we need to read from the underlying stream:
			read_size = size - @read_buffer.bytesize
			
			# Don't read less than @minimum_read_size to avoid lots of small reads:
			fill_read_buffer(read_size > @minimum_read_size ? read_size : @minimum_read_size)
		end
		return @read_buffer[..([size, @read_buffer.size].min - 1)]
	end
	until (block_given? && yield(@read_buffer)) or @finished
		fill_read_buffer
	end
	return @read_buffer
end