//packageName wikify //mainClassName Wikify sclass Wikify { volatile Indexed indexed; S indexing; Q q = startQ(); 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); ret main indexOf(fullText, pattern); } synchronized void possiblyIndexText(S text) { if (indexing != null) ret; indexing = text; q.add(r { try { new Indexed i; i.text = text; i.searcher = wikifyString(text); setIndexed(i); } finally { indexing = null; } }); } synchronized void setIndexed(Indexed i) { indexed = i; } }