package base; import java.util.function.Function; /** * @author Georgiy Korneev (kgeorgiy@kgeorgiy.info) */ public interface Either { Either mapRight(final Function f); Either flatMapRight(final Function> f); T either(Function lf, Function rf); boolean isRight(); L getLeft(); R getRight(); static Either right(final R value) { return new Either<>() { @Override public Either mapRight(final Function f) { return right(f.apply(value)); } @Override public Either flatMapRight(final Function> f) { return f.apply(value); } @Override public T either(final Function lf, final Function 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 Either left(final L value) { return new Either<>() { @Override public Either mapRight(final Function f) { return left(value); } @Override public Either flatMapRight(final Function> f) { return left(value); } @Override public T either(final Function lf, final Function 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); } }; } }