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); } }; } }