From f8f716d186299fb5db1fe446715569310011fb6f Mon Sep 17 00:00:00 2001 From: Sebastian Lorenz Date: Sat, 1 Aug 2026 20:48:51 +0000 Subject: [PATCH 1/2] Add reproduction for Sink issue --- packages/effect/test/Sink.test.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/effect/test/Sink.test.ts b/packages/effect/test/Sink.test.ts index 6b2fbaba705..680eb0c8374 100644 --- a/packages/effect/test/Sink.test.ts +++ b/packages/effect/test/Sink.test.ts @@ -106,6 +106,18 @@ describe("Sink", () => { strictEqual(result, 45) })) }) + + describe("reduceWhileArray", () => { + it.effect("applies the reducer once per non-empty input array", () => + Effect.gen(function*() { + const result = yield* Stream.fromArrays([1, 2, 3]).pipe( + Stream.run(Sink.reduceWhileArray(() => 0, constTrue, (count) => count + 1)) + ) + + strictEqual(result, 1, "the reducer must run once for each input array") + })) + }) + describe("reduceWhileEffect", () => { it.effect("short circuits", () => Effect.gen(function*() { From 33a6afa22217c6a36b8d19d7848a7b2988037c15 Mon Sep 17 00:00:00 2001 From: Tim Smart Date: Mon, 3 Aug 2026 10:49:53 +1200 Subject: [PATCH 2/2] Fix Sink reduceWhileArray reducer calls --- .changeset/calm-wolves-reduce.md | 5 +++++ packages/effect/src/Sink.ts | 8 +++----- 2 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 .changeset/calm-wolves-reduce.md diff --git a/.changeset/calm-wolves-reduce.md b/.changeset/calm-wolves-reduce.md new file mode 100644 index 00000000000..1b255645666 --- /dev/null +++ b/.changeset/calm-wolves-reduce.md @@ -0,0 +1,5 @@ +--- +"effect": patch +--- + +Fix `Sink.reduceWhileArray` applying its reducer more than once per input array. diff --git a/packages/effect/src/Sink.ts b/packages/effect/src/Sink.ts index 9bb15d78140..47865c92d9f 100644 --- a/packages/effect/src/Sink.ts +++ b/packages/effect/src/Sink.ts @@ -1336,11 +1336,9 @@ export const reduceWhileArray = ( } return upstream.pipe( Effect.flatMap((arr) => { - for (let i = 0; i < arr.length; i++) { - state = f(state, arr) - if (!contFn(state)) { - return Cause.done() - } + state = f(state, arr) + if (!contFn(state)) { + return Cause.done() } return Effect.void }),