package com.faforever.client.task;
import javafx.concurrent.Task;
import org.jetbrains.annotations.NotNull;
import java.util.concurrent.CompletableFuture;
public abstract class CompletableTask<V> extends Task<V> implements PrioritizedTask<V> {
private final CompletableFuture<V> future;
private Priority priority;
public CompletableTask(Priority priority) {
this.priority = priority;
this.future = new CompletableFuture<>();
setOnCancelled(event -> future.cancel(true));
setOnFailed(event -> future.completeExceptionally(getException()));
setOnSucceeded(event -> future.complete(getValue()));
}
public CompletableFuture<V> getFuture() {
return future;
}
@Override
public int compareTo(@NotNull CompletableTask other) {
return priority.compareTo(other.priority);
}
public void setPriority(Priority priority) {
if (this.priority != null) {
throw new IllegalStateException("Priority has already been set");
}
this.priority = priority;
}
@Override
public boolean cancel(boolean mayInterruptIfRunning) {
future.cancel(mayInterruptIfRunning);
return super.cancel(mayInterruptIfRunning);
}
public enum Priority {
LOW,
MEDIUM,
HIGH
}
}