package net.minecraft.util.thread; import com.mojang.datafixers.util.Either; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; import java.util.function.Function; public interface ProcessorHandle extends AutoCloseable { String name(); void tell(Msg task); default void close() { } default CompletableFuture ask(Function, ? extends Msg> task) { CompletableFuture completableFuture = new CompletableFuture(); Msg object = (Msg)task.apply(of("ask future procesor handle", completableFuture::complete)); this.tell(object); return completableFuture; } default CompletableFuture askEither(Function>, ? extends Msg> task) { CompletableFuture completableFuture = new CompletableFuture(); Msg object = (Msg)task.apply(of("ask future procesor handle", either -> { either.ifLeft(completableFuture::complete); either.ifRight(completableFuture::completeExceptionally); })); this.tell(object); return completableFuture; } static ProcessorHandle of(String name, Consumer task) { return new ProcessorHandle() { @Override public String name() { return name; } @Override public void tell(Msg task) { task.accept(task); } public String toString() { return name; } }; } }