From 4251f2fd82b5189032fc6eddef948ce8955482e8 Mon Sep 17 00:00:00 2001 From: WhatCats Date: Sat, 25 May 2024 21:17:14 +0200 Subject: [PATCH] add more direct listener methods --- .../futur/promise/AbstractPromise.java | 52 +++++++++++++++++++ .../dev/tommyjs/futur/promise/Promise.java | 10 ++++ 2 files changed, 62 insertions(+) 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);