Added bimap method and unit tests
This commit is contained in:
parent
4bdd2278a7
commit
6eabe26105
@ -64,6 +64,19 @@ public sealed interface Either<L, R> permits Left, Right {
|
||||
*/
|
||||
<T> Either<L, T> map(Function<R, T> fn);
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Applies <i>onLeft</i> function to the <i>Left</i> subtype or the
|
||||
* <i>onRight</i> function to the <i>Right</i> subtype.
|
||||
* </p>
|
||||
* @param onLeft The function to apply to the <i>Left</i> subtyp
|
||||
* @param onRight The function to apply to the <i>Right</i> subtype
|
||||
* @return An <i>Either</i> functor
|
||||
* @param <T> The return type of the <i>onLeft</i> function
|
||||
* @param <K> The return type of the <i>onRight</i> function
|
||||
*/
|
||||
<T, K> Either<T, K> bimap(Function<L, T> onLeft, Function<R, K> onRight);
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Returns the content of <i>Right</i> or a default value
|
||||
@ -85,4 +98,5 @@ public sealed interface Either<L, R> permits Left, Right {
|
||||
* @return The left value of <i>Either</i> or the default value
|
||||
*/
|
||||
L fromLeft(L defaultValue);
|
||||
|
||||
}
|
@ -32,6 +32,11 @@ public record Left<L, R>(L value) implements Either<L, R> {
|
||||
return new Left<>(this.value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T, K> Either<T, K> bimap(Function<L, T> onLeft, Function<R, K> onRight) {
|
||||
return new Left<>(onLeft.apply(this.value));
|
||||
}
|
||||
|
||||
@Override
|
||||
public R fromRight(R defaultValue) {
|
||||
return defaultValue;
|
||||
|
@ -32,6 +32,11 @@ public record Right<L, R>(R value) implements Either<L, R> {
|
||||
return new Right<>(fn.apply(this.value));
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T, K> Either<T, K> bimap(Function<L, T> onLeft, Function<R, K> onRight) {
|
||||
return new Right<>(onRight.apply(this.value));
|
||||
}
|
||||
|
||||
@Override
|
||||
public R fromRight(R defaultValue) {
|
||||
return this.value;
|
||||
|
@ -51,6 +51,16 @@ public class LeftTests {
|
||||
), "Undefined variable");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFunctorBiMapLeft() {
|
||||
Function<Integer, Integer> f = x -> x + 1;
|
||||
Function<String, String> g = String::toUpperCase;
|
||||
|
||||
Either<Integer, String> actual = this.resEither.bimap(f, g);
|
||||
|
||||
assertEquals(actual.fromLeft(-1), 20);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLeftFunctorIdentityMorphism() {
|
||||
// Applying the map function with the identity function,
|
||||
|
@ -51,6 +51,16 @@ public class RightTests {
|
||||
), 16);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFunctorBiMapRight() {
|
||||
Function<Integer, Integer> f = x -> x + 1;
|
||||
Function<String, String> g = String::toUpperCase;
|
||||
|
||||
Either<Integer, String> actual = this.resEither.bimap(f, g);
|
||||
|
||||
assertEquals(actual.fromRight("-1"), "QUERY EXECUTED SUCCESSFULLY");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRightFunctorIdentityMorphism() {
|
||||
// Applying the map function with the identity function,
|
||||
|
Loading…
Reference in New Issue
Block a user