diff --git a/packages/effect-lens/src/Lens.test.ts b/packages/effect-lens/src/Lens.test.ts index 1c3c794..8d84d2f 100644 --- a/packages/effect-lens/src/Lens.test.ts +++ b/packages/effect-lens/src/Lens.test.ts @@ -208,6 +208,31 @@ describe("Lens", () => { expect(result[1]).toBe(25) }) + test("modifyEffect updates are atomic under concurrency", async () => { + const iterations = 100 + + const result = await Effect.runPromise(Effect.flatMap( + SubscriptionRef.make({ count: 0 }), + parent => { + const countLens = Lens.focusObjectOn(Lens.fromSubscriptionRef(parent), "count") + + return Effect.flatMap( + Effect.forEach( + Array.from({ length: iterations }), + () => Lens.updateEffect( + countLens, + count => Effect.as(Effect.yieldNow(), count + 1), + ), + { concurrency: "unbounded", discard: true }, + ), + () => parent.get, + ) + }, + )) + + expect(result.count).toBe(iterations) + }) + test("focusObjectOn focuses a nested property without touching other fields", async () => { const [initialCount, updatedState] = await Effect.runPromise( Effect.flatMap(