code: public final <C extends Collection<? super T>> Flux<C> buffer(int maxSize,
  			int skip, Supplier<C> bufferSupplier) {
  		return onAssembly(new FluxBuffer<>(this, maxSize, skip, bufferSupplier));
  	}
docs: Collect incoming values into multiple user-defined {@link Collection} buffers that
  will be emitted by the returned {@link Flux} each time the given max size is reached
  or once this Flux completes. Buffers can be created with gaps, as a new buffer will
  be created every time {@code skip} values have been emitted by the source
  <p>
  When maxSize < skip : dropping buffers
  <p>
  <img class="marble" src="doc-files/marbles/bufferWithMaxSizeLessThanSkipSize.svg" alt="">
  <p>
  When maxSize > skip : overlapping buffers
  <p>
  <img class="marble" src="doc-files/marbles/bufferWithMaxSizeGreaterThanSkipSize.svg" alt="">
  <p>
  When maxSize == skip : exact buffers
  <p>
  <img class="marble" src="doc-files/marbles/bufferWithMaxSizeEqualsSkipSize.svg" alt="">
  
  @reactor.discard This operator discards elements in between buffers (in the case of
  dropping buffers). It also discards the currently open buffer upon cancellation or error triggered by a data signal.
  Note however that overlapping buffer variant DOES NOT discard, as this might result in an element
  being discarded from an early buffer while it is still valid in a more recent buffer.
  
  @param skip the number of items to count before creating a new buffer
  @param maxSize the max collected size
  @param bufferSupplier a {@link Supplier} of the concrete {@link Collection} to use for each buffer
  @param <C> the {@link Collection} buffer type
  
  @return a microbatched {@link Flux} of possibly overlapped or gapped
  {@link Collection}