From e8512df5042c29ecfaa36555858eb8369429fd5c Mon Sep 17 00:00:00 2001 From: WhatCats Date: Mon, 8 Apr 2024 10:05:05 +0200 Subject: [PATCH] add toFuture method --- .../tommyjs/futur/promise/AbstractPromise.java | 17 +++++++++++++---- .../java/dev/tommyjs/futur/promise/Promise.java | 3 +++ .../java/dev/tommyjs/futur/PromiseTests.java | 15 +++++++++++++++ 3 files changed, 31 insertions(+), 4 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 1e9470d..05b611e 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 @@ -10,10 +10,7 @@ import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import java.util.Collection; -import java.util.concurrent.CancellationException; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; +import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; @@ -438,4 +435,16 @@ public abstract class AbstractPromise implements Promise { return completion.get(); } + @Override + public @NotNull CompletableFuture toFuture() { + CompletableFuture future = new CompletableFuture<>(); + this.addDirectListener(future::complete, future::completeExceptionally); + future.whenComplete((res, e) -> { + if (e instanceof CancellationException) { + this.cancel(); + } + }); + return future; + } + } 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 b9bc09d..456ee84 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 @@ -8,6 +8,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.concurrent.CancellationException; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicReference; @@ -128,4 +129,6 @@ public interface Promise { boolean isCompleted(); + @NotNull CompletableFuture toFuture(); + } diff --git a/futur-api/src/test/java/dev/tommyjs/futur/PromiseTests.java b/futur-api/src/test/java/dev/tommyjs/futur/PromiseTests.java index c489766..790cf7a 100644 --- a/futur-api/src/test/java/dev/tommyjs/futur/PromiseTests.java +++ b/futur-api/src/test/java/dev/tommyjs/futur/PromiseTests.java @@ -48,6 +48,21 @@ public final class PromiseTests { assert !finished.get(); } + @Test + public void testToFuture() throws InterruptedException { + assert pfac.resolve(true).toFuture().getNow(false); + assert pfac.error(new Exception("Test")).toFuture().isCompletedExceptionally(); + + var finished = new AtomicBoolean(); + pfac.start() + .thenRunDelayedAsync(() -> finished.set(true), 50, TimeUnit.MILLISECONDS) + .toFuture() + .cancel(true); + + Thread.sleep(100L); + assert !finished.get(); + } + @Test public void testCombineUtil() throws TimeoutException { pfac.all(