44 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.util;
 | |
| 
 | |
| import com.mojang.logging.LogUtils;
 | |
| import java.util.concurrent.CancellationException;
 | |
| import java.util.concurrent.CompletableFuture;
 | |
| import java.util.concurrent.CompletionException;
 | |
| import java.util.concurrent.Executor;
 | |
| import java.util.function.Consumer;
 | |
| import org.slf4j.Logger;
 | |
| 
 | |
| public class FutureChain implements TaskChainer, AutoCloseable {
 | |
| 	private static final Logger LOGGER = LogUtils.getLogger();
 | |
| 	private CompletableFuture<?> head = CompletableFuture.completedFuture(null);
 | |
| 	private final Executor executor;
 | |
| 	private volatile boolean closed;
 | |
| 
 | |
| 	public FutureChain(Executor executor) {
 | |
| 		this.executor = executor;
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public <T> void append(CompletableFuture<T> completableFuture, Consumer<T> consumer) {
 | |
| 		this.head = this.head.thenCombine(completableFuture, (object, object2) -> object2).thenAcceptAsync(object -> {
 | |
| 			if (!this.closed) {
 | |
| 				consumer.accept(object);
 | |
| 			}
 | |
| 		}, this.executor).exceptionally(throwable -> {
 | |
| 			if (throwable instanceof CompletionException completionException) {
 | |
| 				throwable = completionException.getCause();
 | |
| 			}
 | |
| 
 | |
| 			if (throwable instanceof CancellationException cancellationException) {
 | |
| 				throw cancellationException;
 | |
| 			} else {
 | |
| 				LOGGER.error("Chain link failed, continuing to next one", throwable);
 | |
| 				return null;
 | |
| 			}
 | |
| 		});
 | |
| 	}
 | |
| 
 | |
| 	public void close() {
 | |
| 		this.closed = true;
 | |
| 	}
 | |
| }
 |