Commit graph

9 commits

Author SHA1 Message Date
google-labs-jules[bot]
c10a13f226 perf(workspace): optimize sheet title caching to reduce string allocations
Co-authored-by: Horizontal42 <75383519+Horizontal42@users.noreply.github.com>
2026-08-26 14:09:14 +00:00
Horizontal42
19a9631709
perf(workspace): cache sheet list during invalidate loop (#107)
Moved the evaluation of `this.sheets()` outside of the `while (changed)` invalidation loop to avoid redundant evaluations and allocations on deep dependency chains.

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
2026-08-19 16:35:33 +03:00
Horizontal42
3a657a2d5d
dedupe evaluation logic in Workspace 2026-08-09 15:57:25 +03:00
Horizontal42
ca6fa6d381 cache findSheetByTitle lookups 2026-07-29 14:14:49 +03:00
Horizontal42
5ccb46b01c cache sheet results for numeric search 2026-07-29 14:14:49 +03:00
Horizontal42
00bd1248e1 use a Set for the cross-sheet resolving stack
resolving was an array checked with .includes() on every xref lookup
during resolution — an O(n) membership test where only membership
ever mattered, not order. Set makes it O(1).
2026-07-08 14:12:38 +03:00
Horizontal42
80bb94674d cache referencedTitles per sheet in invalidate()'s fixed-point loop
invalidate() re-scans every non-dirty sheet's text with a regex on
every pass of its while loop, even though the text hasn't changed
between passes — cache the parsed refs per sheet id, keyed by text
identity, so repeated passes reuse the same result.
2026-07-08 14:10:36 +03:00
Horizontal42
0345d2a33f workspace: don't cache exports from a cycle-interrupted evaluation
In an A<->B cycle, exportsFor(B) run while A is mid-resolution would
compute a wrong export set (assignments dropped by the nested
"circular reference" error) and cache it anyway. Later queries then
served that stale, cycle-broken result even after the cycle-causing
outer call had unwound, giving inconsistent error messages across
repeated evaluations of the same cyclic setup.

Skip caching whenever any line in the result carries a "circular
reference" error - that's a precise, local signal the pass was
cycle-affected, so the sheet gets re-evaluated fresh until an edit
actually breaks the cycle. Normal (non-cyclic) caching is untouched.

Also adds a positive-path test confirming LineResult.error stays
undefined on an ordinary successful line, and a workspace-level test
proving a genuine cycle now reports a stable error across repeated
queries.
2026-07-02 05:50:40 +03:00
Horizontal42
8fb9ee3a31 workspace: sheet dependency graph, export cache, cycle guard, rename rewrite 2026-07-02 05:32:12 +03:00