diff --git a/packages/core/data/dom-events/dom-event.ts b/packages/core/data/dom-events/dom-event.ts index b78d2df9e..ebdc35147 100644 --- a/packages/core/data/dom-events/dom-event.ts +++ b/packages/core/data/dom-events/dom-event.ts @@ -353,16 +353,17 @@ export class DOMEvent implements Event { // Set a listener to clone the array just before any mutations. let listenersLazyCopy: ListenerEntry[] = listenersLive; - const doLazyCopy = () => { + listenersLive.onMutation = () => (mutation: string, payload?: unknown) => { + console.log(`handleEvent "${data.eventName}": doLazyCopy due to "${mutation}"`, payload); // Cloning the array via spread syntax is up to 180 nanoseconds // faster per run than using Array.prototype.slice(). listenersLazyCopy = [...listenersLive]; + listenersLive.onMutation = null; }; - listenersLive.once(doLazyCopy); - // Make sure we remove the listener before we exit the function, - // otherwise we may wastefully clone the array. - const cleanup = () => listenersLive.removeListener(doLazyCopy); + // Make sure we clear the callback before we exit the function, + // otherwise we may wastefully clone the array on future mutations. + const cleanup = () => (listenersLive.onMutation = null); for (let i = listenersLazyCopy.length - 1; i >= 0; i--) { const listener = listenersLazyCopy[i]; diff --git a/packages/core/data/mutation-sensitive-array/index.ts b/packages/core/data/mutation-sensitive-array/index.ts index 76d0270a5..f94d9bf4d 100644 --- a/packages/core/data/mutation-sensitive-array/index.ts +++ b/packages/core/data/mutation-sensitive-array/index.ts @@ -8,32 +8,11 @@ * its entire purpose is to be used for performance-sensitive tasks. */ export class MutationSensitiveArray extends Array { - private readonly listeners: (() => void)[] = []; - - once(listener: () => void): void { - const wrapper = () => { - listener(); - this.removeListener(wrapper); - }; - this.addListener(wrapper); - } - - addListener(listener: () => void): void { - if (!this.listeners.includes(listener)) { - this.listeners.push(listener); - } - } - - removeListener(listener: () => void): void { - const index = this.listeners.indexOf(listener); - if (index > -1) { - this.listeners.splice(index, 1); - } - } + onMutation: (() => void) | null = null; private invalidate(): void { - for (const listener of this.listeners) { - listener(); + if (this.onMutation) { + this.onMutation(); } }