package de.skuzzle.polly.core.parser.util;
import java.util.ArrayList;
import java.util.List;
public final class Combinator {
public static interface CombinationCallBack<T, S> {
public List<S> getSubList(T outer);
public void onNewCombination(List<S> combination);
}
public final static <T, S> void combine(List<T> elements,
CombinationCallBack<T, S> ccb) {
boolean allChecked = false;
final int[] indizes = new int[elements.size()];
final boolean done[] = new boolean[elements.size()];
// combine all possible parameter types
while (!allChecked) {
allChecked = true;
final List<S> combination = new ArrayList<S>();
int i = 0;
for (final T outer : elements) {
List<S> subList = ccb.getSubList(outer);
combination.add(subList.get(indizes[i]));
done[i] = (indizes[i] + 1) == subList.size();
allChecked &= done[i];
indizes[i] = (indizes[i] + 1) % subList.size();
++i;
}
ccb.onNewCombination(combination);
}
}
private Combinator() {}
}