//packageName wikify //mainClassName Wikify sclass Wikify { volatile Indexed indexed; S indexing; Q q = startQ(); int slowSearches; sclass Indexed { S text; LCSearcher_v4_multiFile searcher; } int anyIndexOf(S fullText, S pattern) { if (empty(fullText)) ret -1; Indexed _indexed = indexed; if (_indexed != null && fullText == _indexed.text) ret _indexed.searcher.singleFileAnyIndexOf(pattern); // possibly index, do slow search possiblyIndexText(fullText); ++slowSearches; ret main indexOf(fullText, pattern); } synchronized void possiblyIndexText(S text) { if (indexing != null) ret; indexing = text; q.add(r { try { print("Indexing " + nChars(text) + ": " + quote(shorten(text))); new Indexed i; i.text = text; i.searcher = wikifyString(text); setIndexed(i); } finally { indexing = null; } }); } synchronized void setIndexed(Indexed i) { print("Indexed " + nChars(i.text)); indexed = i; } }