|
|
@@ -0,0 +1,63 @@
|
|
|
+package org.leumasjaffe.container.functional;
|
|
|
+
|
|
|
+import java.util.Objects;
|
|
|
+import java.util.function.Consumer;
|
|
|
+import java.util.function.Function;
|
|
|
+import java.util.function.Supplier;
|
|
|
+
|
|
|
+import org.leumasjaffe.container.Either;
|
|
|
+
|
|
|
+import lombok.AccessLevel;
|
|
|
+import lombok.AllArgsConstructor;
|
|
|
+import lombok.experimental.FieldDefaults;
|
|
|
+
|
|
|
+@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
|
|
|
+@AllArgsConstructor(access=AccessLevel.PRIVATE)
|
|
|
+public class Result<T, E extends Exception> {
|
|
|
+ Either<T, E> impl;
|
|
|
+
|
|
|
+ public static <T, E extends Exception> Result<T, E> of(T value) {
|
|
|
+ return new Result<>(Either.ofLeft(value));
|
|
|
+ }
|
|
|
+
|
|
|
+ public static <T, E extends Exception> Result<T, E> except(E exception) {
|
|
|
+ return new Result<>(Either.ofRight(exception));
|
|
|
+ }
|
|
|
+
|
|
|
+ @SuppressWarnings("unchecked")
|
|
|
+ public static <T, E extends Exception> Result<T, E> maybe(ThrowingSupplier<T, E> supplier) {
|
|
|
+ T value = null;
|
|
|
+ Objects.requireNonNull(supplier);
|
|
|
+ try {
|
|
|
+ value = supplier.get();
|
|
|
+ } catch (Exception exception) {
|
|
|
+ return except((E) exception);
|
|
|
+ }
|
|
|
+ return of(value);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static <T, R, E extends Exception> Function<T, Result<R, E>> maybe(ThrowingFunction<T, R, E> function) {
|
|
|
+ Objects.requireNonNull(function);
|
|
|
+ return input -> maybe(() -> function.apply(input));
|
|
|
+ }
|
|
|
+
|
|
|
+ public <R> Result<R, E> map(final Function<T, R> transform) {
|
|
|
+ return new Result<>(impl.mapLeft(transform));
|
|
|
+ }
|
|
|
+
|
|
|
+ public T orNull(final Consumer<E> handler) {
|
|
|
+ return impl.unify(t -> t, (e) -> { handler.accept(e); return null; });
|
|
|
+ }
|
|
|
+
|
|
|
+ public T or(final T ifException, final Consumer<E> handler) {
|
|
|
+ return impl.unify(t -> t, (e) -> { handler.accept(e); return ifException; });
|
|
|
+ }
|
|
|
+
|
|
|
+ public T or(final Supplier<T> ifException, final Consumer<E> handler) {
|
|
|
+ return impl.unify(t -> t, (e) -> { handler.accept(e); return ifException.get(); });
|
|
|
+ }
|
|
|
+
|
|
|
+ public void consume(final Consumer<T> success, final Consumer<E> failure) {
|
|
|
+ impl.consume(success, failure);
|
|
|
+ }
|
|
|
+}
|