/**
*
* Copyright (c) 2006-2017, Speedment, Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); You may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.speedment.tool.core.internal.util;
import java.lang.reflect.Array;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.BinaryOperator;
import static com.speedment.runtime.core.util.StaticClassUtil.instanceNotAllowed;
/**
*
* @author Simon Jonasson
* @author Emil Forslund
*
* @since 3.0.0
*/
public final class CompletableFutureUtil {
@SafeVarargs
public static <T> CompletableFuture<T> allOf(
T defaultValue,
BinaryOperator<T> merger,
CompletableFuture<T>... futures) {
@SuppressWarnings("unchecked")
final CompletableFuture<Void>[] accumulators
= (CompletableFuture<Void>[]) Array.newInstance(
CompletableFuture.class,
futures.length
);
final AtomicReference<T> result = new AtomicReference<>(defaultValue);
for (int i = 0; i < futures.length; i++) {
final CompletableFuture<T> future = futures[i];
accumulators[i] = future.thenAcceptAsync(r -> result.accumulateAndGet(r, merger));
}
return CompletableFuture.allOf(accumulators)
.thenApplyAsync(v -> result.get());
}
/**
* This should never be called.
*/
private CompletableFutureUtil() {
instanceNotAllowed(getClass());
}
}