blob: 44682f9d85331a15e37fb2d269809bac5dab960c [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2016 TypeFox and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
******************************************************************************/
package org.eclipse.lsp4j.jsonrpc;
import java.util.concurrent.CancellationException;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.function.Function;
public final class CompletableFutures {
private CompletableFutures() {}
/**
* A utility method to create a {@link CompletableFuture} with cancellation support.
*
* @param code a function that accepts a {@link CancelChecker} and returns the to be computed value
* @return a future
*/
public static <R> CompletableFuture<R> computeAsync(Function<CancelChecker, R> code) {
CompletableFuture<CancelChecker> start = new CompletableFuture<>();
CompletableFuture<R> result = start.thenApplyAsync(code);
start.complete(new FutureCancelChecker(result));
return result;
}
/**
* A utility method to create a {@link CompletableFuture} with cancellation support.
*
* @param code a function that accepts a {@link CancelChecker} and returns the to be computed value
* @return a future
*/
public static <R> CompletableFuture<R> computeAsync(Executor executor, Function<CancelChecker, R> code) {
CompletableFuture<CancelChecker> start = new CompletableFuture<>();
CompletableFuture<R> result = start.thenApplyAsync(code, executor);
start.complete(new FutureCancelChecker(result));
return result;
}
public static class FutureCancelChecker implements CancelChecker {
private final CompletableFuture<?> future;
public FutureCancelChecker(CompletableFuture<?> future) {
this.future = future;
}
@Override
public void checkCanceled() {
if (future.isCancelled())
throw new CancellationException();
}
@Override
public boolean isCanceled() {
return future.isCancelled();
}
}
}