Package org.cometd.common
Class AsyncFoldLeft
java.lang.Object
org.cometd.common.AsyncFoldLeft
Processes asynchronously a sequence of elements, producing a result that is the reduction of the results produced by the processing of each element.
This class implements the asynchronous version of the following synchronous
for loop, but where the processing of each element may be asynchronous.
R result;
for (T element : list) {
(result, proceed) = operation.apply(result, element);
if (!proceed) {
break;
}
}
Using this class, the loop above becomes:
R zero;
AsyncFoldLeft.run(list, zero, (result, element, loop) -> {
CompletableFuture<R> future = processAsync(element);
future.whenComplete((r, x) -> {
if (x == null) {
R reduced = reduce(result, r);
if (shouldIterate(r)) {
loop.proceed(reduced);
} else {
loop.leave(reduced);
}
} else {
loop.fail(x);
}
})
}, Promise.complete((r, x) -> {
// Process final result or failure.
});
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic interfaceControls the iteration over a sequence of elements, allowing to continue the iteration (with a result), break out of the iteration (with a result), or fail the iteration (with an exception).static interfaceThe operation to invoke for each element. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic <T,R> void run(Collection<T> collection, R zero, AsyncFoldLeft.Operation<T, R> operation, org.cometd.bayeux.Promise<R> promise) Processes the givencollectionof elements.static <T,R> void run(T[] array, R zero, AsyncFoldLeft.Operation<T, R> operation, org.cometd.bayeux.Promise<R> promise)
-
Constructor Details
-
AsyncFoldLeft
public AsyncFoldLeft()
-
-
Method Details
-
run
public static <T,R> void run(T[] array, R zero, AsyncFoldLeft.Operation<T, R> operation, org.cometd.bayeux.Promise<R> promise) -
run
public static <T,R> void run(Collection<T> collection, R zero, AsyncFoldLeft.Operation<T, R> operation, org.cometd.bayeux.Promise<R> promise) Processes the given
collectionof elements.The initial result
zerois returned if the collection is empty.For each element the
operationfunction is invoked.The
collectionshould have a "stable" iterator, i.e. it should not be affected if the collection is modified concurrently by another thread, or by the same thread in thoperationduring the iteration.- Type Parameters:
T- the type of elementR- the type of the result- Parameters:
collection- the elements to processzero- the initial resultoperation- the operation to invoke for each elementpromise- the promise to notify of the final result
-