package bjc.utils.data; import java.util.function.Function; import java.util.function.UnaryOperator; import bjc.utils.funcdata.FunctionalList; import bjc.utils.funcdata.IList; /** * 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; private ListHolder(IList toHold) { heldValues = toHold; } /** * 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); } } } @Override public IHolder bind( Function> binder) { IList> boundValues = heldValues .map(binder); return new BoundListHolder<>(boundValues); } @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()); } @Override public Function> lift( Function func) { return (val) -> { return new ListHolder<>(new FunctionalList<>(func.apply(val))); }; } }