From 35dfde838be2dd50ee37d420f87a0cac917e621c Mon Sep 17 00:00:00 2001 From: Hazelnoot Date: Sun, 25 May 2025 12:34:09 -0400 Subject: add function diffArraysSimple for more efficient change detection --- packages/backend/src/misc/diff-arrays.ts | 44 ++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) (limited to 'packages/backend/src/misc') diff --git a/packages/backend/src/misc/diff-arrays.ts b/packages/backend/src/misc/diff-arrays.ts index b3879cc996..b50ca1d4f7 100644 --- a/packages/backend/src/misc/diff-arrays.ts +++ b/packages/backend/src/misc/diff-arrays.ts @@ -56,3 +56,47 @@ export function diffArrays(dataBefore: T[] | null | undefined, dataAfter: T[] // data NEITHER before nor after => no change return { added: [], removed: [] }; } + +/** + * Checks for any difference between two snapshots of data. + * Null, undefined, and empty arrays are supported, and duplicate values are ignored. + * The inputs are treated as un-ordered, so a re-ordering of the same data will NOT be considered a change. + * @param dataBefore Array containing data before the change + * @param dataAfter Array containing data after the change + */ +export function diffArraysSimple(dataBefore: T[] | null | undefined, dataAfter: T[] | null | undefined): boolean { + const before = dataBefore ? new Set(dataBefore) : null; + const after = dataAfter ? new Set(dataAfter) : null; + + if (before?.size && after?.size) { + // different size => changed + if (before.size !== after.size) return true; + + // removed => changed + for (const host of before) { + // delete operation removes duplicates to speed up the "after" loop + if (!after.delete(host)) { + return true; + } + } + + // added => changed + for (const host of after) { + if (!before.has(host)) { + return true; + } + } + + // identical values => no change + return false; + } + + // before and NOT after => change + if (before?.size) return true; + + // after and NOT before => change + if (after?.size) return true; + + // NEITHER before nor after => no change + return false; +} -- cgit v1.2.3-freya