export function matchEntities()

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


export function matchEntities<T extends ValidEntity, K = undefined>(
  entitiesA: T[],
  entitiesB: T[],
  similarityEvaluator: SimilarityEvaluator<T, K>,
  similarityThreshold = 0.5,
): EntitiesMatcherResults<T, K> {

  const matchesBySimilarity = findMatchesDecreasingSimilarity(
    entitiesA,
    entitiesB,
    similarityEvaluator,
    similarityThreshold,
  );

  const matchedA = new Set<T>();
  const matchedB = new Set<T>();

  const matches = matchesBySimilarity.map(
    (entityMatch): EntityMatch<T, K> | undefined => {
      if(entityMatch.transition.v1 === undefined || entityMatch.transition.v2 === undefined)
        throw Error('EntityMatcher produced transition with undefined version');
      if(!matchedA.has(entityMatch.transition.v1)
                && !matchedB.has(entityMatch.transition.v2)) {
        matchedA.add(entityMatch.transition.v1);
        matchedB.add(entityMatch.transition.v2);
        return entityMatch;
      }
      return;
    },
  ).filter(isDefined);

  const unmatchedA = entitiesA.filter(e => !matchedA.has(e));
  const unmatchedB = entitiesB.filter(e => !matchedB.has(e));

  return {matches, unmatchedA, unmatchedB};
}