code: private static <T> Promise<Void> loop(@Nullable T seed, @NotNull Predicate<T> loopCondition, @NotNull Function<T, Promise<T>> next) {
  		return until(seed, next, (Predicate<T>) v -> !loopCondition.test(v)).toVoid();
  	}
docs: Repeats provided {@link Function} until can pass {@link Predicate} test.
  Resembles a simple Java {@code for()} loop but with async capabilities.
  
  @param seed          start value
  @param loopCondition a boolean function which checks if this loop can continue
  @param next          a function applied to the seed, returns {@code Promise}
  @return {@link SettablePromise} with {@code null} result if it was
  completed successfully, otherwise returns a {@code SettablePromise}
  with an exception. In both situations returned {@code Promise}
  is a marker of completion of the loop.