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;
}