class Falcon::Input

def close

def close
	@body.finish
end

def each(&block)

def each(&block)
	return to_enum unless block_given?
	
	while chunk = read_next
		yield chunk
	end
	
	@closed = true
end

def eof?

def eof?
	@finished and @buffer.empty?
end

def fill_buffer(length)

def fill_buffer(length)
	while @buffer.bytesize < length and chunk = read_next
		@buffer << chunk
	end
end

def gets

def gets
	read
end

def initialize(body)

def initialize(body)
	@body = body
	@chunks = []
	
	@index = 0
	@buffer = Async::IO::BinaryString.new
	@finished = false
end

def read(length = nil, buffer = nil)

def read(length = nil, buffer = nil)
	if length
		fill_buffer(length) if @buffer.bytesize <= length
		
		return @buffer.slice!(0, length)
	else
		buffer ||= Async::IO::BinaryString.new
		
		buffer << @buffer
		@buffer.clear
		
		while chunk = read_next
			buffer << chunk
		end
		
		return buffer
	end
end

def read_next

def read_next
	return nil if @finished
	
	chunk = nil
	
	if @index < @chunks.count
		chunk = @chunks[@index]
		@index += 1
	else
		if chunk = @body.read
			@chunks << chunk
			@index += 1
		end
	end
	
	@finished = true if chunk.nil?
	
	return chunk
end

def rewind

def rewind
	@index = 0
	@finished = false
	@buffer.clear
end