sclass FullPhraseCache { L phrases; // different spellings of full phrase Map byFirstWord; Map byFirstWord_init() { if (byFirstWord == null) byFirstWord = ciMap(); ret byFirstWord; } void add(S phrase) { LS tok = javaTokNPunctuation_cached(phrase); if (l(tok) == 1) ret; add(tok, 1); } void add(LS tok, int idx) { if (idx >= l(tok)-1) ret with phrases = createOrAddToList(phrases, tok); FullPhraseCache subCache = getOrCreate(byFirstWord_init(), tok.get(idx), FullPhraseCache); subCache.add(tok, idx+2); } }