package net.minecraft.server.level; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; import org.jspecify.annotations.Nullable; public interface ChunkResult { static ChunkResult of(final T value) { return new ChunkResult.Success<>(value); } static ChunkResult error(final String error) { return error((Supplier)(() -> error)); } static ChunkResult error(final Supplier errorSupplier) { return new ChunkResult.Fail<>(errorSupplier); } boolean isSuccess(); @Nullable T orElse(@Nullable T orElse); @Nullable static R orElse(final ChunkResult chunkResult, @Nullable final R orElse) { R result = (R)chunkResult.orElse(null); return result != null ? result : orElse; } @Nullable String getError(); ChunkResult ifSuccess(Consumer consumer); ChunkResult map(Function map); T orElseThrow(Supplier exceptionSupplier) throws E; public record Fail(Supplier error) implements ChunkResult { @Override public boolean isSuccess() { return false; } @Nullable @Override public T orElse(@Nullable final T orElse) { return orElse; } @Override public String getError() { return (String)this.error.get(); } @Override public ChunkResult ifSuccess(final Consumer consumer) { return this; } @Override public ChunkResult map(final Function map) { return new ChunkResult.Fail(this.error); } @Override public T orElseThrow(final Supplier exceptionSupplier) throws E { throw (Throwable)exceptionSupplier.get(); } } public record Success(T value) implements ChunkResult { @Override public boolean isSuccess() { return true; } @Override public T orElse(@Nullable final T orElse) { return this.value; } @Nullable @Override public String getError() { return null; } @Override public ChunkResult ifSuccess(final Consumer consumer) { consumer.accept(this.value); return this; } @Override public ChunkResult map(final Function map) { return (ChunkResult)(new ChunkResult.Success<>(map.apply(this.value))); } @Override public T orElseThrow(final Supplier exceptionSupplier) throws E { return this.value; } } }