sclass ScoredSearcher {
int maxResults = 1000;
LS preparedTerms;
new Map scores;
*(S query, O... _) {
maxResults = optPar maxResults(_, maxResults);
preparedTerms = scoredSearch_prepare(query);
}
void put(A object, S s) {
putUnlessZero(scores, object, scoredSearch_score(s, preparedTerms));
}
void put(A object, Collection fields) {
putUnlessZero(scores, object, scoreFields(fields));
}
int scoreFields(fields) {
ret scoredSearch_score(fields, preparedTerms);
}
void add(A object) {
put(object, str(object));
}
L get() {
ret takeFirst(maxResults, keysSortedByValuesDesc(scores));
}
}