Files
prog-intro/java/base/Either.java
2026-04-13 10:38:03 +03:00

115 lines
2.8 KiB
Java

package base;
import java.util.function.Function;
/**
* @author Georgiy Korneev (kgeorgiy@kgeorgiy.info)
*/
public interface Either<L, R> {
<NR> Either<L, NR> mapRight(final Function<? super R, NR> f);
<NR> Either<L, NR> flatMapRight(
final Function<? super R, ? extends Either<L, NR>> f
);
<T> T either(
Function<? super L, ? extends T> lf,
Function<? super R, ? extends T> rf
);
boolean isRight();
L getLeft();
R getRight();
static <L, R> Either<L, R> right(final R value) {
return new Either<>() {
@Override
public <NR> Either<L, NR> mapRight(
final Function<? super R, NR> f
) {
return right(f.apply(value));
}
@Override
public <NR> Either<L, NR> flatMapRight(
final Function<? super R, ? extends Either<L, NR>> f
) {
return f.apply(value);
}
@Override
public <T> T either(
final Function<? super L, ? extends T> lf,
final Function<? super R, ? extends T> rf
) {
return rf.apply(value);
}
@Override
public boolean isRight() {
return true;
}
@Override
public L getLeft() {
return null;
}
@Override
public R getRight() {
return value;
}
@Override
public String toString() {
return String.format("Right(%s)", value);
}
};
}
static <L, R> Either<L, R> left(final L value) {
return new Either<>() {
@Override
public <NR> Either<L, NR> mapRight(
final Function<? super R, NR> f
) {
return left(value);
}
@Override
public <NR> Either<L, NR> flatMapRight(
final Function<? super R, ? extends Either<L, NR>> f
) {
return left(value);
}
@Override
public <T> T either(
final Function<? super L, ? extends T> lf,
final Function<? super R, ? extends T> rf
) {
return lf.apply(value);
}
@Override
public boolean isRight() {
return false;
}
@Override
public L getLeft() {
return value;
}
@Override
public R getRight() {
return null;
}
@Override
public String toString() {
return String.format("Left(%s)", value);
}
};
}
}