private static Async parallel()

in util/base/src/main/java/jetbrains/jetpad/base/Asyncs.java [237:279]


  private static Async<Void> parallel(Collection<? extends Async<?>> asyncs, final boolean alwaysSucceed,
      final ParallelData parallelData) {
    if (asyncs.isEmpty()) {
      return Asyncs.constant(null);
    }

    final ResolvableAsync<Void> result = parallelData.getResultAsync();
    final Runnable checkTermination = new Runnable() {
      @Override
      public void run() {
        if (parallelData.decrementInProgressAndGet() == 0) {
          List<Throwable> exceptions = parallelData.getExceptions();
          if (!exceptions.isEmpty() && !alwaysSucceed) {
            if (exceptions.size() == 1) {
              result.failure(exceptions.get(0));
            } else {
              result.failure(new ThrowableCollectionException(exceptions));
            }
          } else {
            result.success(null);
          }
        }
      }
    };

    for (Async<?> a : asyncs) {
      a.onResult(new Consumer<Object>() {
          @Override
          public void accept(Object item) {
            checkTermination.run();
          }
        },
        new Consumer<Throwable>() {
          @Override
          public void accept(Throwable failure) {
            parallelData.addException(failure);
            checkTermination.run();
          }
        });
    }

    return result;
  }