!7 srecord Result(S text, S moduleID, double value) {} module QuickSearchManager > DynQuickSearch { transient S resultsQuery; transient Map> resultsByModule = synchroMap(); LS calc_impl() { L results = concatLists(cloneValues(getResultsByModule())); sortByFieldDesc_inPlace(results, 'value); ret map(func(Result r) -> S { resultToText(r) }, takeFirst(50, results)); } S resultToText(Result r) { ret "[" + dm_moduleName(r.moduleID) + "] " + r.text; } // clear if query changed Map> getResultsByModule() { S input = dm_topInput(); synchronized(resultsByModule) { if (neq(resultsQuery, input)) { resultsQuery = input; resultsByModule.clear(); } ret resultsByModule; } } // API void setResultsForModule(fS moduleID, S query, LS results) { if (neq(query, dm_topInput())) ret with print("Results for wrong query: " + query); synchronized(resultsByModule) { getResultsByModule().put(moduleID, map(results, func(S s) -> Result { Result(s, moduleID, 0) })); } // show/update list if (nempty(results)) doSearch(resultsQuery); } }