@sheetwrite/wasm 0.4.0 → 0.5.0

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.
@@ -1,5 +1,6 @@
1
1
  import { createLoader } from "./loader-state.mjs";
2
2
  import init from "./pkg/sheetwrite_wasm.js";
3
+ import { adoptPublishedModule, createInstance } from "./pkg/sheetwrite_wasm_factory.js";
3
4
 
4
5
  export * from "./pkg/sheetwrite_wasm.js";
5
6
 
@@ -12,3 +13,11 @@ const loader = createLoader(async (source) => {
12
13
  });
13
14
 
14
15
  export const { load, isLoaded } = loader;
16
+
17
+ /** Create an independently collectible engine, optionally reusing compiled code. */
18
+ export async function createEngine(source) {
19
+ const engine = createInstance();
20
+ await engine.init(source === undefined ? undefined : { module_or_path: source });
21
+ await loader.adopt(source, () => adoptPublishedModule(engine.getModule()));
22
+ return engine;
23
+ }
package/loader-node.mjs CHANGED
@@ -1,6 +1,8 @@
1
1
  import { readFile } from "node:fs/promises";
2
+
2
3
  import { createLoader } from "./loader-state.mjs";
3
4
  import init, { initSync } from "./pkg/sheetwrite_wasm.js";
5
+ import { adoptPublishedModule, createInstance } from "./pkg/sheetwrite_wasm_factory.js";
4
6
 
5
7
  export * from "./pkg/sheetwrite_wasm.js";
6
8
 
@@ -15,3 +17,20 @@ const loader = createLoader(async (source) => {
15
17
  });
16
18
 
17
19
  export const { load, isLoaded } = loader;
20
+
21
+ /** Create an independently collectible engine, optionally reusing compiled code. */
22
+ export async function createEngine(source) {
23
+ const engine = createInstance();
24
+
25
+ if (source === undefined) {
26
+ engine.initSync({
27
+ module: await readFile(new URL("./pkg/sheetwrite_wasm_bg.wasm", import.meta.url)),
28
+ });
29
+ } else {
30
+ await engine.init({ module_or_path: source });
31
+ }
32
+
33
+ await loader.adopt(source, () => adoptPublishedModule(engine.getModule()));
34
+
35
+ return engine;
36
+ }
package/loader-state.mjs CHANGED
@@ -23,6 +23,7 @@ export function createLoader(initialize) {
23
23
  if (source !== undefined && source !== selectedSource) {
24
24
  console.warn(DIFFERENT_SOURCE_AFTER_INIT);
25
25
  }
26
+
26
27
  return;
27
28
  }
28
29
 
@@ -30,6 +31,7 @@ export function createLoader(initialize) {
30
31
  if (source !== undefined && source !== selectedSource) {
31
32
  throw new Error(DIFFERENT_SOURCE_IN_FLIGHT);
32
33
  }
34
+
33
35
  return inFlight;
34
36
  }
35
37
 
@@ -50,5 +52,28 @@ export function createLoader(initialize) {
50
52
  return ready;
51
53
  }
52
54
 
53
- return { load, isLoaded };
55
+ /**
56
+ * Mark the published exports ready from an engine instance that already compiled the module.
57
+ * A load() in flight wins; `publish` runs only when this call makes the loader ready.
58
+ *
59
+ * @param {BufferSource | URL | string | Request | WebAssembly.Module | undefined} source
60
+ * @param {() => void} publish
61
+ */
62
+ async function adopt(source, publish) {
63
+ if (inFlight) {
64
+ try {
65
+ await inFlight;
66
+ } catch {
67
+ // A failed load() leaves the loader free for this instance to adopt.
68
+ }
69
+ }
70
+
71
+ if (ready) return;
72
+
73
+ publish();
74
+ selectedSource = source;
75
+ ready = true;
76
+ }
77
+
78
+ return { load, isLoaded, adopt };
54
79
  }
package/loader.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import type * as WasmExports from "./pkg/sheetwrite_wasm.js";
2
+
1
3
  export * from "./pkg/sheetwrite_wasm.js";
2
4
 
3
5
  /** Sources accepted by asynchronous initialization: a fetchable URL/request/response, raw module bytes, or a precompiled `WebAssembly.Module`. */
@@ -22,3 +24,18 @@ export declare function load(
22
24
 
23
25
  /** Whether the WASM module has finished initializing. */
24
26
  export declare function isLoaded(): boolean;
27
+
28
+ /** Engine objects and caches owned by one independently collectible WASM instance. */
29
+ export type EngineInstance = Omit<typeof WasmExports, "default"> & {
30
+ getModule(): WebAssembly.Module;
31
+
32
+ getMemory(): WebAssembly.Memory;
33
+
34
+ /** Drop all glue roots after releasing owned resources. This instance is then unusable. */
35
+ retire(): void;
36
+
37
+ functionNames?: () => string[];
38
+ };
39
+
40
+ /** Initialize a fresh engine; a compiled module can be reused without retaining its memory. */
41
+ export declare function createEngine(source?: Parameters<typeof load>[0]): Promise<EngineInstance>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sheetwrite/wasm",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "type": "module",
5
5
  "description": "Sheetwrite columnar store and data engine (Rust/WASM).",
6
6
  "license": "MIT",
@@ -39,6 +39,7 @@
39
39
  "loader-state.mjs",
40
40
  "loader.d.ts",
41
41
  "pkg/sheetwrite_wasm.js",
42
+ "pkg/sheetwrite_wasm_factory.js",
42
43
  "pkg/sheetwrite_wasm.d.ts",
43
44
  "pkg/sheetwrite_wasm_bg.wasm",
44
45
  "pkg/sheetwrite_wasm_bg.wasm.d.ts"
@@ -49,7 +50,7 @@
49
50
  },
50
51
  "sideEffects": false,
51
52
  "scripts": {
52
- "build": "wasm-pack build --target web --out-dir pkg",
53
+ "build": "wasm-pack build --target web --out-dir pkg && bun ../../scripts/wasm-factory.ts .",
53
54
  "typecheck": "tsc --noEmit -p tsconfig.json",
54
55
  "clean": "rm -rf pkg target"
55
56
  }
@@ -14,6 +14,27 @@ export class CellOut {
14
14
  readonly style: number;
15
15
  }
16
16
 
17
+ /**
18
+ * Resolved values of a sparse coordinate batch, one entry per requested cell.
19
+ *
20
+ * Every list holds one entry per cell, in the requested order. Text is stored
21
+ * once: `text_index` names the cell's entry in `strings`, or `-1` when the cell
22
+ * has no text, exactly like [`CellOut::string`] reports it.
23
+ */
24
+ export class CellSnapshot {
25
+ private constructor();
26
+ free(): void;
27
+ [Symbol.dispose](): void;
28
+ readonly kinds: Uint8Array;
29
+ readonly numbers: Float64Array;
30
+ readonly strings: string[];
31
+ readonly styles: Uint32Array;
32
+ /**
33
+ * Entry in [`Self::strings`] per cell, or `-1` for a cell without text.
34
+ */
35
+ readonly textIndex: Int32Array;
36
+ }
37
+
17
38
  /**
18
39
  * The workbook-wide store: every sheet, one string pool.
19
40
  */
@@ -30,6 +51,11 @@ export class CellStore {
30
51
  * Allocate a sheet grid and return its numeric handle.
31
52
  */
32
53
  addSheet(n_cols: number, row_count: number): number;
54
+ /**
55
+ * Whether a source rectangle can replace its spill cells without cutting
56
+ * an installed spill away from its anchor. No owner window crosses WASM.
57
+ */
58
+ admitSourceRange(sheet: number, r0: number, c0: number, r1: number, c1: number): boolean;
33
59
  /**
34
60
  * Column aggregate over numeric cells. op: 0 sum, 1 avg, 2 min, 3 max, 4 count.
35
61
  */
@@ -57,6 +83,15 @@ export class CellStore {
57
83
  * follow the caller's row-major coordinate order.
58
84
  */
59
85
  captureSourcesForRows(sheet: number, rows: Uint32Array, cols: Uint32Array): SourceSnapshot | undefined;
86
+ /**
87
+ * Resolved values of a sparse coordinate list in one batched read.
88
+ *
89
+ * `rows` and `cols` are absolute coordinates and must have the same length;
90
+ * otherwise the result carries no cells. Every entry reads exactly like
91
+ * [`Self::get_cell`], so a batched capture reports the values a per-cell
92
+ * read would.
93
+ */
94
+ cellSnapshots(sheet: number, rows: Uint32Array, cols: Uint32Array): CellSnapshot | undefined;
60
95
  /**
61
96
  * 0 unloaded, 1 loaded-empty, 2 loaded-value, 3 dirty local edit.
62
97
  */
@@ -69,7 +104,14 @@ export class CellStore {
69
104
  colCount(sheet: number): number;
70
105
  columnsFullyLoaded(sheet: number, start_row: number, end_row: number, cols: Uint32Array): boolean;
71
106
  /**
72
- * Release geometric growth slack after a bounded bulk ingest.
107
+ * Commit staged user or host sources. Admission metadata must be staged
108
+ * before this barrier; derived values and string roots are complete on return.
109
+ * Beginning a page load suppresses local dirty tracking until this commit.
110
+ */
111
+ commitSources(): void;
112
+ /**
113
+ * Reclaim unreachable text and release growth slack at a transaction barrier.
114
+ * Raw pool IDs must be discarded when `stringPoolEpoch` changes.
73
115
  */
74
116
  compactStringStorage(): void;
75
117
  /**
@@ -86,8 +128,10 @@ export class CellStore {
86
128
  dataEdgeOrdered(sheet: number, order: Uint32Array, row: number, col: number, d_row: number, d_col: number): number;
87
129
  dirtyRevision(sheet: number, row: number, col: number): bigint;
88
130
  distinctValues(sheet: number, col: number, limit: number): DistinctColumn;
89
- endMutation(): void;
90
- endPageLoad(): void;
131
+ /**
132
+ * Export only live state, not allocator slack or a dependency-index cache.
133
+ */
134
+ exportMemoryState(): Uint8Array;
91
135
  /**
92
136
  * Data-row indices whose column text contains `needle` (case-insensitive).
93
137
  */
@@ -97,6 +141,20 @@ export class CellStore {
97
141
  * Benchmark diagnostic: `[current matrix bytes, peak matrix bytes, allocations]`.
98
142
  */
99
143
  formulaMatrixResourceStats(): Float64Array;
144
+ /**
145
+ * Same-sheet calculation prerequisites for `start_row..end_row` × `cols`,
146
+ * as flat `[row_start, row_end, col_start, col_end)` rectangles.
147
+ *
148
+ * The walk follows each read into the formula cells it reaches, so for
149
+ * `H = F - G` and `F = D - E` it reports `D`, `E`, `F`, and `G`.
150
+ * Spill children follow their anchor; attempted spill destinations are also
151
+ * prerequisites because admission must establish that source cells are empty.
152
+ * Reads of other sheets are skipped. `max_cells` bounds the walk: a read larger than
153
+ * the remaining budget is skipped, so one whole-column range cannot make a
154
+ * window demand the full column. Rectangles are disjoint and ascend by
155
+ * column, then by row.
156
+ */
157
+ formulaReadBands(sheet: number, start_row: number, end_row: number, cols: Uint32Array, max_cells: number): Uint32Array;
100
158
  formulaSource(sheet: number, row: number, col: number): string | undefined;
101
159
  /**
102
160
  * Single-cell read for interactions/tests — never the render hot path.
@@ -104,9 +162,8 @@ export class CellStore {
104
162
  getCell(sheet: number, row: number, col: number): CellOut;
105
163
  /**
106
164
  * One bulk read of a rectangular window for the renderer. Returns
107
- * contiguous packed cell data (row-major over `rows x cols`) plus the
108
- * unique strings referenced by the window, so the host paints without
109
- * crossing the boundary per cell.
165
+ * contiguous packed cell data (row-major over `rows x cols`) with pool IDs
166
+ * and window-local formula-error strings, avoiding per-cell boundary reads.
110
167
  */
111
168
  getWindow(sheet: number, row_start: number, row_end: number, cols: Uint32Array): WindowView;
112
169
  /**
@@ -124,10 +181,25 @@ export class CellStore {
124
181
  * Packed-string counterpart to [`CellStore::hydrate_page_numbers`].
125
182
  */
126
183
  hydratePageStringsPacked(sheet: number, col: number, start_row: number, buf: string, utf16_lens: Uint32Array, style: number, protected_offsets: Uint32Array): void;
184
+ /**
185
+ * Import into a fresh instance; failure never mutates the source store.
186
+ */
187
+ static importMemoryState(bytes: Uint8Array): CellStore;
188
+ importRangeMemoryState(bytes: Uint8Array, sheet: number, row_start: number, col_start: number): RangeSnapshot;
127
189
  insertCols(sheet: number, at: number, count: number): void;
128
190
  isFullyLoaded(sheet: number): boolean;
129
191
  isPaged(sheet: number): boolean;
130
192
  isSheetAlive(sheet: number): boolean;
193
+ /**
194
+ * Loaded row runs of one column inside `start_row..end_row`, as flat
195
+ * `[start, end)` pairs in ascending, disjoint order.
196
+ *
197
+ * A row belongs to a run only when [`Self::columns_fully_loaded`] would
198
+ * report it loaded, so a caller can reconcile a whole column with one call
199
+ * instead of probing the band row by row. Rows outside the sheet and empty
200
+ * requests produce no pairs.
201
+ */
202
+ loadedSpans(sheet: number, start_row: number, end_row: number, col: number): Uint32Array;
131
203
  markCellCleanRevision(sheet: number, row: number, col: number, revision: bigint): boolean;
132
204
  markRangeClean(sheet: number, start_row: number, end_row: number, start_col: number, end_col: number): void;
133
205
  memoryStats(): Float64Array;
@@ -145,7 +217,19 @@ export class CellStore {
145
217
  * cells and source bytes, never the logical sheet rectangle.
146
218
  */
147
219
  persistedCellData(sheet: number): Float64Array;
220
+ /**
221
+ * Replaces caller-owned persistent pins; empty row ranges leave them unchanged.
222
+ */
148
223
  pinRange(sheet: number, start_row: number, end_row: number, cols: Uint32Array): void;
224
+ /**
225
+ * Replaces transient read protection without changing explicit or viewport pins.
226
+ * Nonempty `rows` are backing row IDs; otherwise `[start_row, end_row)` is used.
227
+ */
228
+ pinReadWindow(sheet: number, start_row: number, end_row: number, rows: Uint32Array, cols: Uint32Array): void;
229
+ /**
230
+ * Replaces viewport-owned protection independently of transient read pins.
231
+ */
232
+ pinViewportBands(sheet: number, bands: Uint32Array): void;
149
233
  poolStrings(ids: Uint32Array): string[];
150
234
  /**
151
235
  * `[contains cache constructions, owned distinct strings]`.
@@ -161,15 +245,9 @@ export class CellStore {
161
245
  *
162
246
  * The pass first grows the dirty cell set through formula read-sets to find
163
247
  * all dependent formulas. It then evaluates only those formulas, using a
164
- * per-pass memo table so each formula cell is evaluated at most once even
165
- * when many downstream formulas reference it.
248
+ * per-pass memo table to reuse formula results across dependent reads.
166
249
  */
167
250
  recompute(sheet: number): void;
168
- /**
169
- * Recompute the union of every dirty sheet once at the host transaction
170
- * barrier, including cross-sheet formula and plain-reference dependents.
171
- */
172
- recomputeChanged(): void;
173
251
  /**
174
252
  * Explicit volatile barrier. `serial` is a UTC spreadsheet serial using
175
253
  * the 1899-12-30 epoch; only TODAY/NOW formulas and their dependents dirty.
@@ -211,14 +289,31 @@ export class CellStore {
211
289
  */
212
290
  search(sheet: number, cols: Uint32Array, query: string, case_insensitive: boolean, whole_cell: boolean): Uint32Array;
213
291
  /**
214
- * Atomically write one row-major mixed literal/formula/reference block.
215
- * Formula/reference offsets are sparse row-major exceptions. Reference
216
- * targets are packed `[sheet_handle, row, col]` triples. The compact
292
+ * Atomically write one row-major mixed literal/formula/reference block
293
+ * whose text payload arrives packed instead of once per cell.
294
+ *
295
+ * `text_buf` holds the UTF-8 bytes of every `KIND_STRING` cell of `kinds`
296
+ * in cell-offset order. `text_offsets` carries their byte boundaries: the
297
+ * n-th string cell owns `text_offsets[n]..text_offsets[n + 1]`, and the
298
+ * last entry equals the buffer length, so a block without strings passes an
299
+ * empty buffer and `&[0]`. Literal strings are interned in cell-offset order;
300
+ * source-owned text slots are consumed without interning. The compact
217
301
  * status is `0` success, `1` invalid shape/bounds, `2` invalid or duplicate
218
302
  * source metadata, and `3` paged dirty-capacity rejection.
219
303
  */
220
- setBlock(sheet: number, start_row: number, start_col: number, rows: number, cols: number, kinds: Uint8Array, numbers: Float64Array, texts: string[], styles: Uint32Array, formula_offsets: Uint32Array, formula_sources: string[], reference_offsets: Uint32Array, reference_targets: Uint32Array): number;
304
+ setBlockPacked(sheet: number, start_row: number, start_col: number, rows: number, cols: number, kinds: Uint8Array, numbers: Float64Array, text_buf: Uint8Array, text_offsets: Uint32Array, styles: Uint32Array, formula_offsets: Uint32Array, formula_sources: string[], reference_offsets: Uint32Array, reference_targets: Uint32Array): number;
221
305
  setBool(sheet: number, row: number, col: number, value: boolean, style: number): void;
306
+ /**
307
+ * Atomically write one column-major mixed literal/formula/reference block
308
+ * whose text payload arrives packed.
309
+ *
310
+ * This is [`Self::set_block_packed`] with the flat input arrays in the
311
+ * store's own column-major order: cell `(row, col)` sits at
312
+ * `col * rows + row`, so a columnar import can fill them column by column.
313
+ * Text packing, source metadata and every status code behave exactly as in
314
+ * [`Self::set_block_packed`].
315
+ */
316
+ setColumnBlockPacked(sheet: number, start_row: number, start_col: number, rows: number, cols: number, kinds: Uint8Array, numbers: Float64Array, text_buf: Uint8Array, text_offsets: Uint32Array, styles: Uint32Array, formula_offsets: Uint32Array, formula_sources: string[], reference_offsets: Uint32Array, reference_targets: Uint32Array): number;
222
317
  /**
223
318
  * Bulk-load one column with numbers starting at `start_row`.
224
319
  */
@@ -244,13 +339,18 @@ export class CellStore {
244
339
  */
245
340
  setConditionalRules(sheet: number, kinds: Uint8Array, bounds: Uint32Array, nums: Float64Array, strs: string[], flags: Uint8Array): void;
246
341
  /**
247
- * Parse and store an arithmetic formula at `(row, col)`.
342
+ * Parse and store a formula at `(row, col)`.
248
343
  *
249
344
  * Setters only mark cells dirty; they do not recompute formulas. The host
250
345
  * calls `recompute(sheet)` once at the transaction barrier so a multi-cell
251
346
  * edit performs one dependency-scoped pass instead of one full-sheet pass
252
- * per setter. The returned value is the previous cached value until that
253
- * barrier recompute runs, and the store facade ignores it for batched edits.
347
+ * per setter. A successful parse returns the pre-write cached scalar; a
348
+ * parse rejection returns `0.0`, and a rejected write returns `NaN`.
349
+ *
350
+ * The dependency index is invalidated only when the rewrite changes what
351
+ * the formula reads or whether it produces an array. A constant-only edit
352
+ * keeps the cached index, so its next recompute visits just the edited
353
+ * formula and its dependents instead of every formula in the workbook.
254
354
  */
255
355
  setFormula(sheet: number, row: number, col: number, src: string, style: number): number;
256
356
  setNamedRange(name: string, scope: number, sheet: number, row_start: number, col_start: number, row_end: number, col_end: number): boolean;
@@ -292,6 +392,10 @@ export class CellStore {
292
392
  * Packed row-major `[anchor_row, anchor_col, ...]` owner coordinates.
293
393
  */
294
394
  spillOwnerCoordinates(sheet: number, row_start: number, row_end: number, cols: Uint32Array): Uint32Array;
395
+ /**
396
+ * Raw string IDs are valid only within this epoch, including window IDs.
397
+ */
398
+ stringPoolEpoch(): number;
295
399
  /**
296
400
  * Current style-dictionary id at a cell; `0` when out of bounds. Used by
297
401
  * the host to write derived (reference-shadow) values without disturbing
@@ -328,14 +432,18 @@ export class DistinctColumn {
328
432
  * Opaque, store-local history payload for one dense rectangular cell block.
329
433
  *
330
434
  * The host may retain this object in undo history, but it is deliberately not
331
- * part of the serialized document protocol. String payloads remain interned in
332
- * the owning `CellStore`, so snapshots must only be restored into that store.
435
+ * part of the serialized document protocol. A deduplicated local dictionary
436
+ * owns captured text independently of the store's pool epoch.
333
437
  */
334
438
  export class RangeSnapshot {
335
439
  private constructor();
336
440
  free(): void;
337
441
  [Symbol.dispose](): void;
338
442
  byteLength(): number;
443
+ /**
444
+ * Transfer packed scalars and the local dictionary, never JS cell patches.
445
+ */
446
+ exportMemoryState(sheet: number): Uint8Array;
339
447
  formulaOffsets(): Uint32Array;
340
448
  formulaSources(): string[];
341
449
  kinds(): Uint8Array;
@@ -368,6 +476,7 @@ export class WindowView {
368
476
  private constructor();
369
477
  free(): void;
370
478
  [Symbol.dispose](): void;
479
+ stringPoolEpoch(): number;
371
480
  /**
372
481
  * Consume the complete fixed-width window payload. The returned
373
482
  * `Uint8Array` is copied by wasm-bindgen into JS-owned memory.
@@ -386,6 +495,7 @@ export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembl
386
495
  export interface InitOutput {
387
496
  readonly memory: WebAssembly.Memory;
388
497
  readonly __wbg_cellout_free: (a: number, b: number) => void;
498
+ readonly __wbg_cellsnapshot_free: (a: number, b: number) => void;
389
499
  readonly __wbg_cellstore_free: (a: number, b: number) => void;
390
500
  readonly __wbg_distinctcolumn_free: (a: number, b: number) => void;
391
501
  readonly __wbg_rangesnapshot_free: (a: number, b: number) => void;
@@ -395,10 +505,16 @@ export interface InitOutput {
395
505
  readonly cellout_num: (a: number) => number;
396
506
  readonly cellout_string: (a: number) => [number, number];
397
507
  readonly cellout_style: (a: number) => number;
508
+ readonly cellsnapshot_kinds: (a: number) => [number, number];
509
+ readonly cellsnapshot_numbers: (a: number) => [number, number];
510
+ readonly cellsnapshot_strings: (a: number) => [number, number];
511
+ readonly cellsnapshot_styles: (a: number) => [number, number];
512
+ readonly cellsnapshot_textIndex: (a: number) => [number, number];
398
513
  readonly cellstore_acknowledgeRevision: (a: number, b: bigint) => void;
399
514
  readonly cellstore_addPagedSheet: (a: number, b: number, c: number, d: number, e: number, f: number) => number;
400
515
  readonly cellstore_addRows: (a: number, b: number, c: number, d: number) => void;
401
516
  readonly cellstore_addSheet: (a: number, b: number, c: number) => number;
517
+ readonly cellstore_admitSourceRange: (a: number, b: number, c: number, d: number, e: number, f: number) => number;
402
518
  readonly cellstore_aggregate: (a: number, b: number, c: number, d: number) => number;
403
519
  readonly cellstore_beginMutation: (a: number) => bigint;
404
520
  readonly cellstore_beginPageLoad: (a: number) => void;
@@ -407,31 +523,36 @@ export interface InitOutput {
407
523
  readonly cellstore_captureReferences: (a: number, b: number, c: number) => number;
408
524
  readonly cellstore_captureSources: (a: number, b: number, c: number, d: number, e: number, f: number) => number;
409
525
  readonly cellstore_captureSourcesForRows: (a: number, b: number, c: number, d: number, e: number, f: number) => number;
526
+ readonly cellstore_cellSnapshots: (a: number, b: number, c: number, d: number, e: number, f: number) => number;
410
527
  readonly cellstore_cellState: (a: number, b: number, c: number, d: number) => number;
411
528
  readonly cellstore_clearCell: (a: number, b: number, c: number, d: number, e: number) => void;
412
529
  readonly cellstore_clearRange: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => number;
413
530
  readonly cellstore_colCount: (a: number, b: number) => number;
414
531
  readonly cellstore_columnsFullyLoaded: (a: number, b: number, c: number, d: number, e: number, f: number) => number;
532
+ readonly cellstore_commitSources: (a: number) => void;
415
533
  readonly cellstore_compactStringStorage: (a: number) => void;
416
534
  readonly cellstore_dataEdge: (a: number, b: number, c: number, d: number, e: number, f: number) => number;
417
535
  readonly cellstore_dataEdgeOrdered: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => number;
418
536
  readonly cellstore_dirtyRevision: (a: number, b: number, c: number, d: number) => bigint;
419
537
  readonly cellstore_distinctValues: (a: number, b: number, c: number, d: number) => number;
420
- readonly cellstore_endMutation: (a: number) => void;
421
- readonly cellstore_endPageLoad: (a: number) => void;
538
+ readonly cellstore_exportMemoryState: (a: number) => [number, number];
422
539
  readonly cellstore_filterRows: (a: number, b: number, c: number, d: number, e: number) => [number, number];
423
540
  readonly cellstore_filterRowsMulti: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number) => [number, number];
424
541
  readonly cellstore_formulaMatrixResourceStats: (a: number) => [number, number];
542
+ readonly cellstore_formulaReadBands: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number];
425
543
  readonly cellstore_formulaSource: (a: number, b: number, c: number, d: number) => [number, number];
426
544
  readonly cellstore_getCell: (a: number, b: number, c: number, d: number) => number;
427
545
  readonly cellstore_getWindow: (a: number, b: number, c: number, d: number, e: number, f: number) => number;
428
546
  readonly cellstore_getWindowRows: (a: number, b: number, c: number, d: number, e: number, f: number) => number;
429
547
  readonly cellstore_hydratePageNumbers: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number) => void;
430
548
  readonly cellstore_hydratePageStringsPacked: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number) => void;
549
+ readonly cellstore_importMemoryState: (a: any) => number;
550
+ readonly cellstore_importRangeMemoryState: (a: number, b: any, c: number, d: number, e: number) => number;
431
551
  readonly cellstore_insertCols: (a: number, b: number, c: number, d: number) => void;
432
552
  readonly cellstore_isFullyLoaded: (a: number, b: number) => number;
433
553
  readonly cellstore_isPaged: (a: number, b: number) => number;
434
554
  readonly cellstore_isSheetAlive: (a: number, b: number) => number;
555
+ readonly cellstore_loadedSpans: (a: number, b: number, c: number, d: number, e: number) => [number, number];
435
556
  readonly cellstore_markCellCleanRevision: (a: number, b: number, c: number, d: number, e: bigint) => number;
436
557
  readonly cellstore_markRangeClean: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
437
558
  readonly cellstore_memoryStats: (a: number) => [number, number];
@@ -440,12 +561,13 @@ export interface InitOutput {
440
561
  readonly cellstore_pagedStats: (a: number, b: number) => [number, number];
441
562
  readonly cellstore_persistedCellData: (a: number, b: number) => [number, number];
442
563
  readonly cellstore_pinRange: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
564
+ readonly cellstore_pinReadWindow: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => void;
565
+ readonly cellstore_pinViewportBands: (a: number, b: number, c: number, d: number) => void;
443
566
  readonly cellstore_poolStrings: (a: number, b: number, c: number) => [number, number];
444
567
  readonly cellstore_queryResourceStats: (a: number) => [number, number];
445
568
  readonly cellstore_rangeFullyLoaded: (a: number, b: number, c: number, d: number, e: number, f: number) => number;
446
569
  readonly cellstore_rangeStyleIds: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
447
570
  readonly cellstore_recompute: (a: number, b: number) => void;
448
- readonly cellstore_recomputeChanged: (a: number) => void;
449
571
  readonly cellstore_recomputeVolatile: (a: number, b: number) => number;
450
572
  readonly cellstore_referenceTarget: (a: number, b: number, c: number, d: number) => [number, number];
451
573
  readonly cellstore_referencesTargeting: (a: number, b: number, c: number) => [number, number];
@@ -461,8 +583,9 @@ export interface InitOutput {
461
583
  readonly cellstore_restoreRange: (a: number, b: number, c: number, d: number, e: number) => number;
462
584
  readonly cellstore_rowCount: (a: number, b: number) => number;
463
585
  readonly cellstore_search: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => [number, number];
464
- readonly cellstore_setBlock: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number) => number;
586
+ readonly cellstore_setBlockPacked: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number) => number;
465
587
  readonly cellstore_setBool: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
588
+ readonly cellstore_setColumnBlockPacked: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number) => number;
466
589
  readonly cellstore_setColumnNumbers: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
467
590
  readonly cellstore_setColumnStrings: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
468
591
  readonly cellstore_setColumnStringsPacked: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number) => void;
@@ -483,12 +606,14 @@ export interface InitOutput {
483
606
  readonly cellstore_spillAnchorRow: (a: number, b: number, c: number, d: number) => number;
484
607
  readonly cellstore_spillDerivedMask: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
485
608
  readonly cellstore_spillOwnerCoordinates: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
609
+ readonly cellstore_stringPoolEpoch: (a: number) => number;
486
610
  readonly cellstore_styleIdAt: (a: number, b: number, c: number, d: number) => number;
487
611
  readonly cellstore_wasmCommittedBytes: (a: number) => number;
488
612
  readonly distinctcolumn_takeKinds: (a: number) => [number, number];
489
613
  readonly distinctcolumn_takeNumbers: (a: number) => [number, number];
490
614
  readonly distinctcolumn_takeTexts: (a: number) => [number, number];
491
615
  readonly rangesnapshot_byteLength: (a: number) => number;
616
+ readonly rangesnapshot_exportMemoryState: (a: number, b: number) => [number, number];
492
617
  readonly rangesnapshot_formulaOffsets: (a: number) => [number, number];
493
618
  readonly rangesnapshot_formulaSources: (a: number) => [number, number];
494
619
  readonly rangesnapshot_kinds: (a: number) => [number, number];
@@ -502,15 +627,16 @@ export interface InitOutput {
502
627
  readonly sourcesnapshot_referenceTargets: (a: number) => [number, number];
503
628
  readonly sourcesnapshot_spillDerived: (a: number) => [number, number];
504
629
  readonly windowview_nCols: (a: number) => number;
630
+ readonly windowview_nRows: (a: number) => number;
505
631
  readonly windowview_takeStrings: (a: number) => [number, number];
632
+ readonly windowview_stringPoolEpoch: (a: number) => number;
506
633
  readonly windowview_takePacked: (a: number) => [number, number];
507
- readonly windowview_nRows: (a: number) => number;
508
634
  readonly __wbindgen_malloc: (a: number, b: number) => number;
509
635
  readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
510
636
  readonly __wbindgen_externrefs: WebAssembly.Table;
511
637
  readonly __wbindgen_free: (a: number, b: number, c: number) => void;
512
- readonly __externref_table_alloc: () => number;
513
638
  readonly __externref_drop_slice: (a: number, b: number) => void;
639
+ readonly __externref_table_alloc: () => number;
514
640
  readonly __wbindgen_start: () => void;
515
641
  }
516
642