From 1c905c1194f2e43a7f0bc77cf95634b5f7ae3984 Mon Sep 17 00:00:00 2001 From: goshamartynovich Date: Tue, 25 Nov 2025 20:40:22 +0300 Subject: [PATCH] fix: combineEvents works after reset --- src/combine-events/combine-events.test.ts | 45 +++++++++++++++++++++++ src/combine-events/index.ts | 7 ++-- 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/combine-events/combine-events.test.ts b/src/combine-events/combine-events.test.ts index 5c380060..fdfca79e 100644 --- a/src/combine-events/combine-events.test.ts +++ b/src/combine-events/combine-events.test.ts @@ -1014,3 +1014,48 @@ test('target', () => { ] `); }); + +test('bug: triggers correctly after reset', () => { + const fn = jest.fn(); + const initArr = createEvent(); + const changeArr = createEvent(); + const anotherChangeArr = createEvent(); + + const $arr = restore(initArr, []).on(anotherChangeArr, (_, arr) => arr); + + const changedCombined = combineEvents({ + events: { set: changeArr, updates: $arr.updates }, + reset: initArr, + }); + + changedCombined.watch(fn); + + changeArr([1]); + anotherChangeArr([2]); + + initArr([]); + + changeArr([3]); + anotherChangeArr([4]); + + expect(argumentHistory(fn)).toMatchInlineSnapshot(` + [ + { + "set": [ + 1, + ], + "updates": [ + 2, + ], + }, + { + "set": [ + 3, + ], + "updates": [ + 4, + ], + }, + ] + `); +}); diff --git a/src/combine-events/index.ts b/src/combine-events/index.ts index 273d5d40..6482436a 100644 --- a/src/combine-events/index.ts +++ b/src/combine-events/index.ts @@ -74,7 +74,7 @@ export function combineEvents

( if (reset) { sample({ source: reset, target: $counter.reinit }); - $results.reset(reset); + sample({ source: reset, target: $results.reinit }); } for (const key of keys) { @@ -83,10 +83,11 @@ export function combineEvents

( .reset(target); if (reset) { - $isDone.reset(reset); + sample({ source: reset, target: $isDone.reinit }); } - $counter.on($isDone, (value) => value - 1); + $counter.on($isDone, (value, isDone) => (isDone ? value - 1 : value)); + $results.on(events[key], (shape, payload) => { const newShape = (Array.isArray(shape) ? [...shape] : { ...shape }) as any; newShape[key] = payload;