// preds return a MapSO or Bool // (null is false) // returns pairs (sublist, mapping) static LPair, MapSO> ai_scanOverListWithMatchFunctions(L l, IF1... preds) { new LPair, MapSO> out; search: for (L sub : allSubListsOfLength_iterator(l(preds), l)) { MapSO map = ciMap(); for i over sub: { O o = preds[i].get(sub.get(i)); if (o cast Map) { if (!putAllStrictly(map, o)) continue search; } else if (o cast Bool) { if (!o) continue search; } else if (o == null) continue search; else { warn("Unknown predicate result: " + o); continue search; } } out.add(pair(sub, map)); } ret out; }