@pilates/core 1.0.1 → 2.0.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.
- package/dist/algorithm/cache.d.ts +7 -19
- package/dist/algorithm/cache.d.ts.map +1 -1
- package/dist/algorithm/cache.js +31 -27
- package/dist/algorithm/cache.js.map +1 -1
- package/dist/algorithm/index.d.ts +31 -0
- package/dist/algorithm/index.d.ts.map +1 -1
- package/dist/algorithm/index.js +105 -13
- package/dist/algorithm/index.js.map +1 -1
- package/dist/algorithm/round.d.ts +13 -0
- package/dist/algorithm/round.d.ts.map +1 -1
- package/dist/algorithm/round.js +33 -16
- package/dist/algorithm/round.js.map +1 -1
- package/dist/algorithm/spineless/classify.d.ts +47 -0
- package/dist/algorithm/spineless/classify.d.ts.map +1 -0
- package/dist/algorithm/spineless/classify.js +109 -0
- package/dist/algorithm/spineless/classify.js.map +1 -0
- package/dist/algorithm/spineless/field-id-pool.d.ts +28 -0
- package/dist/algorithm/spineless/field-id-pool.d.ts.map +1 -0
- package/dist/algorithm/spineless/field-id-pool.js +35 -0
- package/dist/algorithm/spineless/field-id-pool.js.map +1 -0
- package/dist/algorithm/spineless/flex-grammar.d.ts +394 -0
- package/dist/algorithm/spineless/flex-grammar.d.ts.map +1 -0
- package/dist/algorithm/spineless/flex-grammar.js +2509 -0
- package/dist/algorithm/spineless/flex-grammar.js.map +1 -0
- package/dist/algorithm/spineless/grammar.d.ts +156 -0
- package/dist/algorithm/spineless/grammar.d.ts.map +1 -0
- package/dist/algorithm/spineless/grammar.js +145 -0
- package/dist/algorithm/spineless/grammar.js.map +1 -0
- package/dist/algorithm/spineless/layout.d.ts +167 -0
- package/dist/algorithm/spineless/layout.d.ts.map +1 -0
- package/dist/algorithm/spineless/layout.js +893 -0
- package/dist/algorithm/spineless/layout.js.map +1 -0
- package/dist/algorithm/spineless/order-maintenance.bench.d.ts +25 -0
- package/dist/algorithm/spineless/order-maintenance.bench.d.ts.map +1 -0
- package/dist/algorithm/spineless/order-maintenance.bench.js +78 -0
- package/dist/algorithm/spineless/order-maintenance.bench.js.map +1 -0
- package/dist/algorithm/spineless/order-maintenance.d.ts +201 -0
- package/dist/algorithm/spineless/order-maintenance.d.ts.map +1 -0
- package/dist/algorithm/spineless/order-maintenance.js +300 -0
- package/dist/algorithm/spineless/order-maintenance.js.map +1 -0
- package/dist/algorithm/spineless/priority-queue.bench.d.ts +17 -0
- package/dist/algorithm/spineless/priority-queue.bench.d.ts.map +1 -0
- package/dist/algorithm/spineless/priority-queue.bench.js +57 -0
- package/dist/algorithm/spineless/priority-queue.bench.js.map +1 -0
- package/dist/algorithm/spineless/priority-queue.d.ts +73 -0
- package/dist/algorithm/spineless/priority-queue.d.ts.map +1 -0
- package/dist/algorithm/spineless/priority-queue.js +149 -0
- package/dist/algorithm/spineless/priority-queue.js.map +1 -0
- package/dist/algorithm/spineless/runtime.d.ts +292 -0
- package/dist/algorithm/spineless/runtime.d.ts.map +1 -0
- package/dist/algorithm/spineless/runtime.js +609 -0
- package/dist/algorithm/spineless/runtime.js.map +1 -0
- package/dist/algorithm/spineless/style-dirty.d.ts +65 -0
- package/dist/algorithm/spineless/style-dirty.d.ts.map +1 -0
- package/dist/algorithm/spineless/style-dirty.js +75 -0
- package/dist/algorithm/spineless/style-dirty.js.map +1 -0
- package/dist/dirty-flags.d.ts +30 -0
- package/dist/dirty-flags.d.ts.map +1 -0
- package/dist/dirty-flags.js +35 -0
- package/dist/dirty-flags.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/inspect.d.ts +27 -0
- package/dist/inspect.d.ts.map +1 -0
- package/dist/inspect.js +61 -0
- package/dist/inspect.js.map +1 -0
- package/dist/layout-pool.d.ts +49 -0
- package/dist/layout-pool.d.ts.map +1 -0
- package/dist/layout-pool.js +75 -0
- package/dist/layout-pool.js.map +1 -0
- package/dist/node.d.ts +20 -3
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +63 -42
- package/dist/node.js.map +1 -1
- package/package.json +1 -1
|
@@ -87,31 +87,19 @@ export interface LayoutCacheKey {
|
|
|
87
87
|
heightMode: MeasureMode;
|
|
88
88
|
}
|
|
89
89
|
/** @internal */
|
|
90
|
-
export interface
|
|
91
|
-
left: number;
|
|
92
|
-
top: number;
|
|
90
|
+
export interface LayoutCacheValue {
|
|
93
91
|
width: number;
|
|
94
92
|
height: number;
|
|
95
93
|
scrollWidth: number;
|
|
96
94
|
scrollHeight: number;
|
|
97
95
|
/**
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
* when re-laying out a dirty boundary node under a cache-hit root.
|
|
102
|
-
* See `Node._floatLeft` for the full explanation.
|
|
96
|
+
* Flat child-layout data — `CHILD_STRIDE` (8) floats per direct child:
|
|
97
|
+
* [left, top, width, height, scrollWidth, scrollHeight, floatLeft, floatTop].
|
|
98
|
+
* Leaf nodes share the module-level `EMPTY_CHILD_DATA`.
|
|
103
99
|
*/
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
|
|
107
|
-
}
|
|
108
|
-
/** @internal */
|
|
109
|
-
export interface LayoutCacheValue {
|
|
110
|
-
width: number;
|
|
111
|
-
height: number;
|
|
112
|
-
scrollWidth: number;
|
|
113
|
-
scrollHeight: number;
|
|
114
|
-
childLayouts: CachedChildLayout[];
|
|
100
|
+
childData: Float64Array;
|
|
101
|
+
/** Number of direct children captured. `childData.length === childCount * CHILD_STRIDE`. */
|
|
102
|
+
childCount: number;
|
|
115
103
|
}
|
|
116
104
|
/**
|
|
117
105
|
* Single-slot per-node layout cache. Matches Yoga's `cachedLayout`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/algorithm/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,gBAAgB;AAChB,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,WAAW,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,WAAW,CAAC;CACzB;AAED,gBAAgB;AAChB,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAK;IACxC,OAAO,CAAC,KAAK,CAAkD;IAE/D;;;;;;;;;;OAUG;IACH,IAAI,SAAK;IACT,kCAAkC;IAClC,MAAM,SAAK;IAEX,MAAM,CAAC,GAAG,EAAE,eAAe,GAAG,iBAAiB,GAAG,SAAS;IAgB3D;;;;;;;;;OASG;IACH,KAAK,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAqB3D;;;;;OAKG;IACH,KAAK,IAAI,IAAI;CAGd;AAED,gBAAgB;AAChB,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,WAAW,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,WAAW,CAAC;CAKzB;
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/algorithm/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,gBAAgB;AAChB,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,WAAW,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,WAAW,CAAC;CACzB;AAED,gBAAgB;AAChB,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAK;IACxC,OAAO,CAAC,KAAK,CAAkD;IAE/D;;;;;;;;;;OAUG;IACH,IAAI,SAAK;IACT,kCAAkC;IAClC,MAAM,SAAK;IAEX,MAAM,CAAC,GAAG,EAAE,eAAe,GAAG,iBAAiB,GAAG,SAAS;IAgB3D;;;;;;;;;OASG;IACH,KAAK,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAqB3D;;;;;OAKG;IACH,KAAK,IAAI,IAAI;CAGd;AAED,gBAAgB;AAChB,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,WAAW,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,WAAW,CAAC;CAKzB;AAQD,gBAAgB;AAChB,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,SAAS,EAAE,YAAY,CAAC;IACxB,4FAA4F;IAC5F,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAAyE;IAErF,gBAAgB;IAChB,IAAI,SAAK;IACT,gBAAgB;IAChB,MAAM,SAAK;IAEX,MAAM,CAAC,GAAG,EAAE,cAAc,GAAG,gBAAgB,GAAG,SAAS;IAgBzD;;;;;;OAMG;IACH,KAAK,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAIzD,KAAK,IAAI,IAAI;CAGd;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,cAAc,EAAE,CAgBhE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAI/C;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAG9C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,gBAAgB,CAuB7D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI,CA2B1E;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,CAAC,EAAE,cAAc,EAAE,GAAG,MAAM,CAe5E"}
|
package/dist/algorithm/cache.js
CHANGED
|
@@ -96,6 +96,10 @@ export class MeasureCache {
|
|
|
96
96
|
this.slots.length = 0;
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
|
+
/** Number of Float64 slots per child in a `LayoutCacheValue.childData` array. */
|
|
100
|
+
const CHILD_STRIDE = 8;
|
|
101
|
+
/** Shared empty child-data array for leaf nodes — avoids per-leaf allocation. */
|
|
102
|
+
const EMPTY_CHILD_DATA = new Float64Array(0);
|
|
99
103
|
/**
|
|
100
104
|
* Single-slot per-node layout cache. Matches Yoga's `cachedLayout`
|
|
101
105
|
* (single overwrite-on-write) and Taffy's 1-slot layout-cache. Internal
|
|
@@ -223,27 +227,27 @@ export function markDirtyDeep(root) {
|
|
|
223
227
|
* @internal
|
|
224
228
|
*/
|
|
225
229
|
export function snapshotForCache(node) {
|
|
226
|
-
const childLayouts = [];
|
|
227
230
|
const count = node.getChildCount();
|
|
231
|
+
const childData = count === 0 ? EMPTY_CHILD_DATA : new Float64Array(count * CHILD_STRIDE);
|
|
228
232
|
for (let i = 0; i < count; i++) {
|
|
229
233
|
const c = node.getChild(i);
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
});
|
|
234
|
+
const base = i * CHILD_STRIDE;
|
|
235
|
+
childData[base] = c.layout.left;
|
|
236
|
+
childData[base + 1] = c.layout.top;
|
|
237
|
+
childData[base + 2] = c.layout.width;
|
|
238
|
+
childData[base + 3] = c.layout.height;
|
|
239
|
+
childData[base + 4] = c.layout.scrollWidth;
|
|
240
|
+
childData[base + 5] = c.layout.scrollHeight;
|
|
241
|
+
childData[base + 6] = c._floatLeft;
|
|
242
|
+
childData[base + 7] = c._floatTop;
|
|
240
243
|
}
|
|
241
244
|
return {
|
|
242
245
|
width: node.layout.width,
|
|
243
246
|
height: node.layout.height,
|
|
244
247
|
scrollWidth: node.layout.scrollWidth,
|
|
245
248
|
scrollHeight: node.layout.scrollHeight,
|
|
246
|
-
|
|
249
|
+
childData,
|
|
250
|
+
childCount: count,
|
|
247
251
|
};
|
|
248
252
|
}
|
|
249
253
|
/**
|
|
@@ -262,28 +266,28 @@ export function snapshotForCache(node) {
|
|
|
262
266
|
*/
|
|
263
267
|
export function restoreFromCache(node, value) {
|
|
264
268
|
if (process.env.PILATES_DIFFERENTIAL_LAYOUT === '1') {
|
|
265
|
-
if (node.getChildCount() !== value.
|
|
266
|
-
throw new Error(`[pilates layout cache] restored value has ${value.
|
|
269
|
+
if (node.getChildCount() !== value.childCount) {
|
|
270
|
+
throw new Error(`[pilates layout cache] restored value has ${value.childCount} children but node has ${node.getChildCount()} — cache invalidation bug`);
|
|
267
271
|
}
|
|
268
272
|
}
|
|
269
273
|
node._layout.width = value.width;
|
|
270
274
|
node._layout.height = value.height;
|
|
271
275
|
node._layout.scrollWidth = value.scrollWidth;
|
|
272
276
|
node._layout.scrollHeight = value.scrollHeight;
|
|
273
|
-
// node._layout.left/top are set by the caller before recursion starts
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
for (let i = 0; i <
|
|
277
|
+
// node._layout.left/top are set by the caller before recursion starts.
|
|
278
|
+
const cd = value.childData;
|
|
279
|
+
const count = node.getChildCount();
|
|
280
|
+
for (let i = 0; i < count; i++) {
|
|
277
281
|
const c = node.getChild(i);
|
|
278
|
-
const
|
|
279
|
-
c._layout.left =
|
|
280
|
-
c._layout.top =
|
|
281
|
-
c._layout.width =
|
|
282
|
-
c._layout.height =
|
|
283
|
-
c._layout.scrollWidth =
|
|
284
|
-
c._layout.scrollHeight =
|
|
285
|
-
c._floatLeft =
|
|
286
|
-
c._floatTop =
|
|
282
|
+
const base = i * CHILD_STRIDE;
|
|
283
|
+
c._layout.left = cd[base];
|
|
284
|
+
c._layout.top = cd[base + 1];
|
|
285
|
+
c._layout.width = cd[base + 2];
|
|
286
|
+
c._layout.height = cd[base + 3];
|
|
287
|
+
c._layout.scrollWidth = cd[base + 4];
|
|
288
|
+
c._layout.scrollHeight = cd[base + 5];
|
|
289
|
+
c._floatLeft = cd[base + 6];
|
|
290
|
+
c._floatTop = cd[base + 7];
|
|
287
291
|
}
|
|
288
292
|
}
|
|
289
293
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/algorithm/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAoBH;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,YAAY;IACf,MAAM,CAAU,WAAW,GAAG,CAAC,CAAC;IAChC,KAAK,GAA+C,EAAE,CAAC;IAE/D;;;;;;;;;;OAUG;IACH,IAAI,GAAG,CAAC,CAAC;IACT,kCAAkC;IAClC,MAAM,GAAG,CAAC,CAAC;IAEX,MAAM,CAAC,GAAoB;QACzB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IACE,IAAI,CAAC,cAAc,KAAK,GAAG,CAAC,cAAc;gBAC1C,IAAI,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS;gBAChC,IAAI,CAAC,eAAe,KAAK,GAAG,CAAC,eAAe;gBAC5C,IAAI,CAAC,UAAU,KAAK,GAAG,CAAC,UAAU,EAClC,CAAC;gBACD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACZ,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YACpD,CAAC;QACH,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,GAAoB,EAAE,KAAwB;QAClD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IACE,IAAI,CAAC,cAAc,KAAK,GAAG,CAAC,cAAc;gBAC1C,IAAI,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS;gBAChC,IAAI,CAAC,eAAe,KAAK,GAAG,CAAC,eAAe;gBAC5C,IAAI,CAAC,UAAU,KAAK,GAAG,CAAC,UAAU,EAClC,CAAC;gBACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;gBACzB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC3B,OAAO;YACT,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;YACjD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACxB,CAAC;;
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/algorithm/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,5 +15,36 @@
|
|
|
15
15
|
* catch any cache-correctness regression as soon as it lands.
|
|
16
16
|
*/
|
|
17
17
|
import type { Node } from '../node.js';
|
|
18
|
+
import { type LayoutTrace } from './spineless/layout.js';
|
|
19
|
+
export type { LayoutTrace } from './spineless/layout.js';
|
|
20
|
+
/**
|
|
21
|
+
* A profiler callback invoked after every public `calculateLayout`
|
|
22
|
+
* (outside differential mode) with the laid-out root and a
|
|
23
|
+
* `LayoutTrace` describing what the engine did. Register one with
|
|
24
|
+
* `setLayoutProfiler`.
|
|
25
|
+
*/
|
|
26
|
+
export type LayoutProfiler = (root: Node, trace: LayoutTrace) => void;
|
|
27
|
+
/**
|
|
28
|
+
* Register a profiler invoked after every `calculateLayout`, or pass
|
|
29
|
+
* `null` to disable. While no profiler is registered the layout path
|
|
30
|
+
* is unchanged — observability is strictly pay-for-what-you-use.
|
|
31
|
+
*/
|
|
32
|
+
export declare function setLayoutProfiler(listener: LayoutProfiler | null): void;
|
|
33
|
+
/**
|
|
34
|
+
* The engine path `root`'s most recent `calculateLayout` took, or
|
|
35
|
+
* `undefined` if it has never been laid out. Powers `inspectLayout`.
|
|
36
|
+
*
|
|
37
|
+
* @internal
|
|
38
|
+
*/
|
|
39
|
+
export declare function lastLayoutPath(root: Node): LayoutTrace['path'] | undefined;
|
|
18
40
|
export declare function calculateLayout(root: Node, availableWidth: number | undefined, availableHeight: number | undefined): void;
|
|
41
|
+
/**
|
|
42
|
+
* Run the imperative algorithm + its per-node layout cache directly,
|
|
43
|
+
* bypassing the Spineless default. The public `calculateLayout`
|
|
44
|
+
* routes through Spineless; this entry point lets the imperative
|
|
45
|
+
* cache's own tests exercise the imperative path.
|
|
46
|
+
*
|
|
47
|
+
* @internal
|
|
48
|
+
*/
|
|
49
|
+
export declare function calculateLayoutImperative(root: Node, availableWidth?: number, availableHeight?: number): void;
|
|
19
50
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/algorithm/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/algorithm/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAYvC,OAAO,EAAE,KAAK,WAAW,EAAmB,MAAM,uBAAuB,CAAC;AAE1E,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAIzD;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;AAKtE;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI,CAEvE;AAmBD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,SAAS,CAE1E;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,IAAI,EACV,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,eAAe,EAAE,MAAM,GAAG,SAAS,GAClC,IAAI,CA6DN;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,IAAI,EACV,cAAc,CAAC,EAAE,MAAM,EACvB,eAAe,CAAC,EAAE,MAAM,GACvB,IAAI,CAEN"}
|
package/dist/algorithm/index.js
CHANGED
|
@@ -17,26 +17,110 @@
|
|
|
17
17
|
import { LayoutCache, clearAllCaches, diffLayouts, markDirtyDeep, restoreFromCache, snapshotForCache, snapshotTreeLayouts, } from './cache.js';
|
|
18
18
|
import { layoutChildren, resolveRootAxisSize } from './main-axis.js';
|
|
19
19
|
import { roundLayout } from './round.js';
|
|
20
|
+
import { SpinelessLayout } from './spineless/layout.js';
|
|
20
21
|
const DIFFERENTIAL = process.env.PILATES_DIFFERENTIAL_LAYOUT === '1';
|
|
22
|
+
/** The registered profiler, or `null` while layout tracing is off. */
|
|
23
|
+
let profiler = null;
|
|
24
|
+
/**
|
|
25
|
+
* Register a profiler invoked after every `calculateLayout`, or pass
|
|
26
|
+
* `null` to disable. While no profiler is registered the layout path
|
|
27
|
+
* is unchanged — observability is strictly pay-for-what-you-use.
|
|
28
|
+
*/
|
|
29
|
+
export function setLayoutProfiler(listener) {
|
|
30
|
+
profiler = listener;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Per-root layout-engine state for the public `calculateLayout`.
|
|
34
|
+
* `'cold'` — laid out once, by the imperative path. A `SpinelessLayout`
|
|
35
|
+
* — adopted on the second call onward (see `calculateLayout`). Keyed
|
|
36
|
+
* weakly so a dropped root takes its state with it.
|
|
37
|
+
*/
|
|
38
|
+
const layoutEngines = new WeakMap();
|
|
39
|
+
/**
|
|
40
|
+
* The engine path each root's most recent `calculateLayout` took —
|
|
41
|
+
* read by the `inspectLayout` devtools dump (phase 9). Stored
|
|
42
|
+
* unconditionally (a `WeakMap.set` is negligible beside the O(tree)
|
|
43
|
+
* `spinelessSupports` walk the call already does), so the path is
|
|
44
|
+
* known whether or not a profiler is registered.
|
|
45
|
+
*/
|
|
46
|
+
const lastPaths = new WeakMap();
|
|
47
|
+
/**
|
|
48
|
+
* The engine path `root`'s most recent `calculateLayout` took, or
|
|
49
|
+
* `undefined` if it has never been laid out. Powers `inspectLayout`.
|
|
50
|
+
*
|
|
51
|
+
* @internal
|
|
52
|
+
*/
|
|
53
|
+
export function lastLayoutPath(root) {
|
|
54
|
+
return lastPaths.get(root);
|
|
55
|
+
}
|
|
21
56
|
export function calculateLayout(root, availableWidth, availableHeight) {
|
|
22
57
|
if (!DIFFERENTIAL) {
|
|
23
|
-
|
|
58
|
+
// The Spineless grammar covers every tree as of phase 10 (v29
|
|
59
|
+
// `display: 'none'`, v30 a measure function on an absolute node) —
|
|
60
|
+
// there is no longer a grammar-unsupported fallback. The
|
|
61
|
+
// imperative algorithm still serves a root's deliberate cold first
|
|
62
|
+
// layout (no grammar to amortise) and differential mode.
|
|
63
|
+
//
|
|
64
|
+
// `driver` is non-null exactly when the Spineless engine served
|
|
65
|
+
// this call — its `lastTrace` is then the trace to report.
|
|
66
|
+
let driver = null;
|
|
67
|
+
// First layout of a root: the imperative path is faster cold — no
|
|
68
|
+
// grammar to build. A root laid out a SECOND time is probably
|
|
69
|
+
// long-lived, so from then on the validated Spineless incremental
|
|
70
|
+
// engine takes over — build once, relay incrementally.
|
|
71
|
+
const engine = layoutEngines.get(root);
|
|
72
|
+
if (engine === undefined) {
|
|
73
|
+
calculateLayoutImpl(root, availableWidth, availableHeight, false);
|
|
74
|
+
layoutEngines.set(root, 'cold');
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
driver = engine === 'cold' ? new SpinelessLayout(root) : engine;
|
|
78
|
+
if (engine === 'cold')
|
|
79
|
+
layoutEngines.set(root, driver);
|
|
80
|
+
driver.layout(availableWidth, availableHeight);
|
|
81
|
+
}
|
|
82
|
+
// Record the path for `inspectLayout`. Reading `driver.lastTrace`
|
|
83
|
+
// costs nothing (a field read); the imperative-trace OBJECT below
|
|
84
|
+
// is built only when a profiler is registered.
|
|
85
|
+
lastPaths.set(root, driver !== null ? driver.lastTrace.path : 'imperative');
|
|
86
|
+
if (profiler !== null) {
|
|
87
|
+
profiler(root, driver !== null
|
|
88
|
+
? driver.lastTrace
|
|
89
|
+
: {
|
|
90
|
+
path: 'imperative',
|
|
91
|
+
dirtyNodes: 0,
|
|
92
|
+
fieldsRecomputed: 0,
|
|
93
|
+
fieldsChanged: 0,
|
|
94
|
+
movedSubtrees: 0,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
24
97
|
return;
|
|
25
98
|
}
|
|
26
99
|
// First pass: cached path (normal).
|
|
27
|
-
calculateLayoutImpl(root, availableWidth, availableHeight);
|
|
100
|
+
calculateLayoutImpl(root, availableWidth, availableHeight, true);
|
|
28
101
|
const cachedSnapshot = snapshotTreeLayouts(root);
|
|
29
102
|
// Second pass: clear caches, re-dirty, recompute cold.
|
|
30
103
|
clearAllCaches(root);
|
|
31
104
|
markDirtyDeep(root);
|
|
32
|
-
calculateLayoutImpl(root, availableWidth, availableHeight);
|
|
105
|
+
calculateLayoutImpl(root, availableWidth, availableHeight, true);
|
|
33
106
|
const coldSnapshot = snapshotTreeLayouts(root);
|
|
34
107
|
const diff = diffLayouts(cachedSnapshot, coldSnapshot);
|
|
35
108
|
if (diff !== '') {
|
|
36
109
|
throw new Error(`[pilates differential layout] cache produced different result than fresh recompute:\n ${diff}`);
|
|
37
110
|
}
|
|
38
111
|
}
|
|
39
|
-
|
|
112
|
+
/**
|
|
113
|
+
* Run the imperative algorithm + its per-node layout cache directly,
|
|
114
|
+
* bypassing the Spineless default. The public `calculateLayout`
|
|
115
|
+
* routes through Spineless; this entry point lets the imperative
|
|
116
|
+
* cache's own tests exercise the imperative path.
|
|
117
|
+
*
|
|
118
|
+
* @internal
|
|
119
|
+
*/
|
|
120
|
+
export function calculateLayoutImperative(root, availableWidth, availableHeight) {
|
|
121
|
+
calculateLayoutImpl(root, availableWidth, availableHeight, true);
|
|
122
|
+
}
|
|
123
|
+
function calculateLayoutImpl(root, availableWidth, availableHeight, populateCache) {
|
|
40
124
|
const widthMode = availableWidth === undefined ? 'undefined' : 'exactly';
|
|
41
125
|
const heightMode = availableHeight === undefined ? 'undefined' : 'exactly';
|
|
42
126
|
const aw = availableWidth ?? Number.POSITIVE_INFINITY;
|
|
@@ -96,12 +180,17 @@ function calculateLayoutImpl(root, availableWidth, availableHeight) {
|
|
|
96
180
|
root._layout.height = resolveRootAxisSize(root, 'column', availableHeight);
|
|
97
181
|
layoutChildren(root);
|
|
98
182
|
roundLayout(root);
|
|
99
|
-
computeScrollSizes(root);
|
|
183
|
+
computeScrollSizes(root, populateCache);
|
|
100
184
|
markClean(root);
|
|
101
185
|
// Store the root's result (computeScrollSizes already cached inner nodes).
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
186
|
+
// Skipped when populateCache is false — the router runs the imperative
|
|
187
|
+
// engine only once per root, then switches to Spineless, which never
|
|
188
|
+
// reads this cache.
|
|
189
|
+
if (populateCache) {
|
|
190
|
+
if (root._layoutCache === undefined)
|
|
191
|
+
root._layoutCache = new LayoutCache();
|
|
192
|
+
root._layoutCache.store(key, snapshotForCache(root));
|
|
193
|
+
}
|
|
105
194
|
}
|
|
106
195
|
function markClean(node) {
|
|
107
196
|
node.clearDirty();
|
|
@@ -120,9 +209,10 @@ function markClean(node) {
|
|
|
120
209
|
* Runs after `roundLayout` so the recorded extent is in integer cells and
|
|
121
210
|
* matches what the renderer paints.
|
|
122
211
|
*/
|
|
123
|
-
function computeScrollSizes(node) {
|
|
124
|
-
for (let i = 0; i < node.getChildCount(); i++)
|
|
125
|
-
computeScrollSizes(node.getChild(i));
|
|
212
|
+
function computeScrollSizes(node, populateCache) {
|
|
213
|
+
for (let i = 0; i < node.getChildCount(); i++) {
|
|
214
|
+
computeScrollSizes(node.getChild(i), populateCache);
|
|
215
|
+
}
|
|
126
216
|
let contentRight = 0;
|
|
127
217
|
let contentBottom = 0;
|
|
128
218
|
for (let i = 0; i < node.getChildCount(); i++) {
|
|
@@ -134,8 +224,10 @@ function computeScrollSizes(node) {
|
|
|
134
224
|
node._layout.scrollWidth = Math.max(node._layout.width, contentRight);
|
|
135
225
|
node._layout.scrollHeight = Math.max(node._layout.height, contentBottom);
|
|
136
226
|
// Cache the node's layout for next pass. Skip root (cached separately
|
|
137
|
-
// by calculateLayoutImpl with the original root key).
|
|
138
|
-
|
|
227
|
+
// by calculateLayoutImpl with the original root key). Skipped entirely
|
|
228
|
+
// when populateCache is false — the router's first-layout imperative pass
|
|
229
|
+
// populates a cache no subsequent layout reads (layout 2+ uses Spineless).
|
|
230
|
+
if (populateCache && node.getParent() !== null) {
|
|
139
231
|
const innerKey = {
|
|
140
232
|
availableWidth: node.layout.width,
|
|
141
233
|
widthMode: 'exactly',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/algorithm/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EACL,WAAW,EACX,cAAc,EACd,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/algorithm/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,4 +34,17 @@ export declare function roundLayout(root: Node): void;
|
|
|
34
34
|
* @internal
|
|
35
35
|
*/
|
|
36
36
|
export declare function roundLayoutSubtree(node: Node, parentAbsX: number, parentAbsY: number): void;
|
|
37
|
+
/**
|
|
38
|
+
* Round a subtree INCLUSIVE of `node`, given the float and rounded
|
|
39
|
+
* absolute positions of `node`'s parent. Used by the Spineless
|
|
40
|
+
* incremental relayout path: when only a subtree's float layout
|
|
41
|
+
* moved, its parent's rounding is unchanged, so the subtree can be
|
|
42
|
+
* re-rounded in isolation against the parent's stable corner.
|
|
43
|
+
*
|
|
44
|
+
* `node`'s `_layout` (and its descendants') must hold the FLOAT
|
|
45
|
+
* layout, exactly as after a `layoutChildren` pass.
|
|
46
|
+
*
|
|
47
|
+
* @internal
|
|
48
|
+
*/
|
|
49
|
+
export declare function roundLayoutFrom(node: Node, parentAbsX: number, parentAbsY: number, parentRoundedX: number, parentRoundedY: number): void;
|
|
37
50
|
//# sourceMappingURL=round.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"round.d.ts","sourceRoot":"","sources":["../../src/algorithm/round.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"round.d.ts","sourceRoot":"","sources":["../../src/algorithm/round.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAG5C;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAoB3F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,GACrB,IAAI,CAGN"}
|
package/dist/algorithm/round.js
CHANGED
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
*
|
|
16
16
|
* This mirrors Yoga's "round to pixel grid" pass.
|
|
17
17
|
*/
|
|
18
|
+
import { Pool } from '../layout-pool.js';
|
|
18
19
|
export function roundLayout(root) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
applyRounding(root, absolutes, 0, 0);
|
|
20
|
+
collectAbsolutes(root, 0, 0);
|
|
21
|
+
applyRounding(root, 0, 0);
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
24
|
* Round the layout of a subtree that sits at a known absolute position.
|
|
@@ -45,39 +45,56 @@ export function roundLayoutSubtree(node, parentAbsX, parentAbsY) {
|
|
|
45
45
|
// are computed in the same floating-point space as the full-tree roundLayout pass.
|
|
46
46
|
const nodeAbsX = parentAbsX + node._floatLeft;
|
|
47
47
|
const nodeAbsY = parentAbsY + node._floatTop;
|
|
48
|
-
const absolutes = new Map();
|
|
49
48
|
// Collect children relative to the node's absolute corner.
|
|
50
49
|
for (let i = 0; i < node.getChildCount(); i++) {
|
|
51
|
-
collectAbsolutes(node.getChild(i), nodeAbsX, nodeAbsY
|
|
50
|
+
collectAbsolutes(node.getChild(i), nodeAbsX, nodeAbsY);
|
|
52
51
|
}
|
|
53
52
|
// Round children (their positions are relative to `node`, so
|
|
54
53
|
// parentRoundedX/Y for each child is node's absolute corner rounded).
|
|
55
54
|
const roundedNodeX = Math.round(nodeAbsX);
|
|
56
55
|
const roundedNodeY = Math.round(nodeAbsY);
|
|
57
56
|
for (let i = 0; i < node.getChildCount(); i++) {
|
|
58
|
-
applyRounding(node.getChild(i),
|
|
57
|
+
applyRounding(node.getChild(i), roundedNodeX, roundedNodeY);
|
|
59
58
|
}
|
|
60
59
|
}
|
|
61
|
-
|
|
60
|
+
/**
|
|
61
|
+
* Round a subtree INCLUSIVE of `node`, given the float and rounded
|
|
62
|
+
* absolute positions of `node`'s parent. Used by the Spineless
|
|
63
|
+
* incremental relayout path: when only a subtree's float layout
|
|
64
|
+
* moved, its parent's rounding is unchanged, so the subtree can be
|
|
65
|
+
* re-rounded in isolation against the parent's stable corner.
|
|
66
|
+
*
|
|
67
|
+
* `node`'s `_layout` (and its descendants') must hold the FLOAT
|
|
68
|
+
* layout, exactly as after a `layoutChildren` pass.
|
|
69
|
+
*
|
|
70
|
+
* @internal
|
|
71
|
+
*/
|
|
72
|
+
export function roundLayoutFrom(node, parentAbsX, parentAbsY, parentRoundedX, parentRoundedY) {
|
|
73
|
+
collectAbsolutes(node, parentAbsX, parentAbsY);
|
|
74
|
+
applyRounding(node, parentRoundedX, parentRoundedY);
|
|
75
|
+
}
|
|
76
|
+
function collectAbsolutes(node, parentX, parentY) {
|
|
62
77
|
const x = parentX + node.layout.left;
|
|
63
78
|
const y = parentY + node.layout.top;
|
|
64
|
-
|
|
79
|
+
Pool.absCornersX[node._id] = x;
|
|
80
|
+
Pool.absCornersY[node._id] = y;
|
|
65
81
|
for (let i = 0; i < node.getChildCount(); i++) {
|
|
66
|
-
collectAbsolutes(node.getChild(i), x, y
|
|
82
|
+
collectAbsolutes(node.getChild(i), x, y);
|
|
67
83
|
}
|
|
68
84
|
}
|
|
69
|
-
function applyRounding(node,
|
|
70
|
-
const
|
|
71
|
-
const
|
|
72
|
-
const
|
|
73
|
-
const
|
|
74
|
-
const
|
|
85
|
+
function applyRounding(node, parentRoundedX, parentRoundedY) {
|
|
86
|
+
const absX = Pool.absCornersX[node._id];
|
|
87
|
+
const absY = Pool.absCornersY[node._id];
|
|
88
|
+
const roundedX = Math.round(absX);
|
|
89
|
+
const roundedY = Math.round(absY);
|
|
90
|
+
const roundedR = Math.round(absX + node.layout.width);
|
|
91
|
+
const roundedB = Math.round(absY + node.layout.height);
|
|
75
92
|
node._layout.left = roundedX - parentRoundedX;
|
|
76
93
|
node._layout.top = roundedY - parentRoundedY;
|
|
77
94
|
node._layout.width = Math.max(0, roundedR - roundedX);
|
|
78
95
|
node._layout.height = Math.max(0, roundedB - roundedY);
|
|
79
96
|
for (let i = 0; i < node.getChildCount(); i++) {
|
|
80
|
-
applyRounding(node.getChild(i),
|
|
97
|
+
applyRounding(node.getChild(i), roundedX, roundedY);
|
|
81
98
|
}
|
|
82
99
|
}
|
|
83
100
|
//# sourceMappingURL=round.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"round.js","sourceRoot":"","sources":["../../src/algorithm/round.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"round.js","sourceRoot":"","sources":["../../src/algorithm/round.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dirty-region classifier for the `calculateLayout` router (phase 14).
|
|
3
|
+
*
|
|
4
|
+
* Examines the dirty region of `root` against a snapshot map of the
|
|
5
|
+
* pre-mutation tree state. Returns a discriminated union telling the
|
|
6
|
+
* router which engine to use:
|
|
7
|
+
*
|
|
8
|
+
* - `value` — only value mutations on snapped nodes; Spineless wins
|
|
9
|
+
* - `structural` — one pivot node had its child list change; route to imperative
|
|
10
|
+
* - `multi-pivot` — two or more parents had children change; imperative for safety
|
|
11
|
+
* - `sig-change` — a snapped node had its signature or measure func change; imperative
|
|
12
|
+
* - `no-snap` — no snap map available (driver is cold or just invalidated)
|
|
13
|
+
*
|
|
14
|
+
* Pure function over `Node` reads + the snap map. No I/O, no
|
|
15
|
+
* side effects.
|
|
16
|
+
*
|
|
17
|
+
* @internal
|
|
18
|
+
*/
|
|
19
|
+
import type { MeasureFunc } from '../../measure-func.js';
|
|
20
|
+
import type { Node } from '../../node.js';
|
|
21
|
+
/**
|
|
22
|
+
* The structural-signature payload the classifier compares per node.
|
|
23
|
+
* Mirrors the shape `SpinelessLayout.layout()` uses internally; lifted
|
|
24
|
+
* here so the router can classify without instantiating a driver.
|
|
25
|
+
*/
|
|
26
|
+
export interface NodeSnap {
|
|
27
|
+
sig: string;
|
|
28
|
+
measure: MeasureFunc | null;
|
|
29
|
+
children: Node[];
|
|
30
|
+
}
|
|
31
|
+
export type Classification = {
|
|
32
|
+
kind: 'value';
|
|
33
|
+
} | {
|
|
34
|
+
kind: 'structural';
|
|
35
|
+
pivot: Node;
|
|
36
|
+
} | {
|
|
37
|
+
kind: 'multi-pivot';
|
|
38
|
+
} | {
|
|
39
|
+
kind: 'sig-change';
|
|
40
|
+
} | {
|
|
41
|
+
kind: 'no-snap';
|
|
42
|
+
};
|
|
43
|
+
/** Snapshot one node's structural shape for later comparison. */
|
|
44
|
+
export declare function snapNode(node: Node): NodeSnap;
|
|
45
|
+
/** Walk dirty region, classify against the snap map. */
|
|
46
|
+
export declare function classifyDirty(root: Node, snaps: ReadonlyMap<Node, NodeSnap> | null): Classification;
|
|
47
|
+
//# sourceMappingURL=classify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../../src/algorithm/spineless/classify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,IAAI,EAAE,CAAC;CAClB;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AA4BxB,iEAAiE;AACjE,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,QAAQ,CAI7C;AAWD,wDAAwD;AACxD,wBAAgB,aAAa,CAC3B,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,IAAI,GACxC,cAAc,CAwChB"}
|