[API reference](https://evolu.dev/docs/api-reference) › [@evolu/common](https://evolu.dev/docs/api-reference/common) › [Schedule](https://evolu.dev/docs/api-reference/common/Schedule) › whileScheduleInput

```ts
function whileScheduleInput<Input>(
  predicate: Predicate<Input>,
): <Output>(schedule: Schedule<Output, Input>) => Schedule<Output, Input>;
```

Defined in: [packages/common/src/Schedule.ts:1164](https://github.com/evoluhq/evolu/blob/037c390af081e9944d616ff298a729515c5c5ab7/packages/common/src/Schedule.ts#L1164)

Continues while the input satisfies a predicate.

Stops (returns `Err(Done<void>)`) when [Predicate](https://evolu.dev/docs/api-reference/common/Types/type-aliases/Predicate) returns `false`.
Useful for input-aware retry strategies, e.g., only retry certain error
types.

### Continuing by input

```ts
import {
  assertErr,
  assertOk,
  done,
  exponential,
  testCreateDeps,
  whileScheduleInput,
  type Typed,
} from "@evolu/common";

interface MyError extends Typed<"Transient" | "Fatal"> {}

// Retry only transient errors.
const retryTransient = whileScheduleInput(
  (error: MyError) => error.type === "Transient",
)(exponential("100ms"));
const step = retryTransient(testCreateDeps());
assertOk(step({ type: "Transient" }), [100, 100]);
assertErr(step({ type: "Fatal" }), done());
```