package bjc.utils.data; import java.util.function.Function; import java.util.function.UnaryOperator; /** * A holder that may or may not contain a value * * @author ben * * @param * The type of the value that may or may not be held */ public class Option implements IHolder { private ContainedType held; /** * Create a new optional, using the given initial value * * @param seedValue * The initial value for the optional */ public Option(ContainedType seedValue) { held = seedValue; } @Override public IHolder bind( Function> binder) { if (held == null) { return new Option<>(null); } return binder.apply(held); } @Override public Function> lift( Function func) { return (val) -> { return new Option<>(func.apply(val)); }; } @Override public IHolder map( Function mapper) { if (held == null) { return new Option<>(null); } return new Option<>(mapper.apply(held)); } @Override public IHolder transform( UnaryOperator transformer) { if (held != null) { held = transformer.apply(held); } return this; } @Override public UnwrappedType unwrap( Function unwrapper) { if (held == null) { return null; } return unwrapper.apply(held); } }