diff --git a/.changeset/ten-carpets-itch.md b/.changeset/ten-carpets-itch.md new file mode 100644 index 0000000000..03a65652b9 --- /dev/null +++ b/.changeset/ten-carpets-itch.md @@ -0,0 +1,5 @@ +--- +"effect": patch +--- + +Fix number of retries in retryN diff --git a/src/internal/schedule.ts b/src/internal/schedule.ts index 52e42011bb..c16440ac4d 100644 --- a/src/internal/schedule.ts +++ b/src/internal/schedule.ts @@ -1918,7 +1918,7 @@ const retryN_EffectLoop = ( n: number ): Effect.Effect => { return core.catchAll(self, (e) => - n < 0 ? + n <= 0 ? core.fail(e) : core.flatMap(core.yieldNow(), () => retryN_EffectLoop(self, n - 1))) } diff --git a/test/Schedule.test.ts b/test/Schedule.test.ts index f204c23f60..5d6b611076 100644 --- a/test/Schedule.test.ts +++ b/test/Schedule.test.ts @@ -435,6 +435,12 @@ describe.concurrent("Schedule", () => { ) assert.strictEqual(result, "Error: 2") })) + it.effect("retry exactly 'n' times after failure", () => + Effect.gen(function*($) { + const ref = yield* $(Ref.make(0)) + const result = yield* $(alwaysFail(ref), Effect.retryN(3), Effect.flip) + assert.strictEqual(result, "Error: 4") + })) // TODO(Max): after TestRandom // it.skip("for a given number of times with random jitter in (0, 1)") // Effect.gen(function*(){