auto-param-new-string-helper/newAndLegacyPhraseComparisonUtil.js (60 lines of code) (raw):
/**
* (c) Meta Platforms, Inc. and affiliates. Confidential and proprietary.
*
* @emails oncall+i18n_fbt_js
* @format
* @noflow
*/
/**
* Compare phrases based on (filepath, line_beg, col_beg) in this order
*/
function comparePhrases(newPhrase, legacyPhrase) /*: number */ {
if (newPhrase.filepath !== legacyPhrase.filepath) {
return newPhrase.filepath < legacyPhrase.filepath ? -1 : 1;
}
if (newPhrase.line_beg !== legacyPhrase.line_beg) {
return newPhrase.line_beg < legacyPhrase.line_beg ? -1 : 1;
}
if (newPhrase.col_beg !== legacyPhrase.col_beg) {
return newPhrase.col_beg < legacyPhrase.col_beg ? -1 : 1;
}
return 0;
}
/**
* Match new and legacy phrase and run `callback` on each pair of matched phrases
*/
function forEachPairOfNewAndLegacyPhrase(
newPhrases,
legacyPhrases,
matchedPhraseCallback /*: (newPhrase, legacyPhrase) => void */,
addedPhraseCallback /*: (newPhrase, legacyPhrase) => void */,
removedPhraseCallback /*: (newPhrase, legacyPhrase) => void */,
) /*: void */ {
const sortedNewPhrases = newPhrases.sort(comparePhrases);
const sortedLegacyPhrases = legacyPhrases.sort(comparePhrases);
for (
let legacyPointer = 0, newPointer = 0;
legacyPointer < sortedLegacyPhrases.length &&
newPointer < sortedNewPhrases.length;
) {
const legacyPhrase = sortedLegacyPhrases[legacyPointer];
const newPhrase = sortedNewPhrases[newPointer];
const comparison = comparePhrases(newPhrase, legacyPhrase);
if (comparison === 0) {
matchedPhraseCallback(newPhrase, legacyPhrase);
legacyPointer++;
newPointer++;
} else if (comparison < 0) {
addedPhraseCallback(newPhrase, legacyPhrase);
newPointer++;
} else {
removedPhraseCallback(newPhrase, legacyPhrase);
legacyPointer++;
}
}
}
function areNewAndLegacyLeavesIdentical(
newLeaves,
legacyLeaves,
) /*: boolean */ {
const legacyLeavesSet = new Set(Object.keys(legacyLeaves));
const newLeavesSet = new Set(Object.keys(newLeaves));
const containsAll = (set1, set2) =>
Array.from(set1).every(item => set2.has(item));
return (
legacyLeavesSet.size === newLeavesSet.size &&
containsAll(newLeavesSet, legacyLeavesSet) &&
containsAll(legacyLeavesSet, newLeavesSet)
);
}
module.exports = {
forEachPairOfNewAndLegacyPhrase,
areNewAndLegacyLeavesIdentical,
};