Skip to content

LineState

Defined in: packages/engine/src/engine/DocumentModel.ts:34

Persistent per-line state tracked by the DocumentModel.

Each line receives an immutable lineId that survives structural edits (insertions, deletions, line shifts). This allows caches, the dependency graph, and VM checkpoints to reference lines by ID instead of by volatile line numbers.

── Multi-expression support ───────────────────────────────────────── A single document line may contain multiple inline solves (s\…“). To support this without breaking the 1:1 line-to-DAG-node contract:

  • expressions[] holds all extracted expression strings (1 entry for full-line expressions, N entries for N inline solves).
  • bytecodes[] holds compiled bytecode in corresponding order.
  • results[] holds evaluation result groups in corresponding order. Each element is a Value[], a group of Values produced by that expression. For variable definitions, the group always has exactly 1 element. For multi-output expressions (e.g., currency conversion), the group may have multiple Values (one per target unit).
  • reads[] and writes[] are aggregated across ALL expressions on the line, the DAG treats the line as a single dependency node.
  • inlineSolveCount is 0 for full-line expressions, >0 for inline solves.
bytecodes: BytecodeProgram[];

Defined in: packages/engine/src/engine/DocumentModel.ts:56

Compiled bytecode for each expression, in corresponding order. Parallel to expressions.


dirty: boolean;

Defined in: packages/engine/src/engine/DocumentModel.ts:81

True if this line needs re-evaluation.


expressions: string[];

Defined in: packages/engine/src/engine/DocumentModel.ts:50

Extracted expression texts.

  • Full-line expressions: one entry (the trimmed text).
  • Inline solve lines: one entry per s\…“ span, in left-to-right order.
  • Markdown-only lines: empty array.

inlineSolveCount: number;

Defined in: packages/engine/src/engine/DocumentModel.ts:94

Number of inline solve expressions on this line. 0 = full-line expression (or markdown-only).

0 = N inline solves embedded in markdown text.


isEmpty: boolean;

Defined in: packages/engine/src/engine/DocumentModel.ts:87

True if this line contains only markdown (no evaluable expression).


isVariableDef: boolean;

Defined in: packages/engine/src/engine/DocumentModel.ts:84

True if any expression on this line defines a variable (never evict bytecode).


readonly lineId: number;

Defined in: packages/engine/src/engine/DocumentModel.ts:36

Immutable unique identifier, survives all structural edits.


reads: string[];

Defined in: packages/engine/src/engine/DocumentModel.ts:59

Variables this line reads (for dependency tracking). Aggregated across all expressions.


result: Value | null;

Defined in: packages/engine/src/engine/DocumentModel.ts:78

Convenience accessor for the first expression’s first result. Equals results[0]?.[0] ?? null. For single-expression lines, this is the primary result. For multi-expression (inline solve) lines, prefer accessing results[i][j] directly.


results: Value[][];

Defined in: packages/engine/src/engine/DocumentModel.ts:70

Evaluation result groups for each expression, in corresponding order. Each Value[] is a group of Values produced by one expression. Variable definitions always produce exactly 1 Value per group. Multi-output expressions (e.g. currency conversion) may produce N Values.


text: string;

Defined in: packages/engine/src/engine/DocumentModel.ts:42

The full line text (may include markdown).


textHash: number;

Defined in: packages/engine/src/engine/DocumentModel.ts:39

djb2 hash of the line text, used for O(1) change detection.


writes: string[];

Defined in: packages/engine/src/engine/DocumentModel.ts:62

Variables this line writes (empty if not a variable definition). Aggregated across all expressions.