add Either class
This commit is contained in:
parent
905831b5e0
commit
74a30a618d
2 changed files with 64 additions and 0 deletions
59
src/main/java/casser/support/Either.java
Normal file
59
src/main/java/casser/support/Either.java
Normal file
|
@ -0,0 +1,59 @@
|
|||
package casser.support;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
public final class Either<L, R> {
|
||||
|
||||
private final L left;
|
||||
private final R right;
|
||||
|
||||
private Either(L left, R right) {
|
||||
this.left = left;
|
||||
this.right = right;
|
||||
}
|
||||
|
||||
public boolean isLeft() {
|
||||
return left != null;
|
||||
}
|
||||
|
||||
public L getLeft() {
|
||||
return left;
|
||||
}
|
||||
|
||||
public boolean isRight() {
|
||||
return right != null;
|
||||
}
|
||||
|
||||
public R getRight() {
|
||||
return right;
|
||||
}
|
||||
|
||||
public static <L, R> Either<L, R> left(L left) {
|
||||
return new Either<L, R>(left, null);
|
||||
}
|
||||
|
||||
public static <L, R> Either<L, R> right(R right) {
|
||||
return new Either<L, R>(null, right);
|
||||
}
|
||||
|
||||
public EitherCase getCase() {
|
||||
if (left != null) {
|
||||
return EitherCase.LEFT;
|
||||
}
|
||||
else if (right != null) {
|
||||
return EitherCase.RIGHT;
|
||||
}
|
||||
throw new IllegalStateException("unexpected state");
|
||||
}
|
||||
|
||||
public <T> T fold(Function<L, T> leftFunction, Function<R,T> rightFunction) {
|
||||
switch(getCase()) {
|
||||
case LEFT:
|
||||
return leftFunction.apply(left);
|
||||
case RIGHT:
|
||||
return rightFunction.apply(right);
|
||||
}
|
||||
throw new IllegalStateException("unexpected state");
|
||||
}
|
||||
|
||||
}
|
5
src/main/java/casser/support/EitherCase.java
Normal file
5
src/main/java/casser/support/EitherCase.java
Normal file
|
@ -0,0 +1,5 @@
|
|||
package casser.support;
|
||||
|
||||
public enum EitherCase {
|
||||
LEFT, RIGHT;
|
||||
}
|
Loading…
Reference in a new issue