Merge pull request #44 from kemitix/maybe-or

Add Maybe.or(Supplier<Maybe>)
This commit is contained in:
Paul Campbell 2018-08-31 23:13:49 +01:00 committed by GitHub
commit 5e171f8962
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 49 additions and 0 deletions

View file

@ -4,6 +4,7 @@ CHANGELOG
0.12.0
------
* Add Maybe.or(Supplier<Maybe>)
* Add Result.reduce(Result,BinaryOperator)
* Rename Result.invert() as Result.swap()
* [admin] pom: update urls to github

View file

@ -444,6 +444,16 @@
#+END_SRC
**** =T or(Supplier<Maybe<T> alternative)=
Provide an alternative Maybe to use when Maybe is Nothing.
#+BEGIN_SRC java
final Maybe<Integer> value = Maybe.maybe(getValue())
.or(() -> Maybe.just(defaultValue));
#+END_SRC
**** =void orElseThrow(Supplier<Exception> error)=
Throw the exception if the Maybe is a Nothing.

View file

@ -118,6 +118,11 @@ final class Just<T> implements Maybe<T> {
justMatcher.accept(value);
}
@Override
public Maybe<T> or(final Supplier<Maybe<T>> alternative) {
return this;
}
@Override
public Stream<T> stream() {
return Stream.of(value);

View file

@ -177,4 +177,13 @@ public interface Maybe<T> extends Functor<T, Maybe<?>> {
* @param nothingMatcher the Runnable to call if the Maybe is a Nothing
*/
void match(Consumer<T> justMatcher, Runnable nothingMatcher);
/**
* Maps the Maybe into another Maybe only when it is nothing.
*
* @param alternative the maybe to map the nothing into
*
* @return the original Maybe if not nothing, or the alternative
*/
Maybe<T> or(Supplier<Maybe<T>> alternative);
}

View file

@ -100,6 +100,11 @@ final class Nothing<T> implements Maybe<T> {
nothingMatcher.run();
}
@Override
public Maybe<T> or(final Supplier<Maybe<T>> alternative) {
return alternative.get();
}
@Override
public Stream<T> stream() {
return Stream.empty();

View file

@ -292,4 +292,23 @@ public class MaybeTest implements WithAssertions {
assertThat(isNothing).isTrue();
}
@Test
public void just_or_ignoreTheAlternative() {
//given
final Maybe<String> one = Maybe.just("one");
//when
final Maybe<String> result = one.or(() -> Maybe.just("two"));
//then
assertThat(result.toOptional()).contains("one");
}
@Test
public void nothing_or_isTheAlternative() {
//given
final Maybe<String> one = Maybe.nothing();
//when
final Maybe<String> result = one.or(() -> Maybe.just("two"));
//then
assertThat(result.toOptional()).contains("two");
}
}