diff --git a/src/main/java/net/kemitix/mon/maybe/Just.java b/src/main/java/net/kemitix/mon/maybe/Just.java index 85aea43..b950904 100644 --- a/src/main/java/net/kemitix/mon/maybe/Just.java +++ b/src/main/java/net/kemitix/mon/maybe/Just.java @@ -98,6 +98,11 @@ final class Just implements Maybe { // ignore - not nothing } + @Override + public void match(final Consumer justMatcher, final Runnable nothingMatcher) { + justMatcher.accept(value); + } + @Override public void orElseThrow(final Supplier e) { // do not throw diff --git a/src/main/java/net/kemitix/mon/maybe/Maybe.java b/src/main/java/net/kemitix/mon/maybe/Maybe.java index be04b67..723ccd4 100644 --- a/src/main/java/net/kemitix/mon/maybe/Maybe.java +++ b/src/main/java/net/kemitix/mon/maybe/Maybe.java @@ -149,4 +149,12 @@ public interface Maybe extends Functor> { * @param runnable the runnable to call if this is a Nothing */ void ifNothing(Runnable runnable); + + /** + * Matches the Maybe, either just or nothing, and performs either the Consumer, for Just, or Runnable for nothing. + * + * @param justMatcher the Consumer to pass the value of a Just to + * @param nothingMatcher the Runnable to call if the Maybe is a Nothing + */ + void match(Consumer justMatcher, Runnable nothingMatcher); } diff --git a/src/main/java/net/kemitix/mon/maybe/Nothing.java b/src/main/java/net/kemitix/mon/maybe/Nothing.java index d1c7193..036cb14 100644 --- a/src/main/java/net/kemitix/mon/maybe/Nothing.java +++ b/src/main/java/net/kemitix/mon/maybe/Nothing.java @@ -34,6 +34,7 @@ import java.util.stream.Stream; * @param the type of the missing content * @author Paul Campbell (pcampbell@kemitix.net) */ +@SuppressWarnings("methodcount") final class Nothing implements Maybe { static final Maybe INSTANCE = new Nothing<>(); @@ -79,6 +80,11 @@ final class Nothing implements Maybe { runnable.run(); } + @Override + public void match(final Consumer justMatcher, final Runnable nothingMatcher) { + nothingMatcher.run(); + } + @Override public void orElseThrow(final Supplier e) throws Exception { throw e.get(); diff --git a/src/test/java/net/kemitix/mon/MaybeTest.java b/src/test/java/net/kemitix/mon/MaybeTest.java index 2b82337..c35d4c8 100644 --- a/src/test/java/net/kemitix/mon/MaybeTest.java +++ b/src/test/java/net/kemitix/mon/MaybeTest.java @@ -22,7 +22,7 @@ public class MaybeTest implements WithAssertions { @Test public void justMustBeNonNull() { assertThatNullPointerException().isThrownBy(() -> just(null)) - .withMessageContaining("value"); + .withMessageContaining("value"); } @Test @@ -84,7 +84,7 @@ public class MaybeTest implements WithAssertions { public void toOptional() { assertThat(just(1).toOptional()).isEqualTo(Optional.of(1)); assertThat(nothing() - .toOptional()).isEqualTo(Optional.empty()); + .toOptional()).isEqualTo(Optional.empty()); } @Test @@ -194,4 +194,29 @@ public class MaybeTest implements WithAssertions { assertThat(capture).isTrue(); } + @Test + public void just_whenMatch_thenJustTriggers() { + //given + final Maybe maybe = Maybe.just(1); + //then + maybe.match( + just -> assertThat(just).isEqualTo(1), + () -> fail("Not nothing") + ); + } + + @Test + public void nothing_whenMatch_thenNothingTriggers() { + //given + final Maybe maybe = Maybe.nothing(); + final AtomicBoolean flag = new AtomicBoolean(false); + //when + maybe.match( + just -> fail("Not a just"), + () -> flag.set(true) + ); + //then + assertThat(flag).isTrue(); + } + }