reactor-core/src/main/java/reactor/core/publisher/Flux.java
public final Flux<List<T>> bufferUntil(Predicate<? super T> predicate) {
		return onAssembly(new FluxBufferPredicate<>(this, predicate,
				listSupplier(), FluxBufferPredicate.Mode.UNTIL));
	}
public final Flux<List<T>> bufferUntil(Predicate<? super T> predicate) {
		return onAssembly(new FluxBufferPredicate<>(this, predicate,
				listSupplier(), FluxBufferPredicate.Mode.UNTIL));
	}
Collect incoming values into multiple {@link List} buffers that will be emitted by
the resulting {@link Flux} each time the given predicate returns true. Note that
the element that triggers the predicate to return true (and thus closes a buffer)
is included as last element in the emitted buffer.
<p>
<img class="marble" src="doc-files/marbles/bufferUntil.svg" alt="">
<p>
On completion, if the latest buffer is non-empty and has not been closed it is
emitted. However, such a "partial" buffer isn't emitted in case of onError
termination.

@reactor.discard This operator discards the currently open buffer upon cancellation or error triggered by a data signal.

@param predicate a predicate that triggers the next buffer when it becomes true.
@return a microbatched {@link Flux} of {@link List}