28 lines
643 B
TypeScript
28 lines
643 B
TypeScript
/**
|
|
* Generic undo stack with clone-on-push semantics.
|
|
*
|
|
* Stores deep clones of state snapshots. Popped snapshots are returned
|
|
* directly (no re-cloning) since they are already detached.
|
|
*/
|
|
export class UndoStack<S> {
|
|
private stack: S[] = [];
|
|
|
|
/** Push a deep clone of the given state onto the stack. */
|
|
push(state: S): void {
|
|
this.stack.push(structuredClone(state));
|
|
}
|
|
|
|
/** Pop and return the most recent snapshot, or undefined if empty. */
|
|
pop(): S | undefined {
|
|
return this.stack.pop();
|
|
}
|
|
|
|
/** Remove all snapshots. */
|
|
clear(): void {
|
|
this.stack.length = 0;
|
|
}
|
|
|
|
get length(): number {
|
|
return this.stack.length;
|
|
}
|
|
}
|