package bjc.utils.data.internals; import java.util.function.Function; import java.util.function.UnaryOperator; import bjc.utils.data.IHolder; import bjc.utils.data.Option; public class WrappedOption implements IHolder { private IHolder> held; public WrappedOption(IHolder seedValue) { held = new Option<>(seedValue); } private WrappedOption(IHolder> toHold, boolean dummy) { held = toHold; } @Override public IHolder bind(Function> binder) { IHolder> newHolder = held.map((containedHolder) -> { return containedHolder.bind((containedValue) -> { if (containedValue == null) { return new Option<>(null); } return binder.apply(containedValue); }); }); return new WrappedOption<>(newHolder, false); } @Override public Function> lift(Function func) { return (val) -> { return new Option<>(func.apply(val)); }; } @Override public IHolder map(Function mapper) { IHolder> newHolder = held.map((containedHolder) -> { return containedHolder.map((containedValue) -> { if (containedValue == null) { return null; } return mapper.apply(containedValue); }); }); return new WrappedOption<>(newHolder, false); } @Override public IHolder transform(UnaryOperator transformer) { held.transform((containedHolder) -> { return containedHolder.transform((containedValue) -> { if (containedValue == null) { return null; } return transformer.apply(containedValue); }); }); return this; } @Override public UnwrappedType unwrap(Function unwrapper) { return held.unwrap((containedHolder) -> { return containedHolder.unwrap((containedValue) -> { if (containedValue == null) { return null; } return unwrapper.apply(containedValue); }); }); } }