in util/base/src/main/java/jetbrains/jetpad/base/Asyncs.java [437:475]
private static <ResultT> ResultT get(Async<ResultT> async, Awaiter awaiter) {
final CountDownLatch latch = new CountDownLatch(1);
final AtomicReference<ResultT> result = new AtomicReference<>(null);
final AtomicReference<Throwable> error = new AtomicReference<>(null);
async.onResult(
new Consumer<ResultT>() {
@Override
public void accept(ResultT item) {
result.set(item);
latch.countDown();
}
},
new Consumer<Throwable>() {
@Override
public void accept(Throwable failure) {
error.set(failure);
latch.countDown();
}
});
try {
awaiter.await(latch);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
if (error.get() == null) {
error.set(e);
}
}
if (error.get() != null) {
if (error.get() instanceof RuntimeException) {
throw (RuntimeException) error.get();
} else if (error.get() instanceof Error) {
throw (Error) error.get();
} else {
throw new RuntimeException(error.get());
}
} else {
return result.get();
}
}