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()); } @Override public String toString() { return String.format("ListHolder [heldValues=%s]", heldValues); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((heldValues == null) ? 0 : heldValues.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (!(obj instanceof ListHolder)) return false; ListHolder other = (ListHolder) obj; if (heldValues == null) { if (other.heldValues != null) return false; } else if (!heldValues.equals(other.heldValues)) return false; return true; } }