nearMisses function
Every near miss between what a cause raised and what a query carries,
most suspicious first, capped at limit.
Implementation
List<NearMiss> nearMisses(
List<String> invalidated,
List<String> carried, [
int limit = 8,
]) {
final found = <(int, NearMiss)>[];
final seen = <String>{};
final parsed = [for (final right in carried) parseTag(right)];
for (final left in invalidated) {
final a = parseTag(left);
for (final (index, right) in carried.indexed) {
if (left == right) continue;
final relation = _relate(a, parsed[index]);
if (relation == null) continue;
if (!seen.add('$left\u0000$right')) continue;
found.add((
found.length,
NearMiss(
invalidated: left,
carried: right,
relation: relation,
hint: _hint(relation, left, right),
),
));
}
}
found.sort((x, y) {
final byRank = x.$2.relation.rank.compareTo(y.$2.relation.rank);
return byRank != 0 ? byRank : x.$1.compareTo(y.$1);
});
return [for (final (_, miss) in found.take(limit < 0 ? 0 : limit)) miss];
}