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; /** * A wrapped lazy value. * * @author Ben Culkin */ public class WrappedLazy implements IHolder { /* Held value. */ private final IHolder> held; /** * Create a new wrapped lazy value. * * @param wrappedHolder * The holder to make lazy. */ 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. * * This is a case where reified generics would be useful, because then * the compiler could know which one we meant without the dummy * parameter. */ 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); }); } }