diff --git a/packages/utils/src/combineKeys.test.ts b/packages/utils/src/combineKeys.test.ts index 6aee63c..fb8997d 100644 --- a/packages/utils/src/combineKeys.test.ts +++ b/packages/utils/src/combineKeys.test.ts @@ -166,4 +166,32 @@ describe("combineKeys", () => { }) }) }) + + it("accounts for reentrant keys", () => { + scheduler().run(({ expectObservable, cold }) => { + const activeKeys = { + a: ["a"], + b: ["a", "b"], + z: [], + } + + const keys = cold(" abzab", activeKeys) + const a = cold(" 1----") + const b = cold(" 2---") + const expectedStr = "efgef" + + const innerStreams = { a, b } + + const result = combineKeys( + keys, + (v): Observable => innerStreams[v], + ).pipe(map((x) => Object.fromEntries(x.entries()))) + + expectObservable(result).toBe(expectedStr, { + e: { a: "1" }, + f: { a: "1", b: "2" }, + g: {}, + }) + }) + }) }) diff --git a/packages/utils/src/combineKeys.ts b/packages/utils/src/combineKeys.ts index 8ceca36..ebeab5d 100644 --- a/packages/utils/src/combineKeys.ts +++ b/packages/utils/src/combineKeys.ts @@ -27,6 +27,7 @@ export const combineKeys = ( innerSubscriptions.forEach((sub, key) => { if (!nextKeys.has(key)) { sub.unsubscribe() + innerSubscriptions.delete(key) if (currentValue.has(key)) { changes = true currentValue.delete(key)