package bjc.utils.data; import java.util.function.Function; import java.util.function.UnaryOperator; 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) { // FIXME this smells bad to me, but I can't figure out how else to // do it held.transform((containedHolder) -> { return containedHolder.transform(transformer); }); return this; } @Override public UnwrappedType unwrap( Function unwrapper) { return held.unwrap((containedHolder) -> { return containedHolder.unwrap(unwrapper); }); } }