@@ -208,6 +208,31 @@ describe("Lens", () => {
|
|||||||
expect(result[1]).toBe(25)
|
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 () => {
|
test("focusObjectOn focuses a nested property without touching other fields", async () => {
|
||||||
const [initialCount, updatedState] = await Effect.runPromise(
|
const [initialCount, updatedState] = await Effect.runPromise(
|
||||||
Effect.flatMap(
|
Effect.flatMap(
|
||||||
|
|||||||
Reference in New Issue
Block a user