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 351e1b4..bb823eb 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 @@ -103,6 +103,58 @@ public abstract class AbstractPromise implements Promise { return completion.getResult(); } + @Override + public @NotNull Promise thenRun(@NotNull ExceptionalRunnable task) { + return thenApply(result -> { + task.run(); + return null; + }); + } + + @Override + public @NotNull Promise thenConsume(@NotNull ExceptionalConsumer task) { + return thenApply(result -> { + task.accept(result); + return null; + }); + } + + @Override + public @NotNull Promise thenSupply(@NotNull ExceptionalSupplier task) { + return thenApply(result -> task.get()); + } + + @Override + public @NotNull Promise thenApply(@NotNull ExceptionalFunction task) { + Promise promise = getFactory().unresolved(); + addDirectListener( + res -> createRunnable(res, promise, task).run(), + promise::completeExceptionally + ); + + propagateCancel(promise, this); + return promise; + } + + @Override + public @NotNull Promise thenCompose(@NotNull ExceptionalFunction> task) { + Promise promise = getFactory().unresolved(); + thenApply(task).addDirectListener( + nestedPromise -> { + if (nestedPromise == null) { + promise.complete(null); + } else { + propagateResult(nestedPromise, promise); + propagateCancel(promise, nestedPromise); + } + }, + promise::completeExceptionally + ); + + propagateCancel(promise, this); + return promise; + } + @Override public @NotNull Promise thenRunSync(@NotNull ExceptionalRunnable task) { return thenApplySync(result -> { diff --git a/futur-api/src/main/java/dev/tommyjs/futur/promise/Promise.java b/futur-api/src/main/java/dev/tommyjs/futur/promise/Promise.java index 52f6e1f..1fc93f4 100644 --- a/futur-api/src/main/java/dev/tommyjs/futur/promise/Promise.java +++ b/futur-api/src/main/java/dev/tommyjs/futur/promise/Promise.java @@ -19,6 +19,16 @@ public interface Promise { PromiseFactory getFactory(); + @NotNull Promise thenRun(@NotNull ExceptionalRunnable task); + + @NotNull Promise thenConsume(@NotNull ExceptionalConsumer task); + + @NotNull Promise thenSupply(@NotNull ExceptionalSupplier task); + + @NotNull Promise thenApply(@NotNull ExceptionalFunction task); + + @NotNull Promise thenCompose(@NotNull ExceptionalFunction> task); + @NotNull Promise thenRunSync(@NotNull ExceptionalRunnable task); @NotNull Promise thenRunDelayedSync(@NotNull ExceptionalRunnable task, long delay, @NotNull TimeUnit unit);