From 94e30f7ffbafcdd188d09d8c7bf7e4794b650018 Mon Sep 17 00:00:00 2001 From: Linnea Gräf Date: Wed, 13 Nov 2024 22:27:28 +0100 Subject: wip --- src/main/java/moe/nea/pcj/Result.java | 107 ++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 src/main/java/moe/nea/pcj/Result.java (limited to 'src/main/java/moe/nea/pcj/Result.java') diff --git a/src/main/java/moe/nea/pcj/Result.java b/src/main/java/moe/nea/pcj/Result.java new file mode 100644 index 0000000..8bec96a --- /dev/null +++ b/src/main/java/moe/nea/pcj/Result.java @@ -0,0 +1,107 @@ +package moe.nea.pcj; + +import org.jspecify.annotations.Nullable; + +import java.util.Optional; +import java.util.function.Function; + +public sealed interface Result permits Result.Ok, Result.Fail { + default boolean isOk() { + return error().isEmpty(); + } + + Optional value(); + + Optional partial(); + + default Optional valueOrPartial() { + return value().or(this::partial); + } + + Optional error(); + + default Result map(Function mapper) { + return flatMap(mapper.andThen(Result::ok)); + } + + default Result flatMap(Function> mapper) { + return flatMapBoth(mapper, Result::fail); + } + + Result flatMapBoth( + Function> mapGood, + Function> mapBad); + + Result appendError(Bad error); + + record Ok(Good okValue) implements Result { + @Override + public Result appendError(Bad error) { + return Result.partial(okValue, error); + } + + @Override + public Optional partial() { + return Optional.empty(); + } + + @Override + public Optional value() { + return Optional.of(okValue); + } + + @Override + public Optional error() { + return Optional.empty(); + } + + @Override + public Result flatMapBoth(Function> mapGood, Function> mapBad) { + return mapGood.apply(okValue); + } + } + + record Fail(@Nullable Good partialValue, Bad badValue) implements Result { + + @Override + public Optional value() { + return Optional.empty(); + } + + @Override + public Optional partial() { + return Optional.ofNullable(partialValue); + } + + @Override + public Optional error() { + return Optional.of(badValue); + } + + @Override + public Result flatMapBoth(Function> mapGood, Function> mapBad) { + if (partialValue != null) { + var nextPartial = mapGood.apply(partialValue); + return nextPartial.appendError(badValue); + } + return mapBad.apply(badValue); + } + + @Override + public Result appendError(Bad error) { + return Result.partial(partialValue, AppendableError.concatError(badValue, error)); + } + } + + static Result ok(Good value) { + return new Ok<>(value); + } + + static Result.Fail fail(Bad error) { + return new Fail<>(null, error); + } + + static Result.Fail partial(@Nullable Good partial, Bad error) { + return new Fail<>(partial, error); + } +} -- cgit