// clever index of tokenized strings // maintaining one CI-sorted list per token position sclass PositionalTokenIndex { L sorts = new L; // token index -> entries sorted by token at index void addAll(LLS toks) { if (empty(toks)) ret; for (LS tok : toks) for (int i = 1; i < l(tok); i += 2) { LL idx = listGetOrCreate ArrayList(sorts, i/2); idx.add(tok); } sort(); } void sort { for i over sorts: { int j = i*2+1; sortInPlaceByCalculatedFieldIC(sorts.get(i), func(LS tok) -> S { tok.get(j) }); } } }