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(() -> error); } static ChunkResult error(final Supplier errorSupplier) { return new ChunkResult.Fail<>(errorSupplier); } boolean isSuccess(); @Nullable T orElse(@Nullable T orElse); static @Nullable R orElse(final ChunkResult chunkResult, final @Nullable 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; record Fail(Supplier error) implements ChunkResult { @Override public boolean isSuccess() { return false; } @Override public @Nullable T orElse(final @Nullable T orElse) { return orElse; } @Override public String getError() { return 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 exceptionSupplier.get(); } } record Success(T value) implements ChunkResult { @Override public boolean isSuccess() { return true; } @Override public T orElse(final @Nullable T orElse) { return this.value; } @Override public @Nullable 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 new ChunkResult.Success<>(map.apply(this.value)); } @Override public T orElseThrow(final Supplier exceptionSupplier) throws E { return this.value; } } }