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 seed * The initial value for the optional */ public Option(ContainedType seed) { held = seed; } @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); } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("Option ["); if(held != null) { builder.append("held="); builder.append(held); } builder.append("]"); return builder.toString(); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((held == null) ? 0 : held.hashCode()); return result; } @Override public boolean equals(Object obj) { if(this == obj) return true; if(obj == null) return false; if(getClass() != obj.getClass()) return false; Option other = (Option) obj; if(held == null) { if(other.held != null) return false; } else if(!held.equals(other.held)) return false; return true; } }