From 8a2ed3bc86e9531038686d911c3b0975272c911f Mon Sep 17 00:00:00 2001 From: Hazelnoot Date: Sun, 25 May 2025 12:33:05 -0400 Subject: [PATCH] minor optimization to diff-arrays --- packages/backend/src/misc/diff-arrays.ts | 6 ++++-- packages/backend/test/unit/misc/diff-arrays.ts | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/backend/src/misc/diff-arrays.ts b/packages/backend/src/misc/diff-arrays.ts index 1f6820481b..b3879cc996 100644 --- a/packages/backend/src/misc/diff-arrays.ts +++ b/packages/backend/src/misc/diff-arrays.ts @@ -10,8 +10,9 @@ export interface DiffResult { /** * Calculates the difference between two snapshots of data. - * Null, undefined, and empty arrays are supported, and values do not have to be unique. + * Null, undefined, and empty arrays are supported, and duplicate values are ignored. * Result sets are de-duplicated, and will be empty if no data was added or removed (respectively). + * 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 */ @@ -26,7 +27,8 @@ export function diffArrays(dataBefore: T[] | null | undefined, dataAfter: T[] for (const host of before) { // before and NOT after => removed - if (!after.has(host)) { + // delete operation removes duplicates to speed up the "after" loop + if (!after.delete(host)) { removed.push(host); } } diff --git a/packages/backend/test/unit/misc/diff-arrays.ts b/packages/backend/test/unit/misc/diff-arrays.ts index 3eed5a8913..a2dee50652 100644 --- a/packages/backend/test/unit/misc/diff-arrays.ts +++ b/packages/backend/test/unit/misc/diff-arrays.ts @@ -18,19 +18,19 @@ describe(diffArrays, () => { expect(result.removed).toHaveLength(0); }); - it('should remove before when added is empty', () => { + it('should remove before when after is empty', () => { const result = diffArrays([1, 2, 3], []); expect(result.added).toHaveLength(0); expect(result.removed).toEqual([1, 2, 3]); }); - it('should deduplicate before when added is empty', () => { + it('should deduplicate before when after is empty', () => { const result = diffArrays([1, 1, 2, 2, 3], []); expect(result.added).toHaveLength(0); expect(result.removed).toEqual([1, 2, 3]); }); - it('should remove after when before is empty', () => { + it('should add after when before is empty', () => { const result = diffArrays([], [1, 2, 3]); expect(result.added).toEqual([1, 2, 3]); expect(result.removed).toHaveLength(0);