sclass WordIndex { S regexp = "\\w+"; MultiMap index = ciMultiMap(); void add(A a, S text) { Set words = extractWords(text); for (S word : words) index.add(word, a); } Set extractWords(S text) { ret asCISet(extractWords_list(text)); } LS extractWords_list(S text) { ret regexpExtractAll(regexp, text); } L wordRanges(S text) { ret regexpRanges(regexp, text); } L get(S word) { ret index.get(word); } void remove(A a, S text) { Set words = extractWords(text); for (S word : words) index.remove(word, a); } Set words() { ret keys(index); } int numWords() { ret l(index); } // These methods only work when A = S void add(S s) { add((A) s, s); } void remove(S s) { remove((A) s, s); } }