Flowable base reactive type.
The negotiation happens in subscription time when the upstream
calls the onSubscribe with an instance of this interface. The
downstream has then the obligation to call requestFusion(int)
with the appropriate mode before calling request().
In synchronous fusion, all upstream values are either already available or is generated
when poll() is called synchronously. When the poll() returns null,
that is the indication if a terminated stream. Downstream should not call request(long)
in this mode. In this mode, the upstream won't call the onXXX methods.
In asynchronous fusion, upstream values may become available to poll() eventually.
Upstream signals onError() and onComplete() as usual but onNext may not actually contain
the upstream value but have null instead. Downstream should treat such onNext as indication
that poll() can be called. In this mode, the downstream still has to call request(long)
to indicate it is prepared to receive more values.
The general rules for consuming the Queue interface:
poll() has to be called sequentially (from within a serializing drain-loop).poll() should be prepared to catch exceptions.poll(), poll() may return
null even if a preceding isEmpty() returned false.
Implementations should only allow calling the following methods and the rest of the
Queue interface methods should throw UnsupportedOperationException: