class Async::HTTP::Body::Writable

A dynamic body which you can write to and read from.

def empty?

Has the producer called #finish and has the reader consumed the nil token?
def empty?
	@finished
end

def finish

Signal that output has finished. This must be called at least once.
def finish
	@queue.enqueue(nil)
end

def initialize

def initialize
	@queue = Async::Queue.new
	
	@count = 0
	
	@finished = false
	@stopped = nil
end

def inspect

def inspect
	"\#<#{self.class} #{@count} chunks written#{@finished ? ', finished' : ''}>"
end

def read

Read the next available chunk.
def read
	# I'm not sure if this is a good idea.
	# if @stopped
	# 	raise @stopped
	# end
	
	return if @finished
	
	unless chunk = @queue.dequeue
		@finished = true
	end
	
	return chunk
end

def stop(error)

Stop generating output; cause the next call to write to fail with the given error.
def stop(error)
	@stopped ||= error
end

def write(chunk)

Write a single chunk to the body. Signal completion by calling `#finish`.
def write(chunk)
	# If the reader breaks, the writer will break.
	# The inverse of this is less obvious (*)
	if @stopped
		raise @stopped
	end
	
	# TODO should this yield if the queue is full?
	
	@count += 1
	@queue.enqueue(chunk)
end