Skip to content
Sheetwrite

Sheetwrite / Documentation

CellStore@sheetwrite/wasm

The workbook-wide store: every sheet, one string pool.

The workbook-wide store: every sheet, one string pool.

Members 62

addPagedSheet Allocate a logical sheet whose cell chunks materialize on page load or edit.
addPagedSheet: (n_cols: number, row_count: number, chunk_rows: number, byte_budget: number) => number;
addRows
addRows: (sheet: number, at: number, count: number) => void;
addSheet Allocate a sheet grid and return its numeric handle.
addSheet: (n_cols: number, row_count: number) => number;
aggregate Column aggregate over numeric cells.
aggregate: (sheet: number, col: number, op: number) => number;

Column aggregate over numeric cells. op: 0 sum, 1 avg, 2 min, 3 max, 4 count.

beginPageLoad
beginPageLoad: () => void;
captureRange Capture a dense rectangle into an opaque store-local history resource.
captureRange: (sheet: number, r0: number, c0: number, rows: number, cols: number) => RangeSnapshot | undefined;
cellState 0 unloaded, 1 loaded-empty, 2 loaded-value, 3 dirty local edit.
cellState: (sheet: number, row: number, col: number) => number;
clearCell
clearCell: (sheet: number, row: number, col: number, style: number) => void;
clearRange Clear a rectangle while independently controlling contents and style.
clearRange: (sheet: number, r0: number, c0: number, r1: number, c1: number, contents: boolean, style: boolean) => boolean;
colCount
colCount: (sheet: number) => number;
dataEdge Ctrl+Arrow destination: from (row, col) stepping by (drow, dcol) (exactly one of them ±1), return the destination row (vertical moves) or column (horizontal moves), Google Sheets semantics: - current and adjacent…
dataEdge: (sheet: number, row: number, col: number, d_row: number, d_col: number) => number;

Ctrl+Arrow destination: from `(row, col)` stepping by `(d_row, d_col)` (exactly one of them ±1), return the destination row (vertical moves) or column (horizontal moves), Google Sheets semantics:

  • current and adjacent cell non-empty → end of the contiguous non-empty run;
  • otherwise → the next non-empty cell in that direction;
  • nothing ahead → the sheet edge.

dataEdgeOrdered
dataEdgeOrdered: (sheet: number, order: Uint32Array, row: number, col: number, d_row: number, d_col: number) => number;
distinctValues
distinctValues: (sheet: number, col: number, limit: number) => DistinctColumn;
endPageLoad
endPageLoad: () => void;
filterRows Data-row indices whose column text contains needle (case-insensitive).
filterRows: (sheet: number, col: number, needle: string) => Uint32Array;
filterRowsMulti
filterRowsMulti: (sheet: number, cols: Uint32Array, kinds: Uint8Array, flags: Uint8Array, nums: Float64Array, num_counts: Uint32Array, text_counts: Uint32Array, value_nums: Float64Array, value_texts: string[]) => Uint32Array;
formulaSource
formulaSource: (sheet: number, row: number, col: number) => string | undefined;
free
free: () => void;
getCell Single-cell read for interactions/tests — never the render hot path.
getCell: (sheet: number, row: number, col: number) => CellOut;
getWindow One bulk read of a rectangular window for the renderer.
getWindow: (sheet: number, row_start: number, row_end: number, cols: Uint32Array) => WindowView;

One bulk read of a rectangular window for the renderer. Returns contiguous typed arrays (row-major over `rows x cols`) plus the unique strings referenced by the window, so the host paints without crossing the boundary per cell.

getWindowRows Bulk read of an explicit row list (sorted/filtered views) — same output shape as getwindow, rows taken from rows rather than a range.
getWindowRows: (sheet: number, rows: Uint32Array, cols: Uint32Array) => WindowView;

Bulk read of an explicit row list (sorted/filtered views) — same output shape as `get_window`, rows taken from `rows` rather than a range.

hydratePageNumbers Hydrate one datasource page column while retaining local dirty cells and request-revision exceptions.
hydratePageNumbers: (sheet: number, col: number, start_row: number, values: Float64Array, style: number, protected_offsets: Uint32Array) => void;

Hydrate one datasource page column while retaining local dirty cells and request-revision exceptions. `protected_offsets` is sorted and relative to `start_row`.

hydratePageStringsPacked Packed-string counterpart to [CellStore::hydratepagenumbers].
hydratePageStringsPacked: (sheet: number, col: number, start_row: number, buf: string, utf16_lens: Uint32Array, style: number, protected_offsets: Uint32Array) => void;

Packed-string counterpart to [`CellStore::hydrate_page_numbers`].

insertCols
insertCols: (sheet: number, at: number, count: number) => void;
isFullyLoaded
isFullyLoaded: (sheet: number) => boolean;
isPaged
isPaged: (sheet: number) => boolean;
isSheetAlive
isSheetAlive: (sheet: number) => boolean;
markRangeClean
markRangeClean: (sheet: number, start_row: number, end_row: number, start_col: number, end_col: number) => void;
pagedStats [chunks, loaded cells, dirty cells, allocated bytes, fully loaded].
pagedStats: (sheet: number) => Float64Array;
pinRange
pinRange: (sheet: number, start_row: number, end_row: number, cols: Uint32Array) => void;
poolStrings
poolStrings: (ids: Uint32Array) => string[];
queryResourceStats [contains cache constructions, owned distinct strings].
queryResourceStats: () => Float64Array;
rangeFullyLoaded
rangeFullyLoaded: (sheet: number, r0: number, c0: number, r1: number, c1: number) => boolean;
rangeStyleIds Unique style ids present in a rectangle; cost stays inside WASM.
rangeStyleIds: (sheet: number, r0: number, c0: number, r1: number, c1: number) => Uint32Array;
recompute Recompute formulas affected by cells changed since the last call.
recompute: (sheet: number) => void;

Recompute formulas affected by cells changed since the last call.

The pass first grows the dirty cell set through formula read-sets to find all dependent formulas. It then evaluates only those formulas, using a per-pass memo table so each formula cell is evaluated at most once even when many downstream formulas reference it.

recomputeVolatile Explicit volatile barrier.
recomputeVolatile: (serial: number) => boolean;

Explicit volatile barrier. `serial` is a UTC spreadsheet serial using the 1899-12-30 epoch; only TODAY/NOW formulas and their dependents dirty.

remapRangeStyles Remap styles over a rectangle using parallel old/new id tables.
remapRangeStyles: (sheet: number, r0: number, c0: number, r1: number, c1: number, old_ids: Uint32Array, new_ids: Uint32Array) => boolean;
removeCols
removeCols: (sheet: number, at: number, count: number) => void;
removeNamedRange
removeNamedRange: (name: string, scope: number) => boolean;
removeRows
removeRows: (sheet: number, at: number, count: number) => void;
removeSheet Tombstone a stable sheet handle and invalidate every formula reference to it.
removeSheet: (sheet: number) => boolean;
renameSheet Rename a live stable sheet handle and rewrite every resolved formula AST reference.
renameSheet: (sheet: number, id: string, name: string) => boolean;
resetQueryResourceStats
resetQueryResourceStats: () => void;
restoreRange Restore a captured block at a destination of the same dimensions.
restoreRange: (sheet: number, r0: number, c0: number, snapshot: RangeSnapshot) => boolean;
rowCount
rowCount: (sheet: number) => number;
setBlock Write one row-major typed block in a single boundary call.
setBlock: (sheet: number, start_row: number, start_col: number, rows: number, cols: number, kinds: Uint8Array, numbers: Float64Array, texts: string[], styles: Uint32Array) => boolean;

Write one row-major typed block in a single boundary call. `kinds` uses 0 empty / 1 number / 2 string; formulas and references are sparse host exceptions applied after this literal bulk write.

setBool
setBool: (sheet: number, row: number, col: number, value: boolean, style: number) => void;
setColumnNumbers Bulk-load one column with numbers starting at startrow.
setColumnNumbers: (sheet: number, col: number, start_row: number, values: Float64Array, style: number) => void;

Bulk-load one column with numbers starting at `start_row`.

setColumnStrings Bulk-load one column with strings starting at startrow.
setColumnStrings: (sheet: number, col: number, start_row: number, values: string[], style: number) => void;

Bulk-load one column with strings starting at `start_row`.

setColumnStringsPacked Bulk-load one column of strings from a single concatenated buffer plus per-row lengths in UTF-16 code units (the JS string.length unit).
setColumnStringsPacked: (sheet: number, col: number, start_row: number, buf: string, utf16_lens: Uint32Array, style: number) => void;

Bulk-load one column of strings from a single concatenated buffer plus per-row lengths in UTF-16 code units (the JS `string.length` unit). One boundary decode and one Rust allocation for the whole column, instead of one per row — the dominant ingest cost for text columns.

setConditionalRules Replace a sheet's conditional-format rules.
setConditionalRules: (sheet: number, kinds: Uint8Array, bounds: Uint32Array, nums: Float64Array, strs: string[], flags: Uint8Array) => void;

Replace a sheet's conditional-format rules. Packed columnar encoding, one entry per rule: `kinds` 0 gt / 1 lt / 2 eqNum / 3 eqStr / 4 eqEmpty / 5 contains; `bounds` = normalized `[r0, c0, r1, c1]` per rule; `nums` carries the numeric operand; `strs` the text operand; `flags` bit 0 = match-case for `contains`. Case-insensitive needles are lowercased here once so the per-cell match never allocates.

setFormula Parse and store an arithmetic formula at (row, col).
setFormula: (sheet: number, row: number, col: number, src: string, style: number) => number;

Parse and store an arithmetic formula at `(row, col)`.

Setters only mark cells dirty; they do not recompute formulas. The host calls recompute(sheet) once at the transaction barrier so a multi-cell edit performs one dependency-scoped pass instead of one full-sheet pass per setter. The returned value is the previous cached value until that barrier recompute runs, and the store facade ignores it for batched edits.

setNamedRange
setNamedRange: (name: string, scope: number, sheet: number, row_start: number, col_start: number, row_end: number, col_end: number) => boolean;
setNumber
setNumber: (sheet: number, row: number, col: number, value: number, style: number) => void;
setSheetName
setSheetName: (sheet: number, id: string, name: string) => void;
setString
setString: (sheet: number, row: number, col: number, value: string, style: number) => void;
snapshotNumbers
snapshotNumbers: (snapshot: RangeSnapshot) => Float64Array;
snapshotTexts
snapshotTexts: (snapshot: RangeSnapshot) => string[];
sortRows Stable row order sorted by a column.
sortRows: (sheet: number, col: number, ascending: boolean) => Uint32Array;

Stable row order sorted by a column. Returns a data-row permutation.

sortRowsMulti
sortRowsMulti: (sheet: number, cols: Uint32Array, ascending: Uint8Array, candidates: Uint32Array) => Uint32Array;
styleIdAt Current style-dictionary id at a cell; 0 when out of bounds.
styleIdAt: (sheet: number, row: number, col: number) => number

Current style-dictionary id at a cell; `0` when out of bounds. Used by the host to write derived (reference-shadow) values without disturbing the cell's style.

Declaration

View full TypeScript declaration
class CellStore {
addPagedSheet: (
n_cols: number,
row_count: number,
chunk_rows: number,
byte_budget: number,
) => number;
addRows: (sheet: number, at: number, count: number) => void;
addSheet: (n_cols: number, row_count: number) => number;
aggregate: (sheet: number, col: number, op: number) => number;
beginPageLoad: () => void;
captureRange: (
sheet: number,
r0: number,
c0: number,
rows: number,
cols: number,
) => RangeSnapshot | undefined;
cellState: (sheet: number, row: number, col: number) => number;
clearCell: (sheet: number, row: number, col: number, style: number) => void;
clearRange: (
sheet: number,
r0: number,
c0: number,
r1: number,
c1: number,
contents: boolean,
style: boolean,
) => boolean;
colCount: (sheet: number) => number;
dataEdge: (
sheet: number,
row: number,
col: number,
d_row: number,
d_col: number,
) => number;
dataEdgeOrdered: (
sheet: number,
order: Uint32Array,
row: number,
col: number,
d_row: number,
d_col: number,
) => number;
distinctValues: (
sheet: number,
col: number,
limit: number,
) => DistinctColumn;
endPageLoad: () => void;
filterRows: (sheet: number, col: number, needle: string) => Uint32Array;
filterRowsMulti: (
sheet: number,
cols: Uint32Array,
kinds: Uint8Array,
flags: Uint8Array,
nums: Float64Array,
num_counts: Uint32Array,
text_counts: Uint32Array,
value_nums: Float64Array,
value_texts: string[],
) => Uint32Array;
formulaSource: (
sheet: number,
row: number,
col: number,
) => string | undefined;
free: () => void;
getCell: (sheet: number, row: number, col: number) => CellOut;
getWindow: (
sheet: number,
row_start: number,
row_end: number,
cols: Uint32Array,
) => WindowView;
getWindowRows: (
sheet: number,
rows: Uint32Array,
cols: Uint32Array,
) => WindowView;
hydratePageNumbers: (
sheet: number,
col: number,
start_row: number,
values: Float64Array,
style: number,
protected_offsets: Uint32Array,
) => void;
hydratePageStringsPacked: (
sheet: number,
col: number,
start_row: number,
buf: string,
utf16_lens: Uint32Array,
style: number,
protected_offsets: Uint32Array,
) => void;
insertCols: (sheet: number, at: number, count: number) => void;
isFullyLoaded: (sheet: number) => boolean;
isPaged: (sheet: number) => boolean;
isSheetAlive: (sheet: number) => boolean;
markRangeClean: (
sheet: number,
start_row: number,
end_row: number,
start_col: number,
end_col: number,
) => void;
pagedStats: (sheet: number) => Float64Array;
pinRange: (
sheet: number,
start_row: number,
end_row: number,
cols: Uint32Array,
) => void;
poolStrings: (ids: Uint32Array) => string[];
queryResourceStats: () => Float64Array;
rangeFullyLoaded: (
sheet: number,
r0: number,
c0: number,
r1: number,
c1: number,
) => boolean;
rangeStyleIds: (
sheet: number,
r0: number,
c0: number,
r1: number,
c1: number,
) => Uint32Array;
recompute: (sheet: number) => void;
recomputeVolatile: (serial: number) => boolean;
remapRangeStyles: (
sheet: number,
r0: number,
c0: number,
r1: number,
c1: number,
old_ids: Uint32Array,
new_ids: Uint32Array,
) => boolean;
removeCols: (sheet: number, at: number, count: number) => void;
removeNamedRange: (name: string, scope: number) => boolean;
removeRows: (sheet: number, at: number, count: number) => void;
removeSheet: (sheet: number) => boolean;
renameSheet: (sheet: number, id: string, name: string) => boolean;
resetQueryResourceStats: () => void;
restoreRange: (
sheet: number,
r0: number,
c0: number,
snapshot: RangeSnapshot,
) => boolean;
rowCount: (sheet: number) => number;
search: (
sheet: number,
cols: Uint32Array,
query: string,
case_insensitive: boolean,
whole_cell: boolean,
) => Uint32Array;
setBlock: (
sheet: number,
start_row: number,
start_col: number,
rows: number,
cols: number,
kinds: Uint8Array,
numbers: Float64Array,
texts: string[],
styles: Uint32Array,
) => boolean;
setBool: (
sheet: number,
row: number,
col: number,
value: boolean,
style: number,
) => void;
setColumnNumbers: (
sheet: number,
col: number,
start_row: number,
values: Float64Array,
style: number,
) => void;
setColumnStrings: (
sheet: number,
col: number,
start_row: number,
values: string[],
style: number,
) => void;
setColumnStringsPacked: (
sheet: number,
col: number,
start_row: number,
buf: string,
utf16_lens: Uint32Array,
style: number,
) => void;
setConditionalRules: (
sheet: number,
kinds: Uint8Array,
bounds: Uint32Array,
nums: Float64Array,
strs: string[],
flags: Uint8Array,
) => void;
setFormula: (
sheet: number,
row: number,
col: number,
src: string,
style: number,
) => number;
setNamedRange: (
name: string,
scope: number,
sheet: number,
row_start: number,
col_start: number,
row_end: number,
col_end: number,
) => boolean;
setNumber: (
sheet: number,
row: number,
col: number,
value: number,
style: number,
) => void;
setSheetName: (sheet: number, id: string, name: string) => void;
setString: (
sheet: number,
row: number,
col: number,
value: string,
style: number,
) => void;
snapshotNumbers: (snapshot: RangeSnapshot) => Float64Array;
snapshotTexts: (snapshot: RangeSnapshot) => string[];
sortRows: (sheet: number, col: number, ascending: boolean) => Uint32Array;
sortRowsMulti: (
sheet: number,
cols: Uint32Array,
ascending: Uint8Array,
candidates: Uint32Array,
) => Uint32Array;
styleIdAt: (sheet: number, row: number, col: number) => number;
}