diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java index 7e1148161..7f6911321 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java @@ -371,6 +371,10 @@ public abstract class Task { return new CoupleTask<>(null, b, true); } + public static TaskResult ofResult(Callable callable) { + return ofResult("", callable); + } + public static TaskResult ofResult(String id, Callable callable) { return new TaskCallable<>(id, callable); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/TaskResult.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/TaskResult.java index c030e94e5..e9d6fecf8 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/TaskResult.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/TaskResult.java @@ -17,6 +17,13 @@ */ package org.jackhuang.hmcl.task; +import org.jackhuang.hmcl.util.ReflectionHelper; +import org.jackhuang.hmcl.util.function.ExceptionalConsumer; +import org.jackhuang.hmcl.util.function.ExceptionalFunction; + +import java.util.Collection; +import java.util.Collections; + /** * A task that has a result. * @@ -35,4 +42,62 @@ public abstract class TaskResult extends Task { } public abstract String getId(); + + public TaskResult thenResult(ExceptionalFunction task) { + return thenResult(Schedulers.defaultScheduler(), task); + } + + public TaskResult thenResult(Scheduler scheduler, ExceptionalFunction task) { + return thenResult(ReflectionHelper.getCaller().toString(), scheduler, task); + } + + public TaskResult thenResult(String id, Scheduler scheduler, ExceptionalFunction task) { + return new Subtask<>(id, scheduler, task); + } + + public Task finalizedResult(Scheduler scheduler, ExceptionalConsumer success, ExceptionalConsumer failure) { + return finalized(scheduler, variables -> success.accept(getResult()), failure); + } + + public Task finalizedResult(Scheduler scheduler, FinalizedCallback callback) { + return new FinalizedTask(this, scheduler, + (variables, isDependentsSucceeded) -> callback.execute(getResult(), isDependentsSucceeded), + ReflectionHelper.getCaller().toString()); + } + + private class Subtask extends TaskResult { + private final String id; + private final Scheduler scheduler; + private final ExceptionalFunction callable; + + public Subtask(String id, Scheduler scheduler, ExceptionalFunction callable) { + this.id = id; + this.scheduler = scheduler; + this.callable = callable; + } + + @Override + public Collection getDependents() { + return Collections.singleton(TaskResult.this); + } + + @Override + public String getId() { + return id; + } + + @Override + public Scheduler getScheduler() { + return scheduler; + } + + @Override + public void execute() throws Exception { + setResult(callable.apply(TaskResult.this.getResult())); + } + } + + public interface FinalizedCallback { + void execute(V result, boolean isDependentsSucceeded) throws Exception; + } }