diff --git a/.changeset/two-rings-compare.md b/.changeset/two-rings-compare.md new file mode 100644 index 0000000000..4f75cec07e --- /dev/null +++ b/.changeset/two-rings-compare.md @@ -0,0 +1,5 @@ +--- +"effect": patch +--- + +fix Micro.forEach for empty iterables diff --git a/packages/effect/src/Micro.ts b/packages/effect/src/Micro.ts index 74b84e95e6..b5126671bb 100644 --- a/packages/effect/src/Micro.ts +++ b/packages/effect/src/Micro.ts @@ -2594,9 +2594,11 @@ export const withTrace: { const f = (name: string) => (self: Micro) => unsafeMakeOptions(function(env, onExit) { self[runSymbol](env, function(exit) { + console.log(name, exit) onExit(exit._tag === "Left" ? Either.left(generate(name, exit.left)) : exit) }) }, false) + console.log(arguments.length) if (arguments.length === 2) { return f(arguments[1])(arguments[0]) } @@ -3465,6 +3467,9 @@ export const forEach: { let result: MicroExit | undefined = undefined const items = Array.from(iterable) let length = items.length + if (length === 0) { + return onExit(Either.right(options?.discard ? undefined : [])) + } const out: Array | undefined = options?.discard ? undefined : new Array(length) let index = 0 let inProgress = 0 @@ -3949,6 +3954,7 @@ export const runSyncExit = (effect: Micro): MicroExit => { const handle = runFork(effect, { scheduler }) scheduler.flush() const exit = handle.unsafePoll() + console.log(exit) if (exit === null) { return exitDie(handle) } diff --git a/packages/effect/test/Micro.test.ts b/packages/effect/test/Micro.test.ts index 38fc839433..d040d81967 100644 --- a/packages/effect/test/Micro.test.ts +++ b/packages/effect/test/Micro.test.ts @@ -232,6 +232,12 @@ describe.concurrent("Micro", () => { assert.deepStrictEqual(result, Micro.exitFail("error")) assert.deepStrictEqual(done, [1, 2, 3]) }).pipe(Micro.runPromise)) + + it("length = 0", () => + Micro.gen(function*() { + const results = yield* Micro.forEach([], (_) => Micro.succeed(_)) + assert.deepStrictEqual(results, []) + }).pipe(Micro.runPromise)) }) describe("all", () => {