package bjc.data.internals; import java.util.function.Function; import java.util.function.UnaryOperator; import bjc.data.IHolder; import bjc.data.ListHolder; import bjc.funcdata.IList; /** * Holds a list, converted into a holder. * * @author Ben Culkin */ @SuppressWarnings("javadoc") public class BoundListHolder implements IHolder { /* The list of contained holders. */ private final IList> heldHolders; /** * Create a new list of holders. * * @param toHold * The list of holders to, well, hold. */ public BoundListHolder(final IList> toHold) { heldHolders = toHold; } @Override public IHolder bind(final Function> binder) { if (binder == null) throw new NullPointerException("Binder must not be null"); final IList> boundHolders = heldHolders.map(containedHolder -> { return containedHolder.bind(binder); }); return new BoundListHolder<>(boundHolders); } @Override public Function> lift(final Function func) { if (func == null) throw new NullPointerException("Function to lift must not be null"); return val -> { return new ListHolder<>(func.apply(val)); }; } @Override public IHolder map(final Function mapper) { if (mapper == null) throw new NullPointerException("Mapper must not be null"); final IList> mappedHolders = heldHolders.map(containedHolder -> { return containedHolder.map(mapper); }); return new BoundListHolder<>(mappedHolders); } @Override public IHolder transform(final UnaryOperator transformer) { if (transformer == null) throw new NullPointerException("Transformer must not be null"); heldHolders.forEach(containedHolder -> { containedHolder.transform(transformer); }); return this; } @Override public UnwrappedType unwrap(final Function unwrapper) { if (unwrapper == null) throw new NullPointerException("Unwrapper must not be null"); /* * @NOTE Is there another way we could want to do this? */ return heldHolders.randItem().unwrap(unwrapper); } }