code: @Contract(pure = true)
  	@NotNull
  	@SuppressWarnings("unchecked")
  	public static <T> Promise<List<T>> toList(@NotNull List<? extends Promise<? extends T>> promises) {
  		int size = promises.size();
  		if (size == 0) return Promise.of(Collections.emptyList());
  		if (size == 1) return promises.get(0).map(Collections::singletonList);
  		if (size == 2) return promises.get(0).combine(promises.get(1), Arrays::asList);
  
  		@SuppressWarnings("unchecked") PromiseToList<T> resultPromise = new PromiseToList<>((T[]) new Object[size]);
  
  		for (int i = 0; i < size; i++) {
  			Promise<? extends T> promise = promises.get(i);
  			if (promise.isResult()) {
  				resultPromise.accumulator[i] = promise.materialize().getResult();
  				continue;
  			}
  			if (promise.isException()) return Promise.ofException(promise.materialize().getException());
  			int index = i;
  			resultPromise.countdown++;
  			promise.whenComplete((result, e) -> {
  				if (e == null) {
  					resultPromise.processComplete(result, index);
  				} else {
  					resultPromise.tryCompleteExceptionally(e);
  				}
  			});
  		}
  		return resultPromise.countdown != 0 ? resultPromise : Promise.of(((List<T>) asList(resultPromise.accumulator)));
  	}
docs: Reduces list of {@code Promise}s into Promise&lt;List&gt;.