Skip to content

StepPlayer

StepPlayer<Step> applies algorithm steps to a grid and tracks the current playback position. maze.generate() and maze.solve() each return one.

Most applications do not construct StepPlayer directly.

player.steps

ts
declare class StepPlayer<Step> {
  readonly steps: Step[]
}

Contains the steps materialized from the lazy source so far. It grows as forward playback requests new steps.

player.index

ts
declare class StepPlayer<Step> {
  readonly index: number
}

The number of currently applied steps. When index is greater than zero, the most recently applied step is steps[index - 1].

player.total

ts
declare class StepPlayer<Step> {
  readonly total: number
}

The number of currently buffered steps. This is not necessarily the final total while the source remains lazy.

player.done

ts
declare class StepPlayer<Step> {
  readonly done: boolean
}

true when no step remains after the current position. Reading this property may pull one step from the lazy source to determine whether playback can continue.

player.lastStep

ts
declare class StepPlayer<Step> {
  readonly lastStep: Step | undefined
}

The most recently applied step, or undefined at index 0.

player.progress

ts
interface StepPlayerProgress {
  bufferedSteps: number
  done: boolean
  index: number
  totalSteps: number | null
}

declare class StepPlayer<Step> {
  readonly progress: StepPlayerProgress
}

totalSteps is null until the player can determine the exact final total. It becomes a number when playback reaches the end.

player.next()

Applies up to count forward steps:

ts
declare class StepPlayer<Step> {
  next(count?: number): boolean
}

count defaults to 1. The method returns true when at least one step was applied:

ts
player.next()
player.next(10)

One call emits one step event, even when it applies multiple steps.

Reading Every Applied Step

lastStep exposes only the final step from a multi-step call. Record the starting index when an application must process every payload:

ts
const startIndex = player.index
player.next(10)

for (const step of player.steps.slice(startIndex, player.index)) {
  consume(step)
}

The grid receives every patch regardless of how many payloads the renderer reads.

player.prev()

Reverses up to count applied steps:

ts
declare class StepPlayer<Step> {
  prev(count?: number): boolean
}

It returns true when playback moved. Patches are reversed in reverse order, restoring each patch's previous value.

ts
player.prev()
player.prev(5)

player.finish()

Applies every remaining step:

ts
declare class StepPlayer<Step> {
  finish(): boolean
}

Returns true when playback advanced:

ts
const generation = maze.generate('dfs')
generation.finish()

player.reset()

Rewinds all applied steps to index 0:

ts
declare class StepPlayer<Step> {
  reset(): void
}

Buffered steps remain available, so replay does not regenerate previously materialized random choices.

Narrowing Step Payloads

Generation and solving steps are discriminated unions. Check type before reading a specialized payload:

ts
const step = player.lastStep

if (step?.type === 'solve.flood') {
  console.log(step.payload.to, step.payload.depth)
}

See Steps and Payloads for all step types, payload fields, and built-in algorithm emissions.

Released under the MIT License.