function findMatchesDecreasingSimilarity()

in packages/@aws-c2a/engine/lib/model-diffing/entity-matchers/entities-matcher.ts [67:102]


function findMatchesDecreasingSimilarity<T extends ValidEntity, K>(
  entitiesA: T[],
  entitiesB: T[],
  similarityEvaluator: SimilarityEvaluator<T, K>,
  similarityThreshold: number,
): EntityMatch<T,K>[] {

  if(similarityThreshold < 0 || similarityThreshold > 1)
    throw Error('Similarity threshold must be a value between 0 and 1');
  const matches: [number, EntityMatch<T,K>][] =
    flatMap(entitiesA, entityA =>
      entitiesB.map((entityB): [number, EntityMatch<T,K>] | undefined => {
        const transition = new CompleteTransition({v1: entityA, v2: entityB});
        const similarityCalcResult = similarityEvaluator(transition);

        if(!similarityCalcResult)
          return;

        const [similarity, metadata] = similarityCalcResult;
        if(similarity < 0 || similarity > 1)
          throw Error('Similarity does not have a value in the range [0, 1]');

        if(similarity > similarityThreshold)
          return [similarity, {transition, metadata}];

        return;
      }),
    ).filter(isDefined);

  return matches
    .sort((m1, m2) => {
      if (m1[0] > m2[0]) return -1;
      return (m1[0] === m2[0] && +m1[1].transition.nodeData._id < +m2[1].transition.nodeData._id) ? -1 : 1;
    })
    .map(([, entityMatch]) => entityMatch);
}