[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) › unfoldSchedule

```ts
function unfoldSchedule<State>(
  initial: State,
  next: (state: State) => State,
): Schedule<State>;
```

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

Creates a schedule by unfolding a state.

Each step outputs the current state and computes the next state using the
provided function. Never stops — combine with [take](https://evolu.dev/docs/api-reference/common/Schedule/functions/take) or
[maxElapsed](https://evolu.dev/docs/api-reference/common/Schedule/functions/maxElapsed) to limit.

### Unfolding state

```ts

// Unfold counters, custom backoff values, or state machines.
const counter = unfoldSchedule(0, (n) => n + 1);
const customBackoff = unfoldSchedule(100, (delay) => Math.round(delay * 1.5));

type Phase = "init" | "warmup" | "active";
const phases = unfoldSchedule<Phase>("init", (phase) => {
  switch (phase) {
    case "init":
      return "warmup";
    case "warmup":
      return "active";
    case "active":
      return "active";
  }
});

const counterStep = counter(testCreateDeps());
const backoffStep = customBackoff(testCreateDeps());
const phaseStep = phases(testCreateDeps());
assertOk(counterStep(undefined), [0, 0]);
assertOk(counterStep(undefined), [1, 0]);
backoffStep(undefined);
phaseStep(undefined);
assertOk(backoffStep(undefined), [150, 0]);
assertOk(phaseStep(undefined), ["warmup", 0]);
```