code: public final <T2, O> Mono<O> zipWhen(Function<T, Mono<? extends T2>> rightGenerator,
  			BiFunction<T, T2, O> combinator) {
  		Objects.requireNonNull(rightGenerator, "rightGenerator function is mandatory to get the right-hand side Mono");
  		Objects.requireNonNull(combinator, "combinator function is mandatory to combine results from both Monos");
  		return flatMap(t -> rightGenerator.apply(t).map(t2 -> combinator.apply(t, t2)));
  	}
docs: Wait for the result from this mono, use it to create a second mono via the
  provided {@code rightGenerator} function and combine both results into an arbitrary
  {@code O} object, as defined by the provided {@code combinator} function.
  
  <p>
  <img class="marble" src="doc-files/marbles/zipWhenWithZipperForMono.svg" alt="">
  
  @param rightGenerator the {@link Function} to generate a {@code Mono} to combine with
  @param combinator a {@link BiFunction} combinator function when both sources complete
  @param <T2> the element type of the other Mono instance
  @param <O> the element type of the combination
  
  @return a new combined Mono