code: public static <T1, T2, O> Mono<O> zip(Mono<? extends T1> p1, Mono<?
  			extends T2> p2, BiFunction<? super T1, ? super T2, ? extends O> combinator) {
  		return onAssembly(new MonoZip<T1, O>(false, p1, p2, combinator));
  	}
docs: Merge given monos into a new {@literal Mono} that will be fulfilled when all of the given {@literal Monos}
  have produced an item, aggregating their values as defined by the combinator function.
  An error or <strong>empty</strong> completion of any source will cause other sources
  to be cancelled and the resulting Mono to immediately error or complete, respectively.
  
  <p>
  <img class="marble" src="doc-files/marbles/zipTwoSourcesWithZipperForMono.svg" alt="">
  <p>
  @param p1 The first upstream {@link Publisher} to subscribe to.
  @param p2 The second upstream {@link Publisher} to subscribe to.
  @param combinator a {@link BiFunction} combinator function when both sources
  complete
  @param <T1> type of the value from p1
  @param <T2> type of the value from p2
  @param <O> output value
  
  @return a {@link Mono}.