postext 0.3.38 → 0.3.40

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.
Files changed (135) hide show
  1. package/dist/__bench__/chapter.bench.test.d.ts +2 -0
  2. package/dist/__bench__/chapter.bench.test.d.ts.map +1 -0
  3. package/dist/__bench__/chapter.bench.test.js +80 -0
  4. package/dist/__bench__/chapter.bench.test.js.map +1 -0
  5. package/dist/__tests__/buildAsync.test.d.ts +2 -0
  6. package/dist/__tests__/buildAsync.test.d.ts.map +1 -0
  7. package/dist/__tests__/buildAsync.test.js +50 -0
  8. package/dist/__tests__/buildAsync.test.js.map +1 -0
  9. package/dist/__tests__/exports.test.js +5 -0
  10. package/dist/__tests__/exports.test.js.map +1 -1
  11. package/dist/__tests__/hyphenateMemo.test.d.ts +2 -0
  12. package/dist/__tests__/hyphenateMemo.test.d.ts.map +1 -0
  13. package/dist/__tests__/hyphenateMemo.test.js +21 -0
  14. package/dist/__tests__/hyphenateMemo.test.js.map +1 -0
  15. package/dist/__tests__/knuthPlassMerge.test.d.ts +2 -0
  16. package/dist/__tests__/knuthPlassMerge.test.d.ts.map +1 -0
  17. package/dist/__tests__/knuthPlassMerge.test.js +55 -0
  18. package/dist/__tests__/knuthPlassMerge.test.js.map +1 -0
  19. package/dist/__tests__/memos.test.d.ts +2 -0
  20. package/dist/__tests__/memos.test.d.ts.map +1 -0
  21. package/dist/__tests__/memos.test.js +37 -0
  22. package/dist/__tests__/memos.test.js.map +1 -0
  23. package/dist/__tests__/pipeline/rotatedResource.test.d.ts +2 -0
  24. package/dist/__tests__/pipeline/rotatedResource.test.d.ts.map +1 -0
  25. package/dist/__tests__/pipeline/rotatedResource.test.js +242 -0
  26. package/dist/__tests__/pipeline/rotatedResource.test.js.map +1 -0
  27. package/dist/canvas-backend/blockRender.d.ts.map +1 -1
  28. package/dist/canvas-backend/blockRender.js +7 -1
  29. package/dist/canvas-backend/blockRender.js.map +1 -1
  30. package/dist/canvas-backend/index.d.ts +5 -0
  31. package/dist/canvas-backend/index.d.ts.map +1 -1
  32. package/dist/canvas-backend/index.js +7 -4
  33. package/dist/canvas-backend/index.js.map +1 -1
  34. package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -1
  35. package/dist/canvas-backend/renderResourceBlock.js +21 -4
  36. package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
  37. package/dist/canvas-backend/swatch.d.ts +8 -0
  38. package/dist/canvas-backend/swatch.d.ts.map +1 -0
  39. package/dist/canvas-backend/swatch.js +20 -0
  40. package/dist/canvas-backend/swatch.js.map +1 -0
  41. package/dist/html-backend.d.ts.map +1 -1
  42. package/dist/html-backend.js +38 -10
  43. package/dist/html-backend.js.map +1 -1
  44. package/dist/hyphenate.d.ts.map +1 -1
  45. package/dist/hyphenate.js +50 -1
  46. package/dist/hyphenate.js.map +1 -1
  47. package/dist/index.d.ts +5 -4
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +3 -2
  50. package/dist/index.js.map +1 -1
  51. package/dist/knuthPlass/breakpoints.d.ts.map +1 -1
  52. package/dist/knuthPlass/breakpoints.js +7 -1
  53. package/dist/knuthPlass/breakpoints.js.map +1 -1
  54. package/dist/knuthPlass/richAdapter.d.ts +4 -0
  55. package/dist/knuthPlass/richAdapter.d.ts.map +1 -1
  56. package/dist/knuthPlass/richAdapter.js +2 -1
  57. package/dist/knuthPlass/richAdapter.js.map +1 -1
  58. package/dist/knuthPlass/types.d.ts +8 -0
  59. package/dist/knuthPlass/types.d.ts.map +1 -1
  60. package/dist/measure/plain.d.ts.map +1 -1
  61. package/dist/measure/plain.js +1 -0
  62. package/dist/measure/plain.js.map +1 -1
  63. package/dist/measure/rich.d.ts +8 -0
  64. package/dist/measure/rich.d.ts.map +1 -1
  65. package/dist/measure/rich.js +25 -2
  66. package/dist/measure/rich.js.map +1 -1
  67. package/dist/parse/blockParser.d.ts +5 -3
  68. package/dist/parse/blockParser.d.ts.map +1 -1
  69. package/dist/parse/blockParser.js +45 -30
  70. package/dist/parse/blockParser.js.map +1 -1
  71. package/dist/parse/index.d.ts +2 -0
  72. package/dist/parse/index.d.ts.map +1 -1
  73. package/dist/parse/index.js +1 -0
  74. package/dist/parse/index.js.map +1 -1
  75. package/dist/parse/inlineFormatting.d.ts +26 -0
  76. package/dist/parse/inlineFormatting.d.ts.map +1 -1
  77. package/dist/parse/inlineFormatting.js +45 -0
  78. package/dist/parse/inlineFormatting.js.map +1 -1
  79. package/dist/parse/inlineSnippet.d.ts +1 -1
  80. package/dist/parse/inlineSnippet.d.ts.map +1 -1
  81. package/dist/parse/inlineSnippet.js +4 -3
  82. package/dist/parse/inlineSnippet.js.map +1 -1
  83. package/dist/parse/sourceMapping.d.ts.map +1 -1
  84. package/dist/parse/sourceMapping.js +19 -1
  85. package/dist/parse/sourceMapping.js.map +1 -1
  86. package/dist/parse/types.d.ts +10 -0
  87. package/dist/parse/types.d.ts.map +1 -1
  88. package/dist/pipeline/bandCaps.d.ts +16 -0
  89. package/dist/pipeline/bandCaps.d.ts.map +1 -1
  90. package/dist/pipeline/bandCaps.js +22 -0
  91. package/dist/pipeline/bandCaps.js.map +1 -1
  92. package/dist/pipeline/build.d.ts +33 -0
  93. package/dist/pipeline/build.d.ts.map +1 -1
  94. package/dist/pipeline/build.js +140 -38
  95. package/dist/pipeline/build.js.map +1 -1
  96. package/dist/pipeline/config.d.ts.map +1 -1
  97. package/dist/pipeline/config.js +18 -0
  98. package/dist/pipeline/config.js.map +1 -1
  99. package/dist/pipeline/floatPlacement.d.ts +10 -3
  100. package/dist/pipeline/floatPlacement.d.ts.map +1 -1
  101. package/dist/pipeline/floatPlacement.js +10 -5
  102. package/dist/pipeline/floatPlacement.js.map +1 -1
  103. package/dist/pipeline/floatSlots.d.ts +3 -0
  104. package/dist/pipeline/floatSlots.d.ts.map +1 -1
  105. package/dist/pipeline/floatSlots.js.map +1 -1
  106. package/dist/pipeline/index.d.ts +2 -2
  107. package/dist/pipeline/index.d.ts.map +1 -1
  108. package/dist/pipeline/index.js +1 -1
  109. package/dist/pipeline/index.js.map +1 -1
  110. package/dist/pipeline/measureContentBlock.d.ts.map +1 -1
  111. package/dist/pipeline/measureContentBlock.js +6 -2
  112. package/dist/pipeline/measureContentBlock.js.map +1 -1
  113. package/dist/pipeline/resourceLayout.d.ts +16 -2
  114. package/dist/pipeline/resourceLayout.d.ts.map +1 -1
  115. package/dist/pipeline/resourceLayout.js +51 -4
  116. package/dist/pipeline/resourceLayout.js.map +1 -1
  117. package/dist/table/model.d.ts +7 -1
  118. package/dist/table/model.d.ts.map +1 -1
  119. package/dist/table/model.js +19 -0
  120. package/dist/table/model.js.map +1 -1
  121. package/dist/types.d.ts +18 -0
  122. package/dist/types.d.ts.map +1 -1
  123. package/dist/vdt.d.ts +50 -1
  124. package/dist/vdt.d.ts.map +1 -1
  125. package/dist/vdt.js +29 -0
  126. package/dist/vdt.js.map +1 -1
  127. package/dist/worker/client.d.ts +18 -2
  128. package/dist/worker/client.d.ts.map +1 -1
  129. package/dist/worker/client.js +28 -3
  130. package/dist/worker/client.js.map +1 -1
  131. package/dist/worker/layout.worker.js +135 -56
  132. package/dist/worker/layout.worker.js.map +1 -1
  133. package/dist/worker/protocol.d.ts +27 -2
  134. package/dist/worker/protocol.d.ts.map +1 -1
  135. package/package.json +3 -2
@@ -126,6 +126,20 @@ const capKey = (spanIndex, cap) => `${spanIndex}:${cap.startContentIndex}:${cap.
126
126
  * fit stage 1 costs no extra pass at all.
127
127
  */
128
128
  export function resolveBandCaps(initial, runPass) {
129
+ return drainPasses(resolveBandCapsGen(initial, runPass));
130
+ }
131
+ /** Run a pass driver to completion synchronously. */
132
+ export function drainPasses(gen) {
133
+ for (;;) {
134
+ const step = gen.next();
135
+ if (step.done)
136
+ return step.value;
137
+ }
138
+ }
139
+ /** {@link resolveBandCaps} as a generator that yields after every pass it
140
+ * runs, so a host driving the build asynchronously can let a cancel land
141
+ * (or the event loop turn) between passes. */
142
+ export function* resolveBandCapsGen(initial, runPass) {
129
143
  const caps = new Map();
130
144
  let result = initial;
131
145
  let passCount = 1;
@@ -165,6 +179,7 @@ export function resolveBandCaps(initial, runPass) {
165
179
  tried.add(capKey(spanIndex, cap));
166
180
  result = runPass(caps);
167
181
  passCount++;
182
+ yield;
168
183
  }
169
184
  // Never hand back a layout whose columns were capped for a box that did
170
185
  // not arrive: strip the failing caps (dropping an earlier cap can unsettle
@@ -181,6 +196,7 @@ export function resolveBandCaps(initial, runPass) {
181
196
  }
182
197
  result = runPass(caps);
183
198
  passCount++;
199
+ yield;
184
200
  }
185
201
  return { result, bandCaps: caps, passCount };
186
202
  }
@@ -202,6 +218,10 @@ export function resolveBandCaps(initial, runPass) {
202
218
  * returned untouched.
203
219
  */
204
220
  export function resolveTrailingCaps(initial, spanCaps, runPass) {
221
+ return drainPasses(resolveTrailingCapsGen(initial, spanCaps, runPass));
222
+ }
223
+ /** {@link resolveTrailingCaps} as a generator yielding after every pass. */
224
+ export function* resolveTrailingCapsGen(initial, spanCaps, runPass) {
205
225
  const caps = new Map(spanCaps);
206
226
  /** Caps whose band did open under them and overflowed — the only ones a
207
227
  * pass says anything about; a cap that never applied may come back. */
@@ -227,6 +247,7 @@ export function resolveTrailingCaps(initial, spanCaps, runPass) {
227
247
  for (let extra = 0; extra < MAX_BAND_PASSES; extra++) {
228
248
  result = runPass(caps);
229
249
  passCount++;
250
+ yield;
230
251
  if ([...spanCaps.keys()].some((i) => !result.spanPlacedInBand.has(i)))
231
252
  return giveUp();
232
253
  const failing = trailingKeys().filter((i) => !result.spanPlacedInBand.has(i));
@@ -265,6 +286,7 @@ export function resolveTrailingCaps(initial, spanCaps, runPass) {
265
286
  return giveUp();
266
287
  result = runPass(caps);
267
288
  passCount++;
289
+ yield;
268
290
  const delivered = [...caps.keys()].every((i) => result.spanPlacedInBand.has(i));
269
291
  return delivered ? { result, caps, passCount } : giveUp();
270
292
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bandCaps.js","sourceRoot":"","sources":["../../src/pipeline/bandCaps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bandCaps.js","sourceRoot":"","sources":["../../src/pipeline/bandCaps.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,23 @@ export interface BuildDocumentOptions {
18
18
  * restarts). A long build can show a bar from it.
19
19
  */
20
20
  onProgress?: (progress: BuildProgress) => void;
21
+ /**
22
+ * Called after every placement pass with its wall time — the engine
23
+ * re-places the document several times (band caps, column balancing,
24
+ * contents rounds); dev tooling shows where a build's time went.
25
+ */
26
+ onPass?: (info: BuildPassInfo) => void;
27
+ }
28
+ /** One placement pass of a build, as reported to {@link BuildDocumentOptions.onPass}. */
29
+ export interface BuildPassInfo {
30
+ /** 1-based pass within its contents round. */
31
+ pass: number;
32
+ /** 0-based round of a document laying out its own contents (see `MAX_TOC_ROUNDS`). */
33
+ tocRound: number;
34
+ /** Wall time of the pass in ms. */
35
+ ms: number;
36
+ /** Pages the pass produced. */
37
+ pages: number;
21
38
  }
22
39
  export interface BuildProgress {
23
40
  /** 1-based placement pass. */
@@ -72,4 +89,20 @@ export interface PassResult extends BandPassReport {
72
89
  */
73
90
  export declare function buildDocumentPass(content: PostextContent, config?: PostextConfig, cache?: MeasurementCache, options?: BuildDocumentOptions, hints?: PassHints): PassResult;
74
91
  export declare function buildDocument(content: PostextContent, config?: PostextConfig, cache?: MeasurementCache, options?: BuildDocumentOptions): VDTDocument;
92
+ /** Let the event loop turn: `scheduler.yield()` where it exists, else a
93
+ * message-channel hop (a `setTimeout(0)` is clamped to 4 ms once nested). */
94
+ export declare function yieldToEventLoop(): Promise<void>;
95
+ /**
96
+ * {@link buildDocument}, yielding to the event loop between placement
97
+ * passes. A build is several passes (band caps, column balancing, contents
98
+ * rounds), each a synchronous re-placement of the document; in a worker
99
+ * this lets a `cancel` posted mid-build be observed at the next pass
100
+ * boundary — `shouldCancel` is polled there as well as inside a pass —
101
+ * instead of after the whole build.
102
+ */
103
+ export declare function buildDocumentAsync(content: PostextContent, config?: PostextConfig, cache?: MeasurementCache, options?: BuildDocumentOptions & {
104
+ yieldBetweenPasses?: () => Promise<void>;
105
+ }): Promise<VDTDocument>;
106
+ /** The build as a generator: one `yield` after every placement pass. */
107
+ export declare function buildDocumentGen(content: PostextContent, config?: PostextConfig, cache?: MeasurementCache, options?: BuildDocumentOptions): Generator<void, VDTDocument, void>;
75
108
  //# sourceMappingURL=build.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/pipeline/build.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAA0E,MAAM,UAAU,CAAC;AAGtI,OAAO,EAIL,KAAK,WAAW,EAMjB,MAAM,QAAQ,CAAC;AAYhB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAmFnD,OAAO,EAA0F,KAAK,WAAW,EAAuG,MAAM,mBAAmB,CAAC;AAClP,OAAO,EAQL,KAAK,OAAO,EACZ,KAAK,cAAc,EAGpB,MAAM,YAAY,CAAC;AAOpB,MAAM,WAAW,oBAAoB;IACnC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC;IAC7B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,aAAa;IAC5B,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb;qCACiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,mBAAoB,SAAQ,KAAK;;CAK7C;AAWD;yEACyE;AACzE,MAAM,WAAW,SAAS;IACxB,8EAA8E;IAC9E,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C;4EACwE;IACxE,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACtD,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,UAAW,SAAQ,cAAc;IAChD,GAAG,EAAE,WAAW,CAAC;IACjB;;+DAE2D;IAC3D,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B;;;4EAGwE;IACxE,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;CAC1C;AAuCD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,aAAa,EACtB,KAAK,CAAC,EAAE,gBAAgB,EACxB,OAAO,CAAC,EAAE,oBAAoB,EAC9B,KAAK,GAAE,SAAc,GACpB,UAAU,CAu2FZ;AAMD,wBAAgB,aAAa,CAC3B,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,aAAa,EACtB,KAAK,CAAC,EAAE,gBAAgB,EACxB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,WAAW,CAqBb"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/pipeline/build.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAA4F,MAAM,UAAU,CAAC;AAGxJ,OAAO,EAIL,KAAK,WAAW,EAMjB,MAAM,QAAQ,CAAC;AAYhB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAmFnD,OAAO,EAA0F,KAAK,WAAW,EAAuG,MAAM,mBAAmB,CAAC;AAClP,OAAO,EAQL,KAAK,OAAO,EACZ,KAAK,cAAc,EAGpB,MAAM,YAAY,CAAC;AAOpB,MAAM,WAAW,oBAAoB;IACnC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC;IAC7B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAC;IAC/C;;;;OAIG;IACH,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;CACxC;AAED,yFAAyF;AACzF,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,sFAAsF;IACtF,QAAQ,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb;qCACiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,mBAAoB,SAAQ,KAAK;;CAK7C;AAWD;yEACyE;AACzE,MAAM,WAAW,SAAS;IACxB,8EAA8E;IAC9E,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C;4EACwE;IACxE,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACtD,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,UAAW,SAAQ,cAAc;IAChD,GAAG,EAAE,WAAW,CAAC;IACjB;;+DAE2D;IAC3D,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B;;;4EAGwE;IACxE,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;CAC1C;AAuCD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,aAAa,EACtB,KAAK,CAAC,EAAE,gBAAgB,EACxB,OAAO,CAAC,EAAE,oBAAoB,EAC9B,KAAK,GAAE,SAAc,GACpB,UAAU,CAk6FZ;AAMD,wBAAgB,aAAa,CAC3B,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,aAAa,EACtB,KAAK,CAAC,EAAE,gBAAgB,EACxB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,WAAW,CAEb;AAED;8EAC8E;AAC9E,wBAAgB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAchD;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,aAAa,EACtB,KAAK,CAAC,EAAE,gBAAgB,EACxB,OAAO,CAAC,EAAE,oBAAoB,GAAG;IAAE,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,GAC5E,OAAO,CAAC,WAAW,CAAC,CAStB;AAED,wEAAwE;AACxE,wBAAiB,gBAAgB,CAC/B,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,aAAa,EACtB,KAAK,CAAC,EAAE,gBAAgB,EACxB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,CAqBpC"}
@@ -26,7 +26,7 @@ import { computeHeadingContext, computeResourceNumbering, } from './resourceNumb
26
26
  import { defaultResourceTypes } from '../defaults/resourceTypes';
27
27
  import { buildHeadersAndFooters, measureHeadingAdvancedDesignHeight } from './headerFooter';
28
28
  import { proposeBalanceLines, collectColumnGaps, firstDivergentColumn, gapLinesIn, pageSegments, MAX_BALANCING_PASSES, MAX_BALANCING_PASSES_PER_DOCUMENT, balanceKey } from './columnBalancing';
29
- import { applyBandCap, uncapBand, columnBottom, bandCapLines, bandTop, resolveBandCaps, resolveTrailingCaps, bandCapLinesAroundZone, } from './bandCaps';
29
+ import { applyBandCap, uncapBand, columnBottom, bandCapLines, bandTop, resolveBandCapsGen, drainPasses, resolveTrailingCapsGen, bandCapLinesAroundZone, } from './bandCaps';
30
30
  import { raggedLooseLines } from './raggedLines';
31
31
  /** Tolerance for "does this block fit" checks against a column's free
32
32
  * height, absorbing floating-point drift between grid multiples. */
@@ -233,6 +233,13 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
233
233
  /** Offset a resolved resource block's caption/table geometry from
234
234
  * block-relative to absolute page coordinates (mirrors inline placement). */
235
235
  const offsetResourceBlockToAbsolute = (rb, ox, oy) => {
236
+ // A rotated block keeps its geometry in the upright frame; only the
237
+ // frame's origin moves on the page.
238
+ if (rb.rotation) {
239
+ rb.rotation.originX += ox;
240
+ rb.rotation.originY += oy;
241
+ return;
242
+ }
236
243
  for (const ln of rb.captionLines) {
237
244
  ln.bbox.x += ox;
238
245
  ln.bbox.y += oy;
@@ -268,7 +275,8 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
268
275
  }
269
276
  }
270
277
  };
271
- const layoutFloat = (resourceId, width, slice) => {
278
+ const rotationKey = (rotated) => rotated ? `:${rotated.direction}${rotated.length.toFixed(2)}` : '';
279
+ const layoutFloat = (resourceId, width, slice, rotated) => {
272
280
  const resource = resourceById.get(resourceId);
273
281
  if (!resource)
274
282
  return null;
@@ -282,8 +290,15 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
282
290
  resourceTypes,
283
291
  resources,
284
292
  ...(slice ? { slice } : {}),
293
+ ...(rotated ? { rotate: rotated.direction, rotatedLength: rotated.length } : {}),
285
294
  });
286
295
  };
296
+ /** The rotation of a pending float on a band whose columns keep `avail`
297
+ * px: the upright frame is as long as the grid multiple within that
298
+ * room, less the float gap, so the band it takes is `avail` at most. */
299
+ const rotationFor = (f, avail) => f.rotate
300
+ ? { direction: f.rotate, length: Math.max(1, Math.floor((avail + 0.01) / baselineGrid) * baselineGrid - floatGapPx) }
301
+ : undefined;
287
302
  /** Row count of a table resource (0 for anything else). */
288
303
  const tableRowCount = (resourceId) => resourceById.get(resourceId)?.table?.model.rows.length ?? 0;
289
304
  /** The slice a pending float stands for: the whole resource, or — for the
@@ -295,26 +310,31 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
295
310
  const sliceKey = (slice) => slice ? `:${slice.startRow}-${slice.endRow}${slice.continues ? '+' : ''}` : '';
296
311
  /** Row metrics of a table float laid out in full at a width, memoised. */
297
312
  const tableMetricsMemo = new Map();
298
- const tableMetrics = (resourceId, width) => {
299
- const key = `${resourceId}:${width.toFixed(2)}`;
313
+ const tableMetrics = (resourceId, width, rotated) => {
314
+ const key = `${resourceId}:${width.toFixed(2)}${rotationKey(rotated)}`;
300
315
  const memo = tableMetricsMemo.get(key);
301
316
  if (memo !== undefined)
302
317
  return memo;
303
- const m = layoutFloat(resourceId, width)?.tableRows ?? null;
318
+ const m = layoutFloat(resourceId, width, undefined, rotated)?.tableRows ?? null;
304
319
  tableMetricsMemo.set(key, m);
305
320
  return m;
306
321
  };
307
322
  /** Height (and caption baseline) of a float at a given width, memoised —
308
323
  * fit checks run for every pending float on every loop iteration. */
309
324
  const floatMeasureMemo = new Map();
310
- const measureFloat = (resourceId, width, slice) => {
311
- const key = `${resourceId}:${width.toFixed(2)}${sliceKey(slice)}`;
325
+ const measureFloat = (resourceId, width, slice, rotated) => {
326
+ const key = `${resourceId}:${width.toFixed(2)}${sliceKey(slice)}${rotationKey(rotated)}`;
312
327
  const memo = floatMeasureMemo.get(key);
313
328
  if (memo !== undefined)
314
329
  return memo;
315
- const laid = layoutFloat(resourceId, width, slice);
330
+ const laid = layoutFloat(resourceId, width, slice, rotated);
316
331
  let m = null;
317
- if (laid) {
332
+ if (laid && laid.block.rotation) {
333
+ // A rotated block takes its band whole: no caption baseline to align,
334
+ // and its upright height is what must fit the band's width.
335
+ m = { height: laid.totalHeight, rotatedWidth: laid.block.rotation.height };
336
+ }
337
+ else if (laid) {
318
338
  // A bottom band aligns the float's LAST text line to the grid: the
319
339
  // caption's (or the note's) last line when it sits under the body. A
320
340
  // caption set above the body (caption bars) leaves the body's bottom
@@ -338,8 +358,11 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
338
358
  };
339
359
  /** Measure + build a float block at horizontal offset `x` (y = 0), or null
340
360
  * when the resource id is unknown. Caller offsets it to its final `y`. */
341
- const buildFloatBlock = (resourceId, x, width, slice) => {
342
- const laid = layoutFloat(resourceId, width, slice);
361
+ const buildFloatBlock = (resourceId, x, width, slice, rotated,
362
+ /** A rotated block sits flush to the band's right edge (the spine of a
363
+ * verso page) instead of its left. */
364
+ flushEnd = false) => {
365
+ const laid = layoutFloat(resourceId, width, slice, rotated);
343
366
  if (!laid)
344
367
  return null;
345
368
  const { block: rb, totalHeight } = laid;
@@ -350,9 +373,23 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
350
373
  blk.snappedToGrid = false;
351
374
  blk.bbox = createBoundingBox(x, 0, width, totalHeight);
352
375
  blk.lines = [];
353
- offsetResourceBlockToAbsolute(rb, x, 0);
376
+ if (rb.rotation) {
377
+ // The upright frame's origin: for a counter-clockwise turn the frame's
378
+ // top-left lands at the bottom-left of the block, for a clockwise one
379
+ // at its top-right (see `resourceBlockToPage`).
380
+ const used = Math.min(rb.rotation.height, width);
381
+ const left = x + (flushEnd ? Math.max(0, width - used) : 0);
382
+ rb.rotation.originX = rb.rotation.direction === 'ccw' ? left : left + used;
383
+ rb.rotation.originY = rb.rotation.direction === 'ccw' ? totalHeight : 0;
384
+ }
385
+ else {
386
+ offsetResourceBlockToAbsolute(rb, x, 0);
387
+ }
354
388
  return { block: blk, height: totalHeight };
355
389
  };
390
+ /** Whether a rotated float on `page` sits flush to the band's right edge:
391
+ * with mirrored margins the spine of a verso (even-numbered) page. */
392
+ const rotatedFlushEnd = (page) => !!resolved.page.margins.mirror && (page.index + pageIndexOffset) % 2 === 1;
356
393
  /** Float bands reserved per column in this pass (the fresh-page flush
357
394
  * sends single-column floats to the least reserved column). */
358
395
  const floatReserved = new Map();
@@ -386,14 +423,14 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
386
423
  * (current-page) mode nothing is forced: `'none'` when not even the
387
424
  * smallest slice fits the slot.
388
425
  */
389
- const splitTableFloat = (f, width, position, targetCols, contentArea, avail, mode) => {
426
+ const splitTableFloat = (f, width, position, targetCols, contentArea, avail, mode, rotated) => {
390
427
  const rowCount = tableRowCount(f.resourceId);
391
428
  if (rowCount === 0)
392
429
  return null;
393
430
  const overflow = resolved.tableStyle.overflow;
394
431
  if (overflow === 'hide')
395
432
  return 'skip';
396
- const metrics = tableMetrics(f.resourceId, width);
433
+ const metrics = tableMetrics(f.resourceId, width, rotated);
397
434
  if (!metrics)
398
435
  return null;
399
436
  const startRow = f.startRow ?? 0;
@@ -402,14 +439,16 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
402
439
  return null;
403
440
  // Overhead of a continuing slice at this width — caption, gaps, marker —
404
441
  // from a one-row probe; the row heights come from the metrics.
405
- const probe = layoutFloat(f.resourceId, width, { startRow, endRow: firstBody + 1, continues: true });
442
+ const probe = layoutFloat(f.resourceId, width, { startRow, endRow: firstBody + 1, continues: true }, rotated);
406
443
  if (!probe)
407
444
  return null;
408
- const overhead = probe.totalHeight - probe.block.bodyRect.height;
445
+ // A rotated table's rows run across the page: the room for them is
446
+ // the band's width, less the upright overhead.
447
+ const overhead = (probe.block.rotation ? probe.block.rotation.height : probe.totalHeight) - probe.block.bodyRect.height;
409
448
  // A top band rounds up to the grid: the tallest float it holds within
410
449
  // `avail` is the grid multiple below it, less the gap.
411
450
  const hMax = Math.floor((avail + 0.01) / baselineGrid) * baselineGrid - floatGapPx;
412
- let end = planTableSlice(metrics, startRow, hMax - overhead);
451
+ let end = planTableSlice(metrics, startRow, (rotated ? width : hMax) - overhead);
413
452
  const floor = firstBody + 1;
414
453
  if (end < floor) {
415
454
  // Nothing fits. A fresh page carries the smallest slice anyway (it
@@ -432,9 +471,11 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
432
471
  end = e;
433
472
  }
434
473
  const fits = (slice) => {
435
- const measure = measureFloat(f.resourceId, width, slice);
474
+ const measure = measureFloat(f.resourceId, width, slice, rotated);
436
475
  if (!measure)
437
476
  return true;
477
+ if (rotated)
478
+ return (measure.rotatedWidth ?? 0) <= width + 0.01;
438
479
  const { need } = measureFloatBand(position, measure, targetCols, contentArea, baselineGrid, floatGapPx, (c) => trueBottom(c, uncappedBottoms));
439
480
  return need <= avail + 0.01;
440
481
  };
@@ -478,7 +519,8 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
478
519
  const width = pageSpan ? page.contentArea.width : first.bbox.width;
479
520
  const xLeft = pageSpan ? page.contentArea.x : first.bbox.x;
480
521
  const slice = sliceOf(f);
481
- const measure = measureFloat(f.resourceId, width, slice);
522
+ const rotated = rotationFor(f, Math.min(...targetCols.map((c) => c.availableHeight)));
523
+ const measure = measureFloat(f.resourceId, width, slice, rotated);
482
524
  if (!measure)
483
525
  return null;
484
526
  // A bottom band normally anchors to the column's true foot (under a
@@ -487,7 +529,7 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
487
529
  // and the box follows both.
488
530
  const bottomOf = (c) => anchorToCap ? c.bbox.y + c.bbox.height : trueBottom(c, uncappedBottoms);
489
531
  const { need, y } = measureFloatBand(position, measure, targetCols, page.contentArea, baselineGrid, floatGapPx, bottomOf);
490
- return { need, y, measure, slice, width, xLeft };
532
+ return { need, y, measure, slice, width, xLeft, rotated };
491
533
  };
492
534
  /** Free height `col` keeps for the flow once a float band `probe` is
493
535
  * reserved in it at `position` (mirrors the reservation arithmetic of
@@ -506,11 +548,13 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
506
548
  const probe = probeFloatBand(page, f, targetCols, position, pageSpan, anchorToCap);
507
549
  if (!probe)
508
550
  return 'skip';
509
- const { width, xLeft } = probe;
551
+ const { width, xLeft, rotated } = probe;
510
552
  let { slice, measure, need, y } = probe;
511
553
  let rest;
512
554
  /** The float was cut to this slot (a table slice). */
513
555
  let cut = false;
556
+ /** A rotated block wider than the band (its upright height). */
557
+ const tooWide = (m) => m.rotatedWidth !== undefined && m.rotatedWidth > width + 0.01;
514
558
  if (mode === 'fresh') {
515
559
  let minAvail = Infinity;
516
560
  let anyReserved = false;
@@ -522,16 +566,17 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
522
566
  }
523
567
  if (need > minAvail - minTextPx && anyReserved)
524
568
  return 'defer';
525
- if (need > minAvail + 0.01) {
526
- // Dominating the band: a table is cut to it.
527
- const split = splitTableFloat(f, width, position, targetCols, page.contentArea, minAvail, 'fresh');
569
+ if (need > minAvail + 0.01 || tooWide(measure)) {
570
+ // Dominating the band: a table is cut to it (a rotated table, to
571
+ // the band's width).
572
+ const split = splitTableFloat(f, width, position, targetCols, page.contentArea, minAvail, 'fresh', rotated);
528
573
  if (split === 'skip')
529
574
  return 'skip';
530
575
  if (split && split !== 'none') {
531
576
  slice = split.slice;
532
577
  rest = split.rest;
533
578
  cut = true;
534
- const m = measureFloat(f.resourceId, width, slice);
579
+ const m = measureFloat(f.resourceId, width, slice, rotated);
535
580
  if (!m)
536
581
  return 'skip';
537
582
  measure = m;
@@ -540,6 +585,11 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
540
585
  }
541
586
  }
542
587
  else {
588
+ // A rotated block takes a page of its own: it never shares the
589
+ // current page's foot, and waits for a fresh page to be cut to when
590
+ // too wide.
591
+ if (f.rotate || tooWide(measure))
592
+ return 'defer';
543
593
  for (const c of targetCols) {
544
594
  if (position === 'bottom' && uncappedBottoms.has(c) && !anchorToCap) {
545
595
  // Trailing cap: the band must lie entirely below the level cut.
@@ -585,7 +635,7 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
585
635
  if (rest) {
586
636
  rest = { ...rest, notBefore: { pageIndex: page.index, columnIndex: targetCols[targetCols.length - 1].index } };
587
637
  }
588
- const built = buildFloatBlock(f.resourceId, xLeft, width, slice);
638
+ const built = buildFloatBlock(f.resourceId, xLeft, width, slice, rotated, rotated ? rotatedFlushEnd(page) : false);
589
639
  if (!built)
590
640
  return 'skip';
591
641
  for (const col of targetCols) {
@@ -653,7 +703,8 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
653
703
  }
654
704
  return false;
655
705
  };
656
- const positionsFor = (f) => f.position === 'auto' ? ['top', 'bottom'] : [f.position];
706
+ /** A rotated float takes its page from the top. */
707
+ const positionsFor = (f) => f.rotate ? ['top'] : f.position === 'auto' ? ['top', 'bottom'] : [f.position];
657
708
  /** Reserve top/bottom bands on a freshly opened page and position as many
658
709
  * pending floats as fit, shrinking the affected columns so body text flows
659
710
  * around them. Full-width (page-span) floats reserve the outermost bands
@@ -2872,6 +2923,48 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
2872
2923
  * first, for the page labels it prints to settle. */
2873
2924
  const MAX_TOC_ROUNDS = 3;
2874
2925
  export function buildDocument(content, config, cache, options) {
2926
+ return drainPasses(buildDocumentGen(content, config, cache, options));
2927
+ }
2928
+ /** Let the event loop turn: `scheduler.yield()` where it exists, else a
2929
+ * message-channel hop (a `setTimeout(0)` is clamped to 4 ms once nested). */
2930
+ export function yieldToEventLoop() {
2931
+ const scheduler = globalThis.scheduler;
2932
+ if (scheduler?.yield)
2933
+ return scheduler.yield();
2934
+ if (typeof MessageChannel !== 'undefined') {
2935
+ return new Promise((resolve) => {
2936
+ const channel = new MessageChannel();
2937
+ channel.port1.onmessage = () => {
2938
+ channel.port1.close();
2939
+ resolve();
2940
+ };
2941
+ channel.port2.postMessage(null);
2942
+ });
2943
+ }
2944
+ return new Promise((resolve) => setTimeout(resolve, 0));
2945
+ }
2946
+ /**
2947
+ * {@link buildDocument}, yielding to the event loop between placement
2948
+ * passes. A build is several passes (band caps, column balancing, contents
2949
+ * rounds), each a synchronous re-placement of the document; in a worker
2950
+ * this lets a `cancel` posted mid-build be observed at the next pass
2951
+ * boundary — `shouldCancel` is polled there as well as inside a pass —
2952
+ * instead of after the whole build.
2953
+ */
2954
+ export async function buildDocumentAsync(content, config, cache, options) {
2955
+ const gen = buildDocumentGen(content, config, cache, options);
2956
+ const pause = options?.yieldBetweenPasses ?? yieldToEventLoop;
2957
+ for (;;) {
2958
+ const step = gen.next();
2959
+ if (step.done)
2960
+ return step.value;
2961
+ await pause();
2962
+ if (options?.shouldCancel?.())
2963
+ throw new BuildCancelledError();
2964
+ }
2965
+ }
2966
+ /** The build as a generator: one `yield` after every placement pass. */
2967
+ export function* buildDocumentGen(content, config, cache, options) {
2875
2968
  // A document printing its own table of contents (`:::toc` with no
2876
2969
  // host-supplied outline) is laid out with the page labels of the previous
2877
2970
  // build until they no longer change: the contents' own length moves what
@@ -2881,36 +2974,44 @@ export function buildDocument(content, config, cache, options) {
2881
2974
  const parsed = parseMarkdownMemo(extractFrontmatter(content.markdown).content);
2882
2975
  if (hasTocDirective(parsed)) {
2883
2976
  let outline = computeOutline(parsed, resolveAllConfig(config), content.continuation?.headings);
2884
- let doc = buildDocumentBalanced({ ...content, outline }, config, cache, options);
2977
+ let doc = yield* buildDocumentBalanced({ ...content, outline }, config, cache, options, 0);
2885
2978
  for (let round = 0; round < MAX_TOC_ROUNDS; round++) {
2886
2979
  const after = outlineFromDoc(doc, outline);
2887
2980
  if (sameOutline(after, outline))
2888
2981
  break;
2889
2982
  outline = after;
2890
- doc = buildDocumentBalanced({ ...content, outline }, config, cache, options);
2983
+ doc = yield* buildDocumentBalanced({ ...content, outline }, config, cache, options, round + 1);
2891
2984
  }
2892
2985
  return doc;
2893
2986
  }
2894
2987
  }
2895
- return buildDocumentBalanced(content, config, cache, options);
2988
+ return yield* buildDocumentBalanced(content, config, cache, options);
2896
2989
  }
2897
- function buildDocumentBalanced(content, config, cache, options) {
2990
+ const now = () => (typeof performance !== 'undefined' ? performance.now() : Date.now());
2991
+ function* buildDocumentBalanced(content, config, cache, options, tocRound = 0) {
2898
2992
  // Each pass reports its own progress, numbered in build order.
2899
2993
  let passIndex = 0;
2900
2994
  const onProgress = options?.onProgress;
2995
+ const onPass = options?.onPass;
2901
2996
  const passOptions = onProgress
2902
2997
  ? { ...options, onProgress: (p) => onProgress({ ...p, pass: passIndex }) }
2903
2998
  : options;
2904
2999
  const runPass = (hints) => {
2905
3000
  passIndex++;
2906
- return buildDocumentPass(content, config, cache, passOptions, hints);
3001
+ const started = onPass ? now() : 0;
3002
+ const result = buildDocumentPass(content, config, cache, passOptions, hints);
3003
+ onPass?.({ pass: passIndex, tocRound, ms: now() - started, pages: result.doc.pages.length });
3004
+ return result;
2907
3005
  };
3006
+ // The first pass is a pass too: let a cancel land before the caps run.
3007
+ const initial = runPass();
3008
+ yield;
2908
3009
  // --- Band caps (page-span blocks mid-page) -----------------------------
2909
3010
  // A span block that arrived in an uneven band proposes a cap; the driver
2910
3011
  // re-places the document with it (and grows / drops caps whose band
2911
3012
  // overflowed) before balancing runs. Documents without such blocks get
2912
3013
  // their first pass back untouched — no extra pass.
2913
- const bands = resolveBandCaps(runPass(), (bandCaps) => runPass({ bandCaps }));
3014
+ const bands = yield* resolveBandCapsGen(initial, (bandCaps) => runPass({ bandCaps }));
2914
3015
  let best = bands.result;
2915
3016
  const bandCaps = bands.bandCaps;
2916
3017
  let passCount = bands.passCount;
@@ -3103,7 +3204,7 @@ function buildDocumentBalanced(content, config, cache, options) {
3103
3204
  return blacklist(null);
3104
3205
  };
3105
3206
  let balancingPasses = 0;
3106
- const balance = () => {
3207
+ function* balance() {
3107
3208
  while (balancingPasses < MAX_BALANCING_PASSES_PER_DOCUMENT) {
3108
3209
  const active = segments.filter((s) => !s.done);
3109
3210
  if (active.length === 0)
@@ -3173,6 +3274,7 @@ function buildDocumentBalanced(content, config, cache, options) {
3173
3274
  const next = runPass(hintsFrom(proposal.lines, proposal.loose, proposal.looseBudget));
3174
3275
  passCount++;
3175
3276
  balancingPasses++;
3277
+ yield;
3176
3278
  const nextGaps = collectColumnGaps(next.doc, next.forcedBreakPages);
3177
3279
  const capPage = pageOfContent(best.doc);
3178
3280
  const accepted = [];
@@ -3236,9 +3338,9 @@ function buildDocumentBalanced(content, config, cache, options) {
3236
3338
  if (accepted.length > 0)
3237
3339
  best = spliceSegments(next, accepted);
3238
3340
  }
3239
- };
3341
+ }
3240
3342
  resetSegments();
3241
- balance();
3343
+ yield* balance();
3242
3344
  // --- Trailing bands (closing columns cut level) -------------------------
3243
3345
  // Once the balancing levers have settled the earlier pages, level the
3244
3346
  // closing band of every chapter / the document with a trailing cap. It is
@@ -3249,14 +3351,14 @@ function buildDocumentBalanced(content, config, cache, options) {
3249
3351
  // fill what the cut left short (a column ending a line under the cap).
3250
3352
  if (balancing.trailing) {
3251
3353
  const frozen = hintsFrom(applied.lines, applied.loose);
3252
- const trailing = resolveTrailingCaps(best, bandCaps, (caps) => runPass({ ...frozen, bandCaps: caps }));
3354
+ const trailing = yield* resolveTrailingCapsGen(best, bandCaps, (caps) => runPass({ ...frozen, bandCaps: caps }));
3253
3355
  passCount += trailing.passCount;
3254
3356
  if (trailing.result !== best) {
3255
3357
  best = trailing.result;
3256
3358
  for (const [i, cap] of trailing.caps)
3257
3359
  bandCaps.set(i, cap);
3258
3360
  resetSegments();
3259
- balance();
3361
+ yield* balance();
3260
3362
  }
3261
3363
  }
3262
3364
  best.doc.iterationCount = passCount;