From ed8eb00566a5e3b7f2d5564d7977a4b3ec8fe5b3 Mon Sep 17 00:00:00 2001 From: Linnea Gräf Date: Thu, 14 Nov 2024 01:35:24 +0100 Subject: wip --- src/main/java/moe/nea/pcj/Result.java | 78 +++++++++++++++++++++++------------ 1 file changed, 51 insertions(+), 27 deletions(-) (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 index 8bec96a..e43633b 100644 --- a/src/main/java/moe/nea/pcj/Result.java +++ b/src/main/java/moe/nea/pcj/Result.java @@ -2,12 +2,15 @@ package moe.nea.pcj; import org.jspecify.annotations.Nullable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.Optional; import java.util.function.Function; public sealed interface Result permits Result.Ok, Result.Fail { default boolean isOk() { - return error().isEmpty(); + return errors().isEmpty(); } Optional value(); @@ -18,26 +21,31 @@ public sealed interface Result permits Result.Ok, Result.Fail { return value().or(this::partial); } - Optional error(); + List errors(); default Result map(Function mapper) { return flatMap(mapper.andThen(Result::ok)); } - default Result flatMap(Function> mapper) { - return flatMapBoth(mapper, Result::fail); + Result flatMap(Function> mapper); + + default Result mapError(Function mapper) { + return mapErrors(it -> it.stream().map(mapper).toList()); } - Result flatMapBoth( - Function> mapGood, - Function> mapBad); + Result mapErrors(Function, List> mapper); - Result appendError(Bad error); + Result appendErrors(List error); record Ok(Good okValue) implements Result { @Override - public Result appendError(Bad error) { - return Result.partial(okValue, error); + public Result appendErrors(List errors) { + return new Fail<>(okValue, errors); + } + + @Override + public Result mapErrors(Function, List> mapper) { + return new Ok<>(okValue); } @Override @@ -46,22 +54,26 @@ public sealed interface Result permits Result.Ok, Result.Fail { } @Override - public Optional value() { - return Optional.of(okValue); + public List errors() { + return List.of(); } @Override - public Optional error() { - return Optional.empty(); + public Result flatMap(Function> mapper) { + return Result.cast(mapper.apply(okValue)); } @Override - public Result flatMapBoth(Function> mapGood, Function> mapBad) { - return mapGood.apply(okValue); + public Optional value() { + return Optional.of(okValue); } } - record Fail(@Nullable Good partialValue, Bad badValue) implements Result { + record Fail(@Nullable Good partialValue, List badValue) implements Result { + public Fail { + if (badValue.isEmpty()) + throw new IllegalArgumentException("Cannot create failure without any error values"); + } @Override public Optional value() { @@ -74,22 +86,28 @@ public sealed interface Result permits Result.Ok, Result.Fail { } @Override - public Optional error() { - return Optional.of(badValue); + public List errors() { + return Collections.unmodifiableList(badValue); } @Override - public Result flatMapBoth(Function> mapGood, Function> mapBad) { + public Result flatMap(Function> mapper) { if (partialValue != null) { - var nextPartial = mapGood.apply(partialValue); - return nextPartial.appendError(badValue); + return Result.cast(mapper.apply(partialValue)).appendErrors(badValue); } - return mapBad.apply(badValue); + return new Fail<>(null, badValue); + } + + @Override + public Result mapErrors(Function, List> mapper) { + return new Fail<>(partialValue, mapper.apply(badValue)); } @Override - public Result appendError(Bad error) { - return Result.partial(partialValue, AppendableError.concatError(badValue, error)); + public Result appendErrors(List errors) { + var nextErrors = new ArrayList<>(badValue); + nextErrors.addAll(errors); + return new Fail<>(partialValue, nextErrors); } } @@ -98,10 +116,16 @@ public sealed interface Result permits Result.Ok, Result.Fail { } static Result.Fail fail(Bad error) { - return new Fail<>(null, error); + return new Fail<>(null, List.of(error)); + } + + + static Result cast(Result c) { + //noinspection unchecked + return (Result) c; } static Result.Fail partial(@Nullable Good partial, Bad error) { - return new Fail<>(partial, error); + return new Fail<>(partial, List.of(error)); } } -- cgit