From e4e61c4b6c2759efe8e934b54894f28f00386f8e Mon Sep 17 00:00:00 2001 From: tommyskeff Date: Thu, 9 Jan 2025 20:21:41 +0000 Subject: [PATCH] a few more post-complete optimizations --- .../futur/promise/AbstractPromise.java | 30 ++++++++++++++----- .../futur/promise/CompletedPromise.java | 5 ++++ 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/futur-api/src/main/java/dev/tommyjs/futur/promise/AbstractPromise.java b/futur-api/src/main/java/dev/tommyjs/futur/promise/AbstractPromise.java index b6a1bc1..aa64c85 100644 --- a/futur-api/src/main/java/dev/tommyjs/futur/promise/AbstractPromise.java +++ b/futur-api/src/main/java/dev/tommyjs/futur/promise/AbstractPromise.java @@ -86,9 +86,14 @@ public abstract class AbstractPromise implements Promise { @Override public @NotNull Promise fork() { - CompletablePromise fork = getFactory().unresolved(); - PromiseUtil.propagateCompletion(this, fork); - return fork; + PromiseCompletion completion = getCompletion(); + if (completion == null) { + CompletablePromise fork = getFactory().unresolved(); + PromiseUtil.propagateCompletion(this, fork); + return fork; + } else { + return this; + } } @Override @@ -446,9 +451,20 @@ public abstract class AbstractPromise implements Promise { @Override public @NotNull Promise orDefault(@NotNull ExceptionalFunction function) { - CompletablePromise promise = createLinked(); - addDirectListener(promise::complete, e -> runCompleter(promise, () -> promise.complete(function.apply(e)))); - return promise; + PromiseCompletion completion = getCompletion(); + if (completion == null) { + CompletablePromise promise = createLinked(); + addDirectListener(promise::complete, e -> runCompleter(promise, () -> promise.complete(function.apply(e)))); + return promise; + } else if (completion.isSuccess()) { + return getFactory().resolve(completion.getResult()); + } else { + try { + return getFactory().resolve(function.apply(completion.getException())); + } catch (Exception e) { + return getFactory().error(e); + } + } } @Override @@ -457,7 +473,7 @@ public abstract class AbstractPromise implements Promise { addDirectListener(future::complete, future::completeExceptionally); future.whenComplete((_, e) -> { if (e instanceof CancellationException) { - this.cancel(); + cancel(); } }); diff --git a/futur-api/src/main/java/dev/tommyjs/futur/promise/CompletedPromise.java b/futur-api/src/main/java/dev/tommyjs/futur/promise/CompletedPromise.java index 18aaeee..ba91627 100644 --- a/futur-api/src/main/java/dev/tommyjs/futur/promise/CompletedPromise.java +++ b/futur-api/src/main/java/dev/tommyjs/futur/promise/CompletedPromise.java @@ -55,6 +55,11 @@ public abstract class CompletedPromise extends AbstractPromise fork() { + return this; + } + @Override public @NotNull PromiseCompletion getCompletion() { return completion;