package bjc.utils.data.internals; import java.util.function.Function; import java.util.function.UnaryOperator; import bjc.utils.data.IHolder; import bjc.utils.data.Lazy; public class WrappedLazy implements IHolder { private IHolder> held; public WrappedLazy(IHolder wrappedHolder) { held = new Lazy<>(wrappedHolder); } // This has an extra parameter, because otherwise it erases to the same // as the public one private WrappedLazy(IHolder> wrappedHolder, boolean dummy) { held = wrappedHolder; } @Override public IHolder bind(Function> binder) { IHolder> newHolder = held.map((containedHolder) -> { return containedHolder.bind(binder); }); return new WrappedLazy<>(newHolder, false); } @Override public Function> lift(Function func) { return (val) -> { return new Lazy<>(func.apply(val)); }; } @Override public IHolder map(Function mapper) { IHolder> newHolder = held.map((containedHolder) -> { return containedHolder.map(mapper); }); return new WrappedLazy<>(newHolder, false); } @Override public IHolder transform(UnaryOperator transformer) { held.transform((containedHolder) -> { return containedHolder.transform(transformer); }); return this; } @Override public UnwrappedType unwrap(Function unwrapper) { return held.unwrap((containedHolder) -> { return containedHolder.unwrap(unwrapper); }); } }