@laplace.live/persona-sdk 1.25.0 → 1.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14,10 +14,14 @@ export interface EditHistory<T> {
14
14
  redo(): T | null;
15
15
  canUndo(): boolean;
16
16
  canRedo(): boolean;
17
+ /** The cursor entry itself, uncloned — read it, never mutate it; null before the first reset. */
18
+ peek(): T | null;
17
19
  /**
18
20
  * Rewrite the run of entries around the cursor that share its `runKey`, outward until the key
19
21
  * changes on either side — a fold, never a step, so undo and redo across the run all carry it.
20
22
  */
21
23
  amend(runKey: (value: T) => string, rewrite: (value: T) => void): void;
24
+ /** Rewrite every entry, the redo tail included — never a step; for an identity every entry must follow. */
25
+ rewriteAll(rewrite: (value: T) => void): void;
22
26
  }
23
27
  export declare function createEditHistory<T>(limit?: number): EditHistory<T>;
@@ -3,6 +3,12 @@ export function createEditHistory(limit = EDIT_HISTORY_LIMIT) {
3
3
  let stack = [];
4
4
  let cursor = -1;
5
5
  const entryOf = (value, key = JSON.stringify(value)) => ({ value: structuredClone(value), key });
6
+ // A fold rewrites entries per frame while the camera eases; only the cursor's key is ever compared.
7
+ const keyOf = (entry) => (entry.key ??= JSON.stringify(entry.value));
8
+ const rewriteEntry = (entry, rewrite) => {
9
+ rewrite(entry.value);
10
+ entry.key = null;
11
+ };
6
12
  return {
7
13
  reset(value) {
8
14
  stack = [entryOf(value)];
@@ -14,7 +20,7 @@ export function createEditHistory(limit = EDIT_HISTORY_LIMIT) {
14
20
  // the redo tail alive.
15
21
  const key = JSON.stringify(value);
16
22
  const cur = stack[cursor];
17
- if (cur && cur.key === key)
23
+ if (cur && keyOf(cur) === key)
18
24
  return;
19
25
  stack.length = cursor + 1;
20
26
  stack.push(entryOf(value, key));
@@ -38,27 +44,28 @@ export function createEditHistory(limit = EDIT_HISTORY_LIMIT) {
38
44
  },
39
45
  canUndo: () => cursor > 0,
40
46
  canRedo: () => cursor < stack.length - 1,
47
+ peek: () => stack[cursor]?.value ?? null,
41
48
  amend(runKey, rewrite) {
42
49
  const cur = stack[cursor];
43
50
  if (!cur)
44
51
  return;
45
52
  const from = runKey(cur.value);
46
- const apply = (e) => {
47
- rewrite(e.value);
48
- e.key = JSON.stringify(e.value);
49
- };
50
53
  for (let i = cursor; i >= 0; i--) {
51
54
  const entry = stack[i];
52
55
  if (runKey(entry.value) !== from)
53
56
  break;
54
- apply(entry);
57
+ rewriteEntry(entry, rewrite);
55
58
  }
56
59
  for (let i = cursor + 1; i < stack.length; i++) {
57
60
  const entry = stack[i];
58
61
  if (runKey(entry.value) !== from)
59
62
  break;
60
- apply(entry);
63
+ rewriteEntry(entry, rewrite);
61
64
  }
62
65
  },
66
+ rewriteAll(rewrite) {
67
+ for (const entry of stack)
68
+ rewriteEntry(entry, rewrite);
69
+ },
63
70
  };
64
71
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@laplace.live/persona-sdk",
3
- "version": "1.25.0",
3
+ "version": "1.25.1",
4
4
  "description": "TypeScript SDK and wire schema for the LAPLACE Persona plugin API",
5
5
  "license": "MIT",
6
6
  "type": "module",