From c71c1d1d3cc55b928d7a37193d054f36bef2fc34 Mon Sep 17 00:00:00 2001 From: Sebastian Lorenz Date: Sat, 1 Aug 2026 18:41:12 +0000 Subject: [PATCH 1/2] Add reproduction for Schedule issue --- packages/effect/test/Schedule.test.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/effect/test/Schedule.test.ts b/packages/effect/test/Schedule.test.ts index 7200df6f4b5..50a4dc56c75 100644 --- a/packages/effect/test/Schedule.test.ts +++ b/packages/effect/test/Schedule.test.ts @@ -4,6 +4,19 @@ import { constant, constUndefined } from "effect/Function" import { TestClock } from "effect/testing" describe("Schedule", () => { + describe("constructors", () => { + it.effect("during recurs while the duration has not elapsed", () => + Effect.gen(function*() { + const step = yield* Schedule.toStep(Schedule.during("1 second")) + const completed = yield* Pull.catchDone( + step(0, undefined).pipe(Effect.as(false)), + () => Effect.succeed(true) + ) + + assert.isFalse(completed) + })) + }) + describe("combining", () => { it.effect("max - outputs the slowest schedule duration", () => Effect.gen(function*() { From 18b3f1e3ea42f72ba2a0676e4d1ac53e1f53cd4e Mon Sep 17 00:00:00 2001 From: Tim Smart Date: Mon, 3 Aug 2026 10:38:51 +1200 Subject: [PATCH 2/2] Fix Schedule.during recurrence condition --- .changeset/fix-schedule-during.md | 5 +++++ packages/effect/src/Schedule.ts | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .changeset/fix-schedule-during.md diff --git a/.changeset/fix-schedule-during.md b/.changeset/fix-schedule-during.md new file mode 100644 index 00000000000..c881221afe4 --- /dev/null +++ b/.changeset/fix-schedule-during.md @@ -0,0 +1,5 @@ +--- +"effect": patch +--- + +Fix `Schedule.during` to recur until the configured duration has elapsed. diff --git a/packages/effect/src/Schedule.ts b/packages/effect/src/Schedule.ts index 1e2f50d7ca8..68782b5eb7c 100644 --- a/packages/effect/src/Schedule.ts +++ b/packages/effect/src/Schedule.ts @@ -753,8 +753,8 @@ export const during = (duration: Duration.Input): Schedule => effect.succeed((meta) => { const elapsed = Duration.millis(meta.elapsed) return meta.elapsed > durationMillis - ? effect.succeed([elapsed, Duration.zero]) - : Cause.done(elapsed) + ? Cause.done(elapsed) + : effect.succeed([elapsed, Duration.zero]) }) ) }