!7 cmodule RegexpMatcher > DynPrintLogAndEnabled { L jobs = syncLinkedList(); transient ReliableSingleThread rst; start { rst = dm_rst(r step); } sclass Job { S regexp, input; bool ignoreCase; O whenDone; // voidfunc(Matcher) S moduleID; // for who are we doing this } void step { Job job; while (licensed() && !retired && (job = syncPopFirst(jobs)) != null) { pcall { doJob(job); } } } void doJob(Job j) { if (!dm_moduleExists(j.moduleID)) ret; Matcher m = safeRegexpPossiblyIC(j.ignoreCase, j.regexp, j.input); callF(j.whenDone, m); } // API void addJob(S moduleID, S regexp, S input, bool ignoreCase, O whenDone) q { jobs.add(nu Job(+moduleID, +regexp, +input, +ignoreCase, +whenDone)); _change(); rst.trigger(); } void deleteJobsForModule(S moduleID) q { syncFilterLinkedListInPlace(jobs, job -> eq(job.moduleID, moduleID)); _change(); } }