diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 41c70a7..0000000 Binary files a/.mvn/wrapper/maven-wrapper.jar and /dev/null differ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 9dda3b6..0000000 --- a/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1 +0,0 @@ -distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.2/apache-maven-3.5.2-bin.zip diff --git a/.travis.yml b/.travis.yml index fcd939b..65b9122 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,4 +5,4 @@ cache: directories: - "$HOME/.m2" install: true -script: "./mvnw -B -U clean install" +script: "mvn -B -U clean install" diff --git a/CHANGELOG b/CHANGELOG index 170e31b..5362e87 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,18 @@ CHANGELOG ========= +0.12.0 +------ + +* Add Result.reduce(Result,BinaryOperator) +* Rename Result.invert() as Result.swap() +* [admin] pom: update urls to github +* [admin] travis: don't use maven wrapper +* [admin] Remove maven wrapper +* Bump lombok from 1.18.0 to 1.18.2 +* Bump assertj-core from 3.10.0 to 3.11.0 +* Bump tiles-maven-plugin from 2.11 to 2.12 + 0.11.0 ------ diff --git a/mvnw b/mvnw deleted file mode 100755 index e96ccd5..0000000 --- a/mvnw +++ /dev/null @@ -1,227 +0,0 @@ -#!/bin/sh -# ---------------------------------------------------------------------------- -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Maven2 Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# -# Optional ENV vars -# ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files -# ---------------------------------------------------------------------------- - -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" - fi - fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` - fi -fi - -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" - - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" - # TODO classpath? -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` - fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR -fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` -fi - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd deleted file mode 100755 index 48c810e..0000000 --- a/mvnw.cmd +++ /dev/null @@ -1,143 +0,0 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM http://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven2 Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" - -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% diff --git a/pom.xml b/pom.xml index 92fc627..636d1f9 100644 --- a/pom.xml +++ b/pom.xml @@ -17,17 +17,17 @@ TypeAlias, Result and Maybe for Java - https://gitlab.com/kemitix/mon/issues - GitLab Issues + https://github.com/kemitix/mon/issues + github Issues - https://gitlab.com/kemitix/mon - scm:git:https://gitlab.com/kemitix/mon.git - scm:git:git@gitlab.com:kemitix/mon.git + https://github.com/kemitix/mon + scm:git:https://github.com/kemitix/mon.git + scm:git:git@github.com:kemitix/mon.git - https://gitlab.com/kemitix/mon + https://github.com/kemitix/mon 2017 diff --git a/src/main/java/net/kemitix/mon/experimental/either/Left.java b/src/main/java/net/kemitix/mon/experimental/either/Left.java index 5de5904..1bfdc88 100644 --- a/src/main/java/net/kemitix/mon/experimental/either/Left.java +++ b/src/main/java/net/kemitix/mon/experimental/either/Left.java @@ -21,7 +21,6 @@ package net.kemitix.mon.experimental.either; -import lombok.Getter; import lombok.RequiredArgsConstructor; import java.util.function.Consumer; @@ -37,13 +36,18 @@ import java.util.function.Function; @RequiredArgsConstructor class Left implements Either { - @Getter - private final boolean left = true; - @Getter - private final boolean right = false; - private final L value; + @Override + public boolean isLeft() { + return true; + } + + @Override + public boolean isRight() { + return false; + } + @Override public void match(final Consumer onLeft, final Consumer onRight) { onLeft.accept(value); diff --git a/src/main/java/net/kemitix/mon/experimental/either/Right.java b/src/main/java/net/kemitix/mon/experimental/either/Right.java index 35f1baf..0085b86 100644 --- a/src/main/java/net/kemitix/mon/experimental/either/Right.java +++ b/src/main/java/net/kemitix/mon/experimental/either/Right.java @@ -21,7 +21,6 @@ package net.kemitix.mon.experimental.either; -import lombok.Getter; import lombok.RequiredArgsConstructor; import java.util.function.Consumer; @@ -37,13 +36,18 @@ import java.util.function.Function; @RequiredArgsConstructor class Right implements Either { - @Getter - private final boolean left = false; - @Getter - private final boolean right = true; - private final R value; + @Override + public boolean isLeft() { + return false; + } + + @Override + public boolean isRight() { + return true; + } + @Override public void match(final Consumer onLeft, final Consumer onRight) { onRight.accept(value); diff --git a/src/main/java/net/kemitix/mon/result/Err.java b/src/main/java/net/kemitix/mon/result/Err.java index 65fcb96..61a46f1 100644 --- a/src/main/java/net/kemitix/mon/result/Err.java +++ b/src/main/java/net/kemitix/mon/result/Err.java @@ -26,6 +26,7 @@ import net.kemitix.mon.maybe.Maybe; import java.util.Objects; import java.util.concurrent.Callable; +import java.util.function.BinaryOperator; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; @@ -101,6 +102,11 @@ class Err implements Result { return this; } + @Override + public Result reduce(final Result identify, final BinaryOperator operator) { + return Result.error(error); + } + @Override public boolean equals(final Object other) { return other instanceof Err && Objects.equals(error, ((Err) other).error); diff --git a/src/main/java/net/kemitix/mon/result/Result.java b/src/main/java/net/kemitix/mon/result/Result.java index 4240f67..f746df2 100644 --- a/src/main/java/net/kemitix/mon/result/Result.java +++ b/src/main/java/net/kemitix/mon/result/Result.java @@ -25,10 +25,7 @@ import net.kemitix.mon.Functor; import net.kemitix.mon.maybe.Maybe; import java.util.concurrent.Callable; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.function.Supplier; +import java.util.function.*; /** * An Either type for holding a result or an error (Throwable). @@ -63,17 +60,6 @@ public interface Result extends Functor> { return new Err<>(error); } - /** - * Create a Result for a success. - * - * @param value the value - * @param the type of the value - * @return a successful Result - */ - static Result ok(final T value) { - return new Success<>(value); - } - /** * Create a Result for a output of the Callable. * @@ -90,6 +76,17 @@ public interface Result extends Functor> { } } + /** + * Create a Result for a success. + * + * @param value the value + * @param the type of the value + * @return a successful Result + */ + static Result ok(final T value) { + return new Success<>(value); + } + /** * Creates a {@link Maybe} from the Result, where the Result is a success, then the Maybe will contain the value. * @@ -108,6 +105,15 @@ public interface Result extends Functor> { } } + /** + * Extracts the successful value from the result, or throws the error Throwable. + * + * @return the value if a success + * @throws Throwable the result is an error + */ + @SuppressWarnings("illegalthrows") + T orElseThrow() throws Throwable; + /** * Swaps the inner Result of a Maybe, so that a Result is on the outside. * @@ -117,11 +123,20 @@ public interface Result extends Functor> { * original Maybe. If the original Maybe is Nothing, the Result will contain Nothing. If the original Result was an * error, then the Result will also be an error. */ - static Result> invert(final Maybe> maybeResult) { + static Result> swap(final Maybe> maybeResult) { return maybeResult.orElseGet(() -> Result.ok(null)) .flatMap(value -> Result.ok(Maybe.maybe(value))); } + /** + * Returns a new Result consisting of the result of applying the function to the contents of the Result. + * + * @param f the mapping function the produces a Result + * @param the type of the value withing the Result of the mapping function + * @return a Result + */ + Result flatMap(Function> f); + /** * Applies the function to the contents of a Maybe within the Result. * @@ -131,7 +146,10 @@ public interface Result extends Functor> { * @param the type of the updated Result * @return a new Maybe within a Result */ - static Result> flatMapMaybe(Result> maybeResult, Function, Result>> f) { + static Result> flatMapMaybe( + final Result> maybeResult, + final Function, Result>> f + ) { return maybeResult.flatMap(f); } @@ -149,15 +167,6 @@ public interface Result extends Functor> { */ boolean isOkay(); - /** - * Returns a new Result consisting of the result of applying the function to the contents of the Result. - * - * @param f the mapping function the produces a Result - * @param the type of the value withing the Result of the mapping function - * @return a Result - */ - Result flatMap(Function> f); - @Override Result map(Function f); @@ -177,15 +186,6 @@ public interface Result extends Functor> { */ Result> maybe(Predicate predicate); - /** - * Extracts the successful value from the result, or throws the error Throwable. - * - * @return the value if a success - * @throws Throwable the result is an error - */ - @SuppressWarnings("illegalthrows") - T orElseThrow() throws Throwable; - /** * Provide the value within the Result, if it is a success, to the Consumer, and returns this Result. * @@ -251,4 +251,16 @@ public interface Result extends Functor> { * @return the Result or a new error Result */ Result thenWith(Function> f); + + /** + * Reduce two Results of the same type into one using the reducing function provided. + * + *

If either Result is an error, then the reduce will return the error. If both are errors, then the error of + * {@link this} Result will be returned.

+ * + * @param identify the identify Result + * @param operator the function to combine the values the Results + * @return a Result containing the combination of the two Results + */ + Result reduce(Result identify, BinaryOperator operator); } diff --git a/src/main/java/net/kemitix/mon/result/Success.java b/src/main/java/net/kemitix/mon/result/Success.java index b7d0ef3..4c91623 100644 --- a/src/main/java/net/kemitix/mon/result/Success.java +++ b/src/main/java/net/kemitix/mon/result/Success.java @@ -26,6 +26,7 @@ import net.kemitix.mon.maybe.Maybe; import java.util.Objects; import java.util.concurrent.Callable; +import java.util.function.BinaryOperator; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; @@ -51,11 +52,6 @@ class Success implements Result { return true; } - @Override - public Result flatMap(final Function> f) { - return f.apply(value); - } - @Override public Result map(final Function f) { return Result.ok(f.apply(value)); @@ -105,6 +101,16 @@ class Success implements Result { return f.apply(value).call(this); } + @Override + public Result reduce(final Result identity, final BinaryOperator operator) { + return flatMap(a -> identity.flatMap(b -> Result.of(() -> operator.apply(a, b)))); + } + + @Override + public Result flatMap(final Function> f) { + return f.apply(value); + } + @Override public boolean equals(final Object other) { return other instanceof Success && Objects.equals(value, ((Success) other).value); diff --git a/src/test/java/net/kemitix/mon/ResultTest.java b/src/test/java/net/kemitix/mon/ResultTest.java index edda0e3..3805a24 100644 --- a/src/test/java/net/kemitix/mon/ResultTest.java +++ b/src/test/java/net/kemitix/mon/ResultTest.java @@ -300,7 +300,7 @@ public class ResultTest implements WithAssertions { //given final Maybe> justSuccess = Maybe.just(Result.ok(1)); //when - final Result> result = Result.invert(justSuccess); + final Result> result = Result.swap(justSuccess); //then result.match( success -> assertThat(success.toOptional()).contains(1), @@ -314,7 +314,7 @@ public class ResultTest implements WithAssertions { final RuntimeException exception = new RuntimeException(); final Maybe> justError = Maybe.just(Result.error(exception)); //when - final Result> result = Result.invert(justError); + final Result> result = Result.swap(justError); //then result.match( success -> fail("Not a success"), @@ -327,7 +327,7 @@ public class ResultTest implements WithAssertions { //given final Maybe> nothing = Maybe.nothing(); //when - final Result> result = Result.invert(nothing); + final Result> result = Result.swap(nothing); //then result.match( success -> assertThat(success.toOptional()).isEmpty(), @@ -671,6 +671,66 @@ public class ResultTest implements WithAssertions { ); } + @Test + public void okayOkay_whenReduce_thenCombine() { + //given + final Result result1 = Result.ok(1); + final Result result10 = Result.ok(10); + //when + final Result result11 = result1.reduce(result10, (a, b) -> a + b); + //then + result11.match( + success -> assertThat(success).isEqualTo(11), + error -> fail("Not an error") + ); + } + + @Test + public void okayError_whenReduce_thenError() { + //given + final Result result1 = Result.ok(1); + final RuntimeException exception = new RuntimeException(); + final Result result10 = Result.error(exception); + //when + final Result result11 = result1.reduce(result10, (a, b) -> a + b); + //then + result11.match( + success -> fail("Not a success"), + error -> assertThat(error).isSameAs(exception) + ); + } + + @Test + public void errorOkay_whenReduce_thenError() { + //given + final RuntimeException exception = new RuntimeException(); + final Result result1 = Result.error(exception); + final Result result10 = Result.ok(10); + //when + final Result result11 = result1.reduce(result10, (a, b) -> a + b); + //then + result11.match( + success -> fail("Not a success"), + error -> assertThat(error).isSameAs(exception) + ); + } + + @Test + public void errorError_whenReduce_thenError() { + //given + final RuntimeException exception1 = new RuntimeException(); + final Result result1 = Result.error(exception1); + final RuntimeException exception10 = new RuntimeException(); + final Result result10 = Result.error(exception10); + //when + final Result result11 = result1.reduce(result10, (a, b) -> a + b); + //then + result11.match( + success -> fail("Not a success"), + error -> assertThat(error).isSameAs(exception1) + ); + } + @RequiredArgsConstructor private static class UseCase {