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; @SuppressWarnings("javadoc") public class WrappedLazy implements IHolder { private final IHolder> held; public WrappedLazy(final IHolder wrappedHolder) { held = new Lazy<>(wrappedHolder); } // This has an extra parameter, because otherwise it erases to the same // as the public one private WrappedLazy(final IHolder> wrappedHolder, final boolean dummy) { held = wrappedHolder; } @Override public IHolder bind(final Function> binder) { final IHolder> newHolder = held.map((containedHolder) -> { return containedHolder.bind(binder); }); return new WrappedLazy<>(newHolder, false); } @Override public Function> lift(final Function func) { return (val) -> { return new Lazy<>(func.apply(val)); }; } @Override public IHolder map(final Function mapper) { final IHolder> newHolder = held.map((containedHolder) -> { return containedHolder.map(mapper); }); return new WrappedLazy<>(newHolder, false); } @Override public IHolder transform(final UnaryOperator transformer) { held.transform((containedHolder) -> { return containedHolder.transform(transformer); }); return this; } @Override public UnwrappedType unwrap(final Function unwrapper) { return held.unwrap((containedHolder) -> { return containedHolder.unwrap(unwrapper); }); } }