code: public final Flux<Flux<T>> window(Duration windowingTimespan, Duration openWindowEvery, Scheduler timer) {
  		if (openWindowEvery.equals(windowingTimespan)) {
  			return window(windowingTimespan);
  		}
  		return windowWhen(interval(Duration.ZERO, openWindowEvery, timer), aLong -> Mono.delay(windowingTimespan, timer));
  	}
docs: Split this {@link Flux} sequence into multiple {@link Flux} windows that open
  for a given {@code windowingTimespan} {@link Duration}, after which it closes with onComplete.
  Each window is opened at a regular {@code timeShift} interval, starting from the
  first item.
  Both durations are measured on the provided {@link Scheduler}.
  
  <p>
  When windowingTimespan < openWindowEvery : dropping windows
  <p>
  <img class="marble" src="doc-files/marbles/windowWithTimespanLessThanOpenWindowEvery.svg" alt="">
  <p>
  When windowingTimespan > openWindowEvery : overlapping windows
  <p>
  <img class="marble" src="doc-files/marbles/windowWithTimespanGreaterThanOpenWindowEvery.svg" alt="">
  <p>
  When openWindowEvery == openWindowEvery : exact windows
  <p>
  <img class="marble" src="doc-files/marbles/windowWithTimespanEqualsOpenWindowEvery.svg" alt="">
  
  @reactor.discard The overlapping variant DOES NOT discard elements, as they might be part of another still valid window.
  The exact window and dropping window variants bot discard elements they internally queued for backpressure
  upon cancellation or error triggered by a data signal. The dropping window variant also discards elements in between windows.
  
  @param windowingTimespan the maximum {@link Flux} window {@link Duration}
  @param openWindowEvery the period of time at which to create new {@link Flux} windows
  @param timer a time-capable {@link Scheduler} instance to run on
  
  @return a {@link Flux} of {@link Flux} windows opened at regular intervals and
  closed after a {@link Duration}