private static <T> void yieldPromise(Iterator<? extends Promise<T>> promises, int i, BiAction<Integer, ExecResult<T>> withItem, BiFunction<Integer, ExecResult<T>, Boolean> onError, Runnable onComplete) { if (promises.hasNext()) { promises.next().result(r -> { if (r.isError()) { if (!onError.apply(i, r)) { return; } } else { withItem.execute(i, r); } yieldPromise(promises, i + 1, withItem, onError, onComplete); }); } else { onComplete.run(); } }
if (t.isError()) { Throwable thisError = t.getThrowable(); if (!error.compareAndSet(null, thisError)) {
private void receiveResult(Downstream<? super T> downstream, ExecResult<T> result) { Duration ttl = Duration.ofSeconds(0); try { ttl = ttlFunc.apply(result); } catch (Throwable e) { if (result.isError()) { //noinspection ThrowableResultOfMethodCallIgnored result.getThrowable().addSuppressed(e); } else { result = ExecResult.of(Result.error(e)); } } Instant expiresAt; if (ttl.isNegative()) { expiresAt = null; // eternal upstream = null; // release } else if (ttl.isZero()) { expiresAt = clock.instant().minus(Duration.ofSeconds(1)); } else { expiresAt = clock.instant().plus(ttl); } ref.set(new Cached<>(result, expiresAt)); pending.set(false); downstream.accept(result); tryDrain(); }
/** * Signals this downstream, based on the given result. * * @param result the result to signal */ default void accept(ExecResult<? extends T> result) { if (result.isComplete()) { complete(); } else if (result.isError()) { error(result.getThrowable()); } else { success(result.getValue()); } }