package net.minecraft.commands.execution.tasks; import java.util.List; import net.minecraft.commands.execution.CommandQueueEntry; import net.minecraft.commands.execution.EntryAction; import net.minecraft.commands.execution.ExecutionContext; import net.minecraft.commands.execution.Frame; public class ContinuationTask implements EntryAction { private final ContinuationTask.TaskProvider taskFactory; private final List

arguments; private final CommandQueueEntry selfEntry; private int index; private ContinuationTask(ContinuationTask.TaskProvider taskFactory, List

arguments, Frame frame) { this.taskFactory = taskFactory; this.arguments = arguments; this.selfEntry = new CommandQueueEntry<>(frame, this); } @Override public void execute(ExecutionContext executionContext, Frame frame) { P object = (P)this.arguments.get(this.index); executionContext.queueNext(this.taskFactory.create(frame, object)); if (++this.index < this.arguments.size()) { executionContext.queueNext(this.selfEntry); } } public static void schedule(ExecutionContext executionContext, Frame frame, List

arguments, ContinuationTask.TaskProvider taskProvider) { int i = arguments.size(); switch (i) { case 0: break; case 1: executionContext.queueNext(taskProvider.create(frame, (P)arguments.get(0))); break; case 2: executionContext.queueNext(taskProvider.create(frame, (P)arguments.get(0))); executionContext.queueNext(taskProvider.create(frame, (P)arguments.get(1))); break; default: executionContext.queueNext((new ContinuationTask<>(taskProvider, arguments, frame)).selfEntry); } } @FunctionalInterface public interface TaskProvider { CommandQueueEntry create(Frame frame, P object); } }