package bjc.utils.data; import bjc.utils.data.internals.BoundListHolder; import bjc.utils.funcdata.FunctionalList; import bjc.utils.funcdata.IList; import java.util.function.Function; import java.util.function.UnaryOperator; /** * A holder that represents a set of non-deterministic computations * * @author ben * * @param * The type of contained value */ public class ListHolder implements IHolder { private IList heldValues; /** * Create a new list holder * * @param values * The possible values for the computation */ @SafeVarargs public ListHolder(ContainedType... values) { heldValues = new FunctionalList<>(); if(values != null) { for(ContainedType containedValue : values) { heldValues.add(containedValue); } } } private ListHolder(IList toHold) { heldValues = toHold; } @Override public IHolder bind(Function> binder) { IList> boundValues = heldValues.map(binder); return new BoundListHolder<>(boundValues); } @Override public Function> lift(Function func) { return (val) -> { return new ListHolder<>(new FunctionalList<>(func.apply(val))); }; } @Override public IHolder map(Function mapper) { IList mappedValues = heldValues.map(mapper); return new ListHolder<>(mappedValues); } @Override public IHolder transform(UnaryOperator transformer) { heldValues = heldValues.map(transformer); return this; } @Override public UnwrappedType unwrap(Function unwrapper) { return unwrapper.apply(heldValues.randItem()); } }