package com.comphenix.protocol.wrappers; import java.util.Optional; import java.util.function.Function; /** * Represents a datatype where either left or right is present. The values are available with a xor semantic. So at * most and at least one value will be available. * * @param left data type * @param right data type */ public abstract class Either { public static class Left extends Either { private final L value; protected Left(L value) { this.value = value; } @Override public T map(Function leftConsumer, Function rightConsumer) { return leftConsumer.apply(value); } @Override public Optional left() { return Optional.ofNullable(value); } @Override public Optional right() { return Optional.empty(); } } public static class Right extends Either { private final R value; protected Right(R value) { this.value = value; } @Override public T map(Function leftConsumer, Function rightConsumer) { return rightConsumer.apply(value); } @Override public Optional left() { return Optional.empty(); } @Override public Optional right() { return Optional.ofNullable(value); } } /** * @param leftConsumer transformer if the left value is present * @param rightConsumer transformer if the right value is present * @return result of applying the given functions to the left or right side * @param result data type of both transformers */ public abstract T map(Function leftConsumer, Function rightConsumer); /** * @return left value if present */ public abstract Optional left(); /** * @return right value if present */ public abstract Optional right(); /** * @param value containing value * @return either containing a left value * @param data type of the containing value * @param right data type */ public static Either left(L value) { return new Left<>(value); } /** * @param value containing value * @return either containing a right value * @param left data type * @param data type of the containing value */ public static Either right(R value) { return new Right<>(value); } }