nearMisses function

List<NearMiss> nearMisses(
  1. List<String> invalidated,
  2. List<String> carried, [
  3. int limit = 8
])

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];
}