From 49f8a56244d210286eca314222b7971b3a74d842 Mon Sep 17 00:00:00 2001 From: Sebastian Lorenz Date: Mon, 3 Aug 2026 05:48:37 +0000 Subject: [PATCH 1/2] Add reproduction for Stream issue --- packages/effect/test/Stream.test.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/effect/test/Stream.test.ts b/packages/effect/test/Stream.test.ts index 7e2912701c5..29aa2564e16 100644 --- a/packages/effect/test/Stream.test.ts +++ b/packages/effect/test/Stream.test.ts @@ -404,6 +404,16 @@ describe("Stream", () => { assert.deepStrictEqual(result, [1, 2, 3]) })) + it.effect("range - zero chunk size does not change the emitted range", () => + Effect.gen(function*() { + const result = yield* Stream.range(1, 3, 0).pipe( + Stream.take(4), + Stream.runCollect + ) + + assert.deepStrictEqual(result, [1, 2, 3]) + })) + it.effect("service", () => Effect.gen(function*() { const result = yield* Stream.service(Greeter).pipe( From 68fe429671fd35c7ef4e60ca37317da199d5733d Mon Sep 17 00:00:00 2001 From: Tim Smart Date: Tue, 4 Aug 2026 09:30:55 +1200 Subject: [PATCH 2/2] Fix Stream.range with zero chunk size --- .changeset/fix-stream-range-zero-chunk.md | 5 +++++ packages/effect/src/Stream.ts | 7 ++++--- 2 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 .changeset/fix-stream-range-zero-chunk.md diff --git a/.changeset/fix-stream-range-zero-chunk.md b/.changeset/fix-stream-range-zero-chunk.md new file mode 100644 index 00000000000..cc28d66a7bf --- /dev/null +++ b/.changeset/fix-stream-range-zero-chunk.md @@ -0,0 +1,5 @@ +--- +"effect": patch +--- + +Ensure `Stream.range` emits the full range when the chunk size is zero. diff --git a/packages/effect/src/Stream.ts b/packages/effect/src/Stream.ts index 263602b3627..a2655ef6f5c 100644 --- a/packages/effect/src/Stream.ts +++ b/packages/effect/src/Stream.ts @@ -1570,14 +1570,15 @@ export const range = ( chunkSize = Channel.DefaultChunkSize ): Stream => min > max ? empty : fromPull(Effect.sync(() => { + const size = Math.max(1, chunkSize) let start = min let done = false return Effect.suspend(() => { if (done) return Cause.done() const remaining = max - start + 1 - if (remaining > chunkSize) { - const chunk = Arr.range(start, start + chunkSize - 1) - start += chunkSize + if (remaining > size) { + const chunk = Arr.range(start, start + size - 1) + start += size return Effect.succeed(chunk) } const chunk = Arr.range(start, start + remaining - 1)