Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
oldratlee committed Feb 13, 2025
1 parent 0bf8f55 commit 917ed81
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 80 deletions.
6 changes: 4 additions & 2 deletions cffu-core/src/main/java/io/foldright/cffu/Cffu.java
Original file line number Diff line number Diff line change
Expand Up @@ -2434,7 +2434,8 @@ public boolean complete(@Nullable T value) {
*/
@Contract("_ -> this")
public Cffu<T> completeAsync(Supplier<? extends T> supplier) {
return completeAsync(supplier, fac.defaultExecutor());
// NOTE: do NOT translate executor by screenExecutor method; same as CompletableFuture.completeAsync
return completeAsync(supplier, fac.cffuExecutor.unscreenedExecutor);
}

/**
Expand Down Expand Up @@ -2472,7 +2473,8 @@ public boolean completeExceptionally(Throwable ex) {
*/
@Contract("_ -> this")
public Cffu<T> completeExceptionallyAsync(Supplier<? extends Throwable> supplier) {
return completeExceptionallyAsync(supplier, fac.defaultExecutor());
// NOTE: do NOT translate executor by screenExecutor method; same as CompletableFuture.completeAsync
return completeExceptionallyAsync(supplier, fac.cffuExecutor.unscreenedExecutor);
}

/**
Expand Down
78 changes: 40 additions & 38 deletions cffu-core/src/main/java/io/foldright/cffu/CffuFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.google.common.util.concurrent.Futures;
import edu.umd.cs.findbugs.annotations.CheckReturnValue;
import edu.umd.cs.findbugs.annotations.Nullable;
import io.foldright.cffu.CffuFactoryBuilder.CffuExecutorWrapper;
import io.foldright.cffu.tuple.Tuple2;
import io.foldright.cffu.tuple.Tuple3;
import io.foldright.cffu.tuple.Tuple4;
Expand Down Expand Up @@ -47,12 +48,12 @@ public final class CffuFactory {
// region# Builder and Constructor Methods(including internal constructors and fields)
////////////////////////////////////////////////////////////////////////////////

private final Executor defaultExecutor;
final CffuExecutorWrapper cffuExecutor;

private final boolean forbidObtrudeMethods;

CffuFactory(Executor defaultExecutor, boolean forbidObtrudeMethods) {
this.defaultExecutor = defaultExecutor;
CffuFactory(CffuExecutorWrapper cffuExecutor, boolean forbidObtrudeMethods) {
this.cffuExecutor = cffuExecutor;
this.forbidObtrudeMethods = forbidObtrudeMethods;
}

Expand Down Expand Up @@ -118,7 +119,7 @@ public <T> Cffu<T> newIncompleteCffu() {
*/
@CheckReturnValue(explanation = "should use the returned Cffu; otherwise, prefer method `runAsync`")
public <T> Cffu<T> supplyAsync(Supplier<T> supplier) {
return supplyAsync(supplier, defaultExecutor);
return supplyAsync(supplier, cffuExecutor);
}

/**
Expand All @@ -141,7 +142,7 @@ public <T> Cffu<T> supplyAsync(Supplier<T> supplier, Executor executor) {
* @param action the action to run before completing the returned Cffu
*/
public Cffu<Void> runAsync(Runnable action) {
return runAsync(action, defaultExecutor);
return runAsync(action, cffuExecutor);
}

/**
Expand Down Expand Up @@ -171,7 +172,7 @@ public Cffu<Void> runAsync(Runnable action, Executor executor) {
*/
@SafeVarargs
public final <T> Cffu<List<T>> mSupplyFailFastAsync(Supplier<? extends T>... suppliers) {
return mSupplyFailFastAsync(defaultExecutor, suppliers);
return mSupplyFailFastAsync(cffuExecutor, suppliers);
}

/**
Expand All @@ -194,7 +195,7 @@ public final <T> Cffu<List<T>> mSupplyFailFastAsync(Executor executor, Supplier<
@SafeVarargs
public final <T> Cffu<List<T>> mSupplyAllSuccessAsync(
@Nullable T valueIfFailed, Supplier<? extends T>... suppliers) {
return mSupplyAllSuccessAsync(defaultExecutor, valueIfFailed, suppliers);
return mSupplyAllSuccessAsync(cffuExecutor, valueIfFailed, suppliers);
}

/**
Expand All @@ -219,7 +220,7 @@ public final <T> Cffu<List<T>> mSupplyAllSuccessAsync(
@SafeVarargs
public final <T> Cffu<List<T>> mSupplyMostSuccessAsync(
@Nullable T valueIfNotSuccess, long timeout, TimeUnit unit, Supplier<? extends T>... suppliers) {
return mSupplyMostSuccessAsync(defaultExecutor, valueIfNotSuccess, timeout, unit, suppliers);
return mSupplyMostSuccessAsync(cffuExecutor, valueIfNotSuccess, timeout, unit, suppliers);
}

/**
Expand All @@ -243,7 +244,7 @@ public final <T> Cffu<List<T>> mSupplyMostSuccessAsync(
*/
@SafeVarargs
public final <T> Cffu<List<T>> mSupplyAsync(Supplier<? extends T>... suppliers) {
return mSupplyAsync(defaultExecutor, suppliers);
return mSupplyAsync(cffuExecutor, suppliers);
}

/**
Expand All @@ -265,7 +266,7 @@ public final <T> Cffu<List<T>> mSupplyAsync(
*/
@SafeVarargs
public final <T> Cffu<T> mSupplyAnySuccessAsync(Supplier<? extends T>... suppliers) {
return mSupplyAnySuccessAsync(defaultExecutor, suppliers);
return mSupplyAnySuccessAsync(cffuExecutor, suppliers);
}

/**
Expand All @@ -286,7 +287,7 @@ public final <T> Cffu<T> mSupplyAnySuccessAsync(Executor executor, Supplier<? ex
*/
@SafeVarargs
public final <T> Cffu<T> mSupplyAnyAsync(Supplier<? extends T>... suppliers) {
return mSupplyAnyAsync(defaultExecutor, suppliers);
return mSupplyAnyAsync(cffuExecutor, suppliers);
}

/**
Expand All @@ -306,7 +307,7 @@ public final <T> Cffu<T> mSupplyAnyAsync(Executor executor, Supplier<? extends T
* See the {@link #allFailFastOf allFailFastOf} documentation for the rules of result computation.
*/
public Cffu<Void> mRunFailFastAsync(Runnable... actions) {
return mRunFailFastAsync(defaultExecutor, actions);
return mRunFailFastAsync(cffuExecutor, actions);
}

/**
Expand All @@ -325,7 +326,7 @@ public Cffu<Void> mRunFailFastAsync(Executor executor, Runnable... actions) {
* See the {@link #allOf allOf} documentation for the rules of result computation.
*/
public Cffu<Void> mRunAsync(Runnable... actions) {
return mRunAsync(defaultExecutor, actions);
return mRunAsync(cffuExecutor, actions);
}

/**
Expand All @@ -343,7 +344,7 @@ public Cffu<Void> mRunAsync(Executor executor, Runnable... actions) {
* See the {@link #anySuccessOf anySuccessOf} documentation for the rules of result computation.
*/
public Cffu<Void> mRunAnySuccessAsync(Runnable... actions) {
return mRunAnySuccessAsync(defaultExecutor, actions);
return mRunAnySuccessAsync(cffuExecutor, actions);
}

/**
Expand All @@ -362,7 +363,7 @@ public Cffu<Void> mRunAnySuccessAsync(Executor executor, Runnable... actions) {
* See the {@link #anyOf anyOf} documentation for the rules of result computation.
*/
public Cffu<Void> mRunAnyAsync(Runnable... actions) {
return mRunAnyAsync(defaultExecutor, actions);
return mRunAnyAsync(cffuExecutor, actions);
}

/**
Expand All @@ -384,7 +385,7 @@ public Cffu<Void> mRunAnyAsync(Executor executor, Runnable... actions) {
*/
public <T1, T2> Cffu<Tuple2<T1, T2>> mSupplyTupleFailFastAsync(
Supplier<? extends T1> supplier1, Supplier<? extends T2> supplier2) {
return mSupplyTupleFailFastAsync(defaultExecutor, supplier1, supplier2);
return mSupplyTupleFailFastAsync(cffuExecutor, supplier1, supplier2);
}

/**
Expand All @@ -400,7 +401,7 @@ public <T1, T2> Cffu<Tuple2<T1, T2>> mSupplyTupleFailFastAsync(
*/
public <T1, T2, T3> Cffu<Tuple3<T1, T2, T3>> mSupplyTupleFailFastAsync(
Supplier<? extends T1> supplier1, Supplier<? extends T2> supplier2, Supplier<? extends T3> supplier3) {
return mSupplyTupleFailFastAsync(defaultExecutor, supplier1, supplier2, supplier3);
return mSupplyTupleFailFastAsync(cffuExecutor, supplier1, supplier2, supplier3);
}

/**
Expand All @@ -418,7 +419,7 @@ public <T1, T2, T3> Cffu<Tuple3<T1, T2, T3>> mSupplyTupleFailFastAsync(
public <T1, T2, T3, T4> Cffu<Tuple4<T1, T2, T3, T4>> mSupplyTupleFailFastAsync(
Supplier<? extends T1> supplier1, Supplier<? extends T2> supplier2,
Supplier<? extends T3> supplier3, Supplier<? extends T4> supplier4) {
return mSupplyTupleFailFastAsync(defaultExecutor, supplier1, supplier2, supplier3, supplier4);
return mSupplyTupleFailFastAsync(cffuExecutor, supplier1, supplier2, supplier3, supplier4);
}

/**
Expand All @@ -436,7 +437,7 @@ public <T1, T2, T3, T4> Cffu<Tuple4<T1, T2, T3, T4>> mSupplyTupleFailFastAsync(
public <T1, T2, T3, T4, T5> Cffu<Tuple5<T1, T2, T3, T4, T5>> mSupplyTupleFailFastAsync(
Supplier<? extends T1> supplier1, Supplier<? extends T2> supplier2,
Supplier<? extends T3> supplier3, Supplier<? extends T4> supplier4, Supplier<? extends T5> supplier5) {
return mSupplyTupleFailFastAsync(defaultExecutor, supplier1, supplier2, supplier3, supplier4, supplier5);
return mSupplyTupleFailFastAsync(cffuExecutor, supplier1, supplier2, supplier3, supplier4, supplier5);
}

/**
Expand All @@ -457,7 +458,7 @@ public <T1, T2, T3, T4, T5> Cffu<Tuple5<T1, T2, T3, T4, T5>> mSupplyTupleFailFas
*/
public <T1, T2> Cffu<Tuple2<T1, T2>> mSupplyAllSuccessTupleAsync(
Supplier<? extends T1> supplier1, Supplier<? extends T2> supplier2) {
return mSupplyAllSuccessTupleAsync(defaultExecutor, supplier1, supplier2);
return mSupplyAllSuccessTupleAsync(cffuExecutor, supplier1, supplier2);
}

/**
Expand All @@ -479,7 +480,7 @@ public <T1, T2> Cffu<Tuple2<T1, T2>> mSupplyAllSuccessTupleAsync(
*/
public <T1, T2, T3> Cffu<Tuple3<T1, T2, T3>> mSupplyAllSuccessTupleAsync(
Supplier<? extends T1> supplier1, Supplier<? extends T2> supplier2, Supplier<? extends T3> supplier3) {
return mSupplyAllSuccessTupleAsync(defaultExecutor, supplier1, supplier2, supplier3);
return mSupplyAllSuccessTupleAsync(cffuExecutor, supplier1, supplier2, supplier3);
}

/**
Expand All @@ -503,7 +504,7 @@ public <T1, T2, T3> Cffu<Tuple3<T1, T2, T3>> mSupplyAllSuccessTupleAsync(
public <T1, T2, T3, T4> Cffu<Tuple4<T1, T2, T3, T4>> mSupplyAllSuccessTupleAsync(
Supplier<? extends T1> supplier1, Supplier<? extends T2> supplier2,
Supplier<? extends T3> supplier3, Supplier<? extends T4> supplier4) {
return mSupplyAllSuccessTupleAsync(defaultExecutor, supplier1, supplier2, supplier3, supplier4);
return mSupplyAllSuccessTupleAsync(cffuExecutor, supplier1, supplier2, supplier3, supplier4);
}

/**
Expand All @@ -527,7 +528,7 @@ public <T1, T2, T3, T4> Cffu<Tuple4<T1, T2, T3, T4>> mSupplyAllSuccessTupleAsync
public <T1, T2, T3, T4, T5> Cffu<Tuple5<T1, T2, T3, T4, T5>> mSupplyAllSuccessTupleAsync(
Supplier<? extends T1> supplier1, Supplier<? extends T2> supplier2,
Supplier<? extends T3> supplier3, Supplier<? extends T4> supplier4, Supplier<? extends T5> supplier5) {
return mSupplyAllSuccessTupleAsync(defaultExecutor, supplier1, supplier2, supplier3, supplier4, supplier5);
return mSupplyAllSuccessTupleAsync(cffuExecutor, supplier1, supplier2, supplier3, supplier4, supplier5);
}

/**
Expand All @@ -551,7 +552,7 @@ public <T1, T2, T3, T4, T5> Cffu<Tuple5<T1, T2, T3, T4, T5>> mSupplyAllSuccessTu
*/
public <T1, T2> Cffu<Tuple2<T1, T2>> mSupplyMostSuccessTupleAsync(
long timeout, TimeUnit unit, Supplier<? extends T1> supplier1, Supplier<? extends T2> supplier2) {
return mSupplyMostSuccessTupleAsync(defaultExecutor, timeout, unit, supplier1, supplier2);
return mSupplyMostSuccessTupleAsync(cffuExecutor, timeout, unit, supplier1, supplier2);
}

/**
Expand All @@ -576,7 +577,7 @@ public <T1, T2> Cffu<Tuple2<T1, T2>> mSupplyMostSuccessTupleAsync(
public <T1, T2, T3> Cffu<Tuple3<T1, T2, T3>> mSupplyMostSuccessTupleAsync(
long timeout, TimeUnit unit,
Supplier<? extends T1> supplier1, Supplier<? extends T2> supplier2, Supplier<? extends T3> supplier3) {
return mSupplyMostSuccessTupleAsync(defaultExecutor, timeout, unit, supplier1, supplier2, supplier3);
return mSupplyMostSuccessTupleAsync(cffuExecutor, timeout, unit, supplier1, supplier2, supplier3);
}

/**
Expand All @@ -602,7 +603,7 @@ public <T1, T2, T3> Cffu<Tuple3<T1, T2, T3>> mSupplyMostSuccessTupleAsync(
public <T1, T2, T3, T4> Cffu<Tuple4<T1, T2, T3, T4>> mSupplyMostSuccessTupleAsync(
long timeout, TimeUnit unit, Supplier<? extends T1> supplier1,
Supplier<? extends T2> supplier2, Supplier<? extends T3> supplier3, Supplier<? extends T4> supplier4) {
return mSupplyMostSuccessTupleAsync(defaultExecutor, timeout, unit, supplier1, supplier2, supplier3, supplier4);
return mSupplyMostSuccessTupleAsync(cffuExecutor, timeout, unit, supplier1, supplier2, supplier3, supplier4);
}

/**
Expand All @@ -628,7 +629,7 @@ public <T1, T2, T3, T4> Cffu<Tuple4<T1, T2, T3, T4>> mSupplyMostSuccessTupleAsyn
public <T1, T2, T3, T4, T5> Cffu<Tuple5<T1, T2, T3, T4, T5>> mSupplyMostSuccessTupleAsync(
long timeout, TimeUnit unit, Supplier<? extends T1> supplier1, Supplier<? extends T2> supplier2,
Supplier<? extends T3> supplier3, Supplier<? extends T4> supplier4, Supplier<? extends T5> supplier5) {
return mSupplyMostSuccessTupleAsync(defaultExecutor, timeout, unit,
return mSupplyMostSuccessTupleAsync(cffuExecutor, timeout, unit,
supplier1, supplier2, supplier3, supplier4, supplier5);
}

Expand All @@ -652,7 +653,7 @@ public <T1, T2, T3, T4, T5> Cffu<Tuple5<T1, T2, T3, T4, T5>> mSupplyMostSuccessT
*/
public <T1, T2> Cffu<Tuple2<T1, T2>> mSupplyTupleAsync(
Supplier<? extends T1> supplier1, Supplier<? extends T2> supplier2) {
return mSupplyTupleAsync(defaultExecutor, supplier1, supplier2);
return mSupplyTupleAsync(cffuExecutor, supplier1, supplier2);
}

/**
Expand All @@ -668,7 +669,7 @@ public <T1, T2> Cffu<Tuple2<T1, T2>> mSupplyTupleAsync(
*/
public <T1, T2, T3> Cffu<Tuple3<T1, T2, T3>> mSupplyTupleAsync(
Supplier<? extends T1> supplier1, Supplier<? extends T2> supplier2, Supplier<? extends T3> supplier3) {
return mSupplyTupleAsync(defaultExecutor, supplier1, supplier2, supplier3);
return mSupplyTupleAsync(cffuExecutor, supplier1, supplier2, supplier3);
}

/**
Expand All @@ -686,7 +687,7 @@ public <T1, T2, T3> Cffu<Tuple3<T1, T2, T3>> mSupplyTupleAsync(
public <T1, T2, T3, T4> Cffu<Tuple4<T1, T2, T3, T4>> mSupplyTupleAsync(
Supplier<? extends T1> supplier1, Supplier<? extends T2> supplier2,
Supplier<? extends T3> supplier3, Supplier<? extends T4> supplier4) {
return mSupplyTupleAsync(defaultExecutor, supplier1, supplier2, supplier3, supplier4);
return mSupplyTupleAsync(cffuExecutor, supplier1, supplier2, supplier3, supplier4);
}

/**
Expand All @@ -704,7 +705,7 @@ public <T1, T2, T3, T4> Cffu<Tuple4<T1, T2, T3, T4>> mSupplyTupleAsync(
public <T1, T2, T3, T4, T5> Cffu<Tuple5<T1, T2, T3, T4, T5>> mSupplyTupleAsync(
Supplier<? extends T1> supplier1, Supplier<? extends T2> supplier2,
Supplier<? extends T3> supplier3, Supplier<? extends T4> supplier4, Supplier<? extends T5> supplier5) {
return mSupplyTupleAsync(defaultExecutor, supplier1, supplier2, supplier3, supplier4, supplier5);
return mSupplyTupleAsync(cffuExecutor, supplier1, supplier2, supplier3, supplier4, supplier5);
}

/**
Expand Down Expand Up @@ -792,7 +793,7 @@ public final <T> Cffu<List<T>> allSuccessResultsOf(
public final <T> Cffu<List<T>> mostSuccessResultsOf(
@Nullable T valueIfNotSuccess, long timeout, TimeUnit unit, CompletionStage<? extends T>... cfs) {
return create(CompletableFutureUtils.mostSuccessResultsOf(
defaultExecutor, valueIfNotSuccess, timeout, unit, cfs));
cffuExecutor, valueIfNotSuccess, timeout, unit, cfs));
}

/**
Expand Down Expand Up @@ -1015,7 +1016,7 @@ public <T1, T2, T3, T4, T5> Cffu<Tuple5<T1, T2, T3, T4, T5>> allSuccessTupleOf(
@Contract(pure = true)
public <T1, T2> Cffu<Tuple2<T1, T2>> mostSuccessTupleOf(
long timeout, TimeUnit unit, CompletionStage<? extends T1> cf1, CompletionStage<? extends T2> cf2) {
return create(CompletableFutureUtils.mostSuccessTupleOf(defaultExecutor, timeout, unit, cf1, cf2));
return create(CompletableFutureUtils.mostSuccessTupleOf(cffuExecutor, timeout, unit, cf1, cf2));
}

/**
Expand All @@ -1029,7 +1030,7 @@ public <T1, T2> Cffu<Tuple2<T1, T2>> mostSuccessTupleOf(
public <T1, T2, T3> Cffu<Tuple3<T1, T2, T3>> mostSuccessTupleOf(
long timeout, TimeUnit unit,
CompletionStage<? extends T1> cf1, CompletionStage<? extends T2> cf2, CompletionStage<? extends T3> cf3) {
return create(CompletableFutureUtils.mostSuccessTupleOf(defaultExecutor, timeout, unit, cf1, cf2, cf3));
return create(CompletableFutureUtils.mostSuccessTupleOf(cffuExecutor, timeout, unit, cf1, cf2, cf3));
}

/**
Expand All @@ -1044,7 +1045,7 @@ public <T1, T2, T3, T4> Cffu<Tuple4<T1, T2, T3, T4>> mostSuccessTupleOf(
long timeout, TimeUnit unit,
CompletionStage<? extends T1> cf1, CompletionStage<? extends T2> cf2,
CompletionStage<? extends T3> cf3, CompletionStage<? extends T4> cf4) {
return create(CompletableFutureUtils.mostSuccessTupleOf(defaultExecutor, timeout, unit, cf1, cf2, cf3, cf4));
return create(CompletableFutureUtils.mostSuccessTupleOf(cffuExecutor, timeout, unit, cf1, cf2, cf3, cf4));
}

/**
Expand All @@ -1059,7 +1060,7 @@ public <T1, T2, T3, T4, T5> Cffu<Tuple5<T1, T2, T3, T4, T5>> mostSuccessTupleOf(
long timeout, TimeUnit unit,
CompletionStage<? extends T1> cf1, CompletionStage<? extends T2> cf2, CompletionStage<? extends T3> cf3,
CompletionStage<? extends T4> cf4, CompletionStage<? extends T5> cf5) {
return create(CompletableFutureUtils.mostSuccessTupleOf(defaultExecutor, timeout, unit, cf1, cf2, cf3, cf4, cf5));
return create(CompletableFutureUtils.mostSuccessTupleOf(cffuExecutor, timeout, unit, cf1, cf2, cf3, cf4, cf5));
}

/**
Expand Down Expand Up @@ -1225,7 +1226,8 @@ public final <T> Cffu<T>[] toCffuArray(CompletionStage<T>... stages) {
*/
@Contract(pure = true)
public Executor delayedExecutor(long delay, TimeUnit unit) {
return CompletableFutureUtils.delayedExecutor(delay, unit, defaultExecutor);
// NOTE: do NOT translate executor by screenExecutor method; same as CompletableFuture.delayedExecutor
return CompletableFutureUtils.delayedExecutor(delay, unit, cffuExecutor.unscreenedExecutor);
}

/**
Expand Down Expand Up @@ -1278,7 +1280,7 @@ public static <T> Cffu<T>[] cffuListToArray(List<Cffu<T>> cffuList) {
*/
@Contract(pure = true)
public Executor defaultExecutor() {
return defaultExecutor;
return cffuExecutor.original;
}

/**
Expand Down
Loading

0 comments on commit 917ed81

Please sign in to comment.