package bjc.utils.funcutils; import java.util.function.Consumer; import java.util.function.Function; import bjc.utils.funcdata.FunctionalList; import bjc.utils.funcdata.IList; /** * Implements a single group partitioning pass on a list * * @author ben * * @param * The type of element in the list being partitioned */ final class GroupPartIteration implements Consumer { private final IList> returnedList; public IList currentPartition; private final IList rejectedItems; private int numberInCurrentPartition; private final int numberPerPartition; private final Function elementCounter; public GroupPartIteration(final IList> returned, final IList rejects, final int nPerPart, final Function eleCount) { this.returnedList = returned; this.rejectedItems = rejects; this.numberPerPartition = nPerPart; this.elementCounter = eleCount; this.currentPartition = new FunctionalList<>(); this.numberInCurrentPartition = 0; } @Override public void accept(final E value) { final boolean shouldStartPartition = numberInCurrentPartition >= numberPerPartition; if (shouldStartPartition) { returnedList.add(currentPartition); currentPartition = new FunctionalList<>(); numberInCurrentPartition = 0; } else { final int currentElementCount = elementCounter.apply(value); final boolean shouldReject = numberInCurrentPartition + currentElementCount >= numberPerPartition; if (shouldReject) { rejectedItems.add(value); } else { currentPartition.add(value); numberInCurrentPartition += currentElementCount; } } } }