@genome-spy/core 0.67.0 → 0.69.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.
Files changed (290) hide show
  1. package/dist/bundle/index.es.js +15884 -13130
  2. package/dist/bundle/index.js +130 -149
  3. package/dist/schema.json +6498 -6191
  4. package/dist/src/data/collector.d.ts +20 -0
  5. package/dist/src/data/collector.d.ts.map +1 -1
  6. package/dist/src/data/collector.js +148 -0
  7. package/dist/src/data/dataFlow.d.ts +6 -0
  8. package/dist/src/data/dataFlow.d.ts.map +1 -1
  9. package/dist/src/data/dataFlow.js +20 -0
  10. package/dist/src/data/flowInit.d.ts.map +1 -1
  11. package/dist/src/data/flowInit.js +2 -3
  12. package/dist/src/data/flowNode.d.ts +33 -10
  13. package/dist/src/data/flowNode.d.ts.map +1 -1
  14. package/dist/src/data/flowNode.js +84 -13
  15. package/dist/src/data/flowTestUtils.d.ts +2 -2
  16. package/dist/src/data/flowTestUtils.d.ts.map +1 -1
  17. package/dist/src/data/flowTestUtils.js +5 -4
  18. package/dist/src/data/keyIndex.d.ts +18 -0
  19. package/dist/src/data/keyIndex.d.ts.map +1 -0
  20. package/dist/src/data/keyIndex.js +241 -0
  21. package/dist/src/data/keyIndex.test.d.ts +2 -0
  22. package/dist/src/data/keyIndex.test.d.ts.map +1 -0
  23. package/dist/src/data/sources/dataSource.d.ts.map +1 -1
  24. package/dist/src/data/sources/dataSource.js +7 -3
  25. package/dist/src/data/sources/dataSourceFactory.d.ts +14 -12
  26. package/dist/src/data/sources/dataSourceFactory.d.ts.map +1 -1
  27. package/dist/src/data/sources/dataSourceFactory.js +52 -16
  28. package/dist/src/data/sources/lazy/bigBedSource.d.ts.map +1 -1
  29. package/dist/src/data/sources/lazy/bigBedSource.js +11 -10
  30. package/dist/src/data/sources/lazy/bigWigSource.d.ts.map +1 -1
  31. package/dist/src/data/sources/lazy/bigWigSource.js +11 -10
  32. package/dist/src/data/sources/lazy/mockLazySource.d.ts +29 -0
  33. package/dist/src/data/sources/lazy/mockLazySource.d.ts.map +1 -0
  34. package/dist/src/data/sources/lazy/mockLazySource.js +44 -0
  35. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts +22 -1
  36. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
  37. package/dist/src/data/sources/lazy/singleAxisLazySource.js +34 -2
  38. package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -1
  39. package/dist/src/data/sources/lazy/singleAxisWindowedSource.js +16 -1
  40. package/dist/src/data/sources/lazy/tabixSource.d.ts +0 -1
  41. package/dist/src/data/sources/lazy/tabixSource.d.ts.map +1 -1
  42. package/dist/src/data/sources/lazy/tabixSource.js +56 -16
  43. package/dist/src/data/sources/sequenceSource.d.ts.map +1 -1
  44. package/dist/src/data/sources/sequenceSource.js +5 -3
  45. package/dist/src/data/sources/urlSource.d.ts.map +1 -1
  46. package/dist/src/data/sources/urlSource.js +7 -3
  47. package/dist/src/data/transforms/filter.d.ts +4 -4
  48. package/dist/src/data/transforms/filter.d.ts.map +1 -1
  49. package/dist/src/data/transforms/filter.js +13 -7
  50. package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
  51. package/dist/src/data/transforms/filterScoredLabels.js +11 -6
  52. package/dist/src/data/transforms/filterScoredLabels.test.d.ts +2 -0
  53. package/dist/src/data/transforms/filterScoredLabels.test.d.ts.map +1 -0
  54. package/dist/src/data/transforms/formula.d.ts +4 -4
  55. package/dist/src/data/transforms/formula.d.ts.map +1 -1
  56. package/dist/src/data/transforms/formula.js +12 -6
  57. package/dist/src/data/transforms/measureText.d.ts +2 -2
  58. package/dist/src/data/transforms/measureText.d.ts.map +1 -1
  59. package/dist/src/data/transforms/measureText.js +16 -12
  60. package/dist/src/data/transforms/stack.d.ts.map +1 -1
  61. package/dist/src/data/transforms/stack.js +1 -0
  62. package/dist/src/data/transforms/transform.d.ts +2 -2
  63. package/dist/src/data/transforms/transform.d.ts.map +1 -1
  64. package/dist/src/data/transforms/transform.js +3 -3
  65. package/dist/src/encoder/accessor.d.ts +51 -4
  66. package/dist/src/encoder/accessor.d.ts.map +1 -1
  67. package/dist/src/encoder/accessor.js +174 -10
  68. package/dist/src/encoder/encoder.d.ts +11 -2
  69. package/dist/src/encoder/encoder.d.ts.map +1 -1
  70. package/dist/src/encoder/encoder.js +29 -9
  71. package/dist/src/encoder/metadataChannels.d.ts +15 -0
  72. package/dist/src/encoder/metadataChannels.d.ts.map +1 -0
  73. package/dist/src/encoder/metadataChannels.js +65 -0
  74. package/dist/src/encoder/metadataChannels.test.d.ts +2 -0
  75. package/dist/src/encoder/metadataChannels.test.d.ts.map +1 -0
  76. package/dist/src/genome/genome.d.ts +8 -0
  77. package/dist/src/genome/genome.d.ts.map +1 -1
  78. package/dist/src/genome/genome.js +16 -1
  79. package/dist/src/genome/scaleLocus.d.ts.map +1 -1
  80. package/dist/src/genome/scaleLocus.js +14 -1
  81. package/dist/src/genomeSpy/containerUi.d.ts +0 -1
  82. package/dist/src/genomeSpy/containerUi.d.ts.map +1 -1
  83. package/dist/src/genomeSpy/containerUi.js +0 -14
  84. package/dist/src/genomeSpy/inputBindingManager.js +1 -1
  85. package/dist/src/genomeSpy/interactionController.d.ts.map +1 -1
  86. package/dist/src/genomeSpy/interactionController.js +7 -1
  87. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts +3 -7
  88. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts.map +1 -1
  89. package/dist/src/genomeSpy/loadingIndicatorManager.js +68 -20
  90. package/dist/src/genomeSpy/loadingStatusRegistry.d.ts +52 -0
  91. package/dist/src/genomeSpy/loadingStatusRegistry.d.ts.map +1 -0
  92. package/dist/src/genomeSpy/loadingStatusRegistry.js +86 -0
  93. package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -1
  94. package/dist/src/genomeSpy/viewContextFactory.js +0 -1
  95. package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -1
  96. package/dist/src/genomeSpy/viewDataInit.js +56 -11
  97. package/dist/src/genomeSpy.d.ts +0 -2
  98. package/dist/src/genomeSpy.d.ts.map +1 -1
  99. package/dist/src/genomeSpy.js +47 -27
  100. package/dist/src/gl/glslScaleGenerator.js +1 -1
  101. package/dist/src/marks/mark.d.ts.map +1 -1
  102. package/dist/src/marks/mark.js +40 -41
  103. package/dist/src/marks/markUtils.js +1 -1
  104. package/dist/src/marks/point.d.ts.map +1 -1
  105. package/dist/src/marks/point.js +4 -6
  106. package/dist/src/paramRuntime/expressionCompiler.d.ts +7 -0
  107. package/dist/src/paramRuntime/expressionCompiler.d.ts.map +1 -0
  108. package/dist/src/paramRuntime/expressionCompiler.js +10 -0
  109. package/dist/src/paramRuntime/expressionRef.d.ts +20 -0
  110. package/dist/src/paramRuntime/expressionRef.d.ts.map +1 -0
  111. package/dist/src/paramRuntime/expressionRef.js +95 -0
  112. package/dist/src/paramRuntime/expressionRef.test.d.ts +2 -0
  113. package/dist/src/paramRuntime/expressionRef.test.d.ts.map +1 -0
  114. package/dist/src/paramRuntime/graphRuntime.d.ts +176 -0
  115. package/dist/src/paramRuntime/graphRuntime.d.ts.map +1 -0
  116. package/dist/src/paramRuntime/graphRuntime.js +628 -0
  117. package/dist/src/paramRuntime/graphRuntime.test.d.ts +2 -0
  118. package/dist/src/paramRuntime/graphRuntime.test.d.ts.map +1 -0
  119. package/dist/src/paramRuntime/index.d.ts +9 -0
  120. package/dist/src/paramRuntime/index.d.ts.map +1 -0
  121. package/dist/src/paramRuntime/index.js +8 -0
  122. package/dist/src/paramRuntime/lifecycleRegistry.d.ts +27 -0
  123. package/dist/src/paramRuntime/lifecycleRegistry.d.ts.map +1 -0
  124. package/dist/src/paramRuntime/lifecycleRegistry.js +54 -0
  125. package/dist/src/paramRuntime/paramRuntime.d.ts +165 -0
  126. package/dist/src/paramRuntime/paramRuntime.d.ts.map +1 -0
  127. package/dist/src/paramRuntime/paramRuntime.js +222 -0
  128. package/dist/src/paramRuntime/paramRuntime.test.d.ts +2 -0
  129. package/dist/src/paramRuntime/paramRuntime.test.d.ts.map +1 -0
  130. package/dist/src/paramRuntime/paramStore.d.ts +68 -0
  131. package/dist/src/paramRuntime/paramStore.d.ts.map +1 -0
  132. package/dist/src/paramRuntime/paramStore.js +148 -0
  133. package/dist/src/paramRuntime/paramStore.test.d.ts +2 -0
  134. package/dist/src/paramRuntime/paramStore.test.d.ts.map +1 -0
  135. package/dist/src/paramRuntime/paramUtils.d.ts +86 -0
  136. package/dist/src/paramRuntime/paramUtils.d.ts.map +1 -0
  137. package/dist/src/paramRuntime/paramUtils.js +272 -0
  138. package/dist/src/paramRuntime/selectionStore.d.ts +6 -0
  139. package/dist/src/paramRuntime/selectionStore.d.ts.map +1 -0
  140. package/dist/src/paramRuntime/selectionStore.js +13 -0
  141. package/dist/src/paramRuntime/types.d.ts +16 -0
  142. package/dist/src/paramRuntime/types.d.ts.map +1 -0
  143. package/dist/src/paramRuntime/types.js +25 -0
  144. package/dist/src/paramRuntime/viewParamRuntime.d.ts +164 -0
  145. package/dist/src/paramRuntime/viewParamRuntime.d.ts.map +1 -0
  146. package/dist/src/paramRuntime/viewParamRuntime.js +443 -0
  147. package/dist/src/scale/scale.d.ts +6 -1
  148. package/dist/src/scale/scale.d.ts.map +1 -1
  149. package/dist/src/scale/scale.js +83 -23
  150. package/dist/src/scales/axisResolution.d.ts.map +1 -1
  151. package/dist/src/scales/axisResolution.js +10 -0
  152. package/dist/src/scales/{scaleDomainAggregator.d.ts → domainPlanner.d.ts} +6 -3
  153. package/dist/src/scales/domainPlanner.d.ts.map +1 -0
  154. package/dist/src/scales/{scaleDomainAggregator.js → domainPlanner.js} +128 -10
  155. package/dist/src/scales/domainPlanner.test.d.ts +2 -0
  156. package/dist/src/scales/domainPlanner.test.d.ts.map +1 -0
  157. package/dist/src/scales/scaleInstanceManager.d.ts +6 -3
  158. package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -1
  159. package/dist/src/scales/scaleInstanceManager.js +17 -11
  160. package/dist/src/scales/scaleInteractionController.d.ts +6 -0
  161. package/dist/src/scales/scaleInteractionController.d.ts.map +1 -1
  162. package/dist/src/scales/scaleInteractionController.js +41 -3
  163. package/dist/src/scales/scaleResolution.d.ts +20 -17
  164. package/dist/src/scales/scaleResolution.d.ts.map +1 -1
  165. package/dist/src/scales/scaleResolution.js +188 -71
  166. package/dist/src/scales/scaleResolution.test.d.ts.map +1 -1
  167. package/dist/src/selection/selection.d.ts +21 -0
  168. package/dist/src/selection/selection.d.ts.map +1 -1
  169. package/dist/src/selection/selection.js +83 -1
  170. package/dist/src/spec/channel.d.ts +52 -15
  171. package/dist/src/spec/coreSchemaRoot.d.ts +53 -0
  172. package/dist/src/spec/data.d.ts +4 -0
  173. package/dist/src/spec/parameter.d.ts +16 -11
  174. package/dist/src/spec/root.d.ts +1 -1
  175. package/dist/src/spec/testing.d.ts +12 -0
  176. package/dist/src/spec/testing.d.ts.map +1 -0
  177. package/dist/src/spec/testing.js +20 -0
  178. package/dist/src/spec/view.d.ts +157 -41
  179. package/dist/src/styles/genome-spy.css +3 -31
  180. package/dist/src/styles/genome-spy.css.d.ts +1 -1
  181. package/dist/src/styles/genome-spy.css.d.ts.map +1 -1
  182. package/dist/src/styles/genome-spy.css.js +0 -29
  183. package/dist/src/tooltip/dataTooltipHandler.d.ts +1 -1
  184. package/dist/src/tooltip/dataTooltipHandler.js +23 -32
  185. package/dist/src/tooltip/dataTooltipHandler.test.d.ts +2 -0
  186. package/dist/src/tooltip/dataTooltipHandler.test.d.ts.map +1 -0
  187. package/dist/src/tooltip/flattenDatumRows.d.ts +13 -0
  188. package/dist/src/tooltip/flattenDatumRows.d.ts.map +1 -0
  189. package/dist/src/tooltip/flattenDatumRows.js +47 -0
  190. package/dist/src/tooltip/flattenDatumRows.test.d.ts +2 -0
  191. package/dist/src/tooltip/flattenDatumRows.test.d.ts.map +1 -0
  192. package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts +1 -1
  193. package/dist/src/tooltip/refseqGeneTooltipHandler.js +7 -1
  194. package/dist/src/tooltip/tooltipContext.d.ts +13 -0
  195. package/dist/src/tooltip/tooltipContext.d.ts.map +1 -0
  196. package/dist/src/tooltip/tooltipContext.js +543 -0
  197. package/dist/src/tooltip/tooltipContext.test.d.ts +2 -0
  198. package/dist/src/tooltip/tooltipContext.test.d.ts.map +1 -0
  199. package/dist/src/tooltip/tooltipHandler.d.ts +40 -1
  200. package/dist/src/tooltip/tooltipHandler.d.ts.map +1 -1
  201. package/dist/src/tooltip/tooltipHandler.ts +62 -1
  202. package/dist/src/types/encoder.d.ts +38 -3
  203. package/dist/src/types/rendering.d.ts +4 -3
  204. package/dist/src/types/viewContext.d.ts +0 -14
  205. package/dist/src/utils/inputBinding.d.ts +10 -2
  206. package/dist/src/utils/inputBinding.d.ts.map +1 -1
  207. package/dist/src/utils/inputBinding.js +12 -3
  208. package/dist/src/utils/throttle.d.ts +4 -1
  209. package/dist/src/utils/throttle.d.ts.map +1 -1
  210. package/dist/src/utils/throttle.js +54 -23
  211. package/dist/src/utils/throttle.test.d.ts +2 -0
  212. package/dist/src/utils/throttle.test.d.ts.map +1 -0
  213. package/dist/src/utils/transition.d.ts +21 -0
  214. package/dist/src/utils/transition.d.ts.map +1 -1
  215. package/dist/src/utils/transition.js +28 -0
  216. package/dist/src/utils/ui/tooltip.d.ts.map +1 -1
  217. package/dist/src/utils/ui/tooltip.js +7 -1
  218. package/dist/src/utils/ui/tooltip.test.d.ts +2 -0
  219. package/dist/src/utils/ui/tooltip.test.d.ts.map +1 -0
  220. package/dist/src/view/axisGridView.d.ts.map +1 -1
  221. package/dist/src/view/axisGridView.js +22 -5
  222. package/dist/src/view/axisView.d.ts.map +1 -1
  223. package/dist/src/view/axisView.js +20 -5
  224. package/dist/src/view/concatView.js +3 -3
  225. package/dist/src/view/containerMutationHelper.js +1 -1
  226. package/dist/src/view/containerView.d.ts +9 -5
  227. package/dist/src/view/containerView.d.ts.map +1 -1
  228. package/dist/src/view/containerView.js +34 -9
  229. package/dist/src/view/dataReadiness.d.ts +46 -0
  230. package/dist/src/view/dataReadiness.d.ts.map +1 -0
  231. package/dist/src/view/dataReadiness.js +267 -0
  232. package/dist/src/view/dataReadiness.test.d.ts +2 -0
  233. package/dist/src/view/dataReadiness.test.d.ts.map +1 -0
  234. package/dist/src/view/facetView.d.ts.map +1 -1
  235. package/dist/src/view/facetView.js +7 -5
  236. package/dist/src/view/flowBuilder.d.ts.map +1 -1
  237. package/dist/src/view/flowBuilder.js +17 -4
  238. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  239. package/dist/src/view/gridView/gridChild.js +16 -3
  240. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  241. package/dist/src/view/gridView/gridView.js +119 -2
  242. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  243. package/dist/src/view/gridView/scrollbar.js +3 -0
  244. package/dist/src/view/gridView/selectionRect.d.ts +6 -10
  245. package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
  246. package/dist/src/view/gridView/selectionRect.js +22 -24
  247. package/dist/src/view/gridView/separatorView.d.ts +51 -0
  248. package/dist/src/view/gridView/separatorView.d.ts.map +1 -0
  249. package/dist/src/view/gridView/separatorView.js +275 -0
  250. package/dist/src/view/layerView.d.ts.map +1 -1
  251. package/dist/src/view/layerView.js +7 -5
  252. package/dist/src/view/layout/flexLayout.d.ts +0 -30
  253. package/dist/src/view/layout/flexLayout.d.ts.map +1 -1
  254. package/dist/src/view/layout/flexLayout.js +0 -86
  255. package/dist/src/view/multiscale.d.ts +35 -0
  256. package/dist/src/view/multiscale.d.ts.map +1 -0
  257. package/dist/src/view/multiscale.js +233 -0
  258. package/dist/src/view/multiscale.test.d.ts +2 -0
  259. package/dist/src/view/multiscale.test.d.ts.map +1 -0
  260. package/dist/src/view/testUtils.d.ts.map +1 -1
  261. package/dist/src/view/testUtils.js +6 -1
  262. package/dist/src/view/unitView.d.ts +8 -13
  263. package/dist/src/view/unitView.d.ts.map +1 -1
  264. package/dist/src/view/unitView.js +120 -45
  265. package/dist/src/view/view.d.ts +27 -18
  266. package/dist/src/view/view.d.ts.map +1 -1
  267. package/dist/src/view/view.js +298 -37
  268. package/dist/src/view/viewFactory.d.ts +0 -12
  269. package/dist/src/view/viewFactory.d.ts.map +1 -1
  270. package/dist/src/view/viewFactory.js +55 -25
  271. package/dist/src/view/viewParamRuntime.test.d.ts +2 -0
  272. package/dist/src/view/viewParamRuntime.test.d.ts.map +1 -0
  273. package/dist/src/view/viewSelectors.d.ts +148 -0
  274. package/dist/src/view/viewSelectors.d.ts.map +1 -0
  275. package/dist/src/view/viewSelectors.js +776 -0
  276. package/dist/src/view/viewSelectors.test.d.ts +2 -0
  277. package/dist/src/view/viewSelectors.test.d.ts.map +1 -0
  278. package/dist/src/view/viewUtils.d.ts +0 -8
  279. package/dist/src/view/viewUtils.d.ts.map +1 -1
  280. package/dist/src/view/viewUtils.js +1 -21
  281. package/package.json +4 -4
  282. package/dist/src/scales/scaleDomainAggregator.d.ts.map +0 -1
  283. package/dist/src/scales/scaleDomainAggregator.test.d.ts +0 -2
  284. package/dist/src/scales/scaleDomainAggregator.test.d.ts.map +0 -1
  285. package/dist/src/spec/sampleView.d.ts +0 -197
  286. package/dist/src/view/paramMediator.d.ts +0 -149
  287. package/dist/src/view/paramMediator.d.ts.map +0 -1
  288. package/dist/src/view/paramMediator.js +0 -478
  289. package/dist/src/view/paramMediator.test.d.ts +0 -2
  290. package/dist/src/view/paramMediator.test.d.ts.map +0 -1
@@ -19,6 +19,19 @@ export default class Collector extends FlowNode {
19
19
  * @returns {() => void}
20
20
  */
21
21
  observe(listener: (arg0: Collector) => void): () => void;
22
+ /**
23
+ * @param {string} domainKey
24
+ * @param {import("../spec/channel.js").Type} type
25
+ * @param {import("../types/encoder.js").Accessor} accessor
26
+ * @returns {import("../utils/domainArray.js").DomainArray}
27
+ */
28
+ getDomain(domainKey: string, type: import("../spec/channel.js").Type, accessor: import("../types/encoder.js").Accessor): import("../utils/domainArray.js").DomainArray;
29
+ /**
30
+ * @param {string} domainKey
31
+ * @param {() => void} listener
32
+ * @returns {() => void}
33
+ */
34
+ subscribeDomainChanges(domainKey: string, listener: () => void): () => void;
22
35
  /**
23
36
  * @returns {Iterable<Datum>}
24
37
  */
@@ -38,6 +51,13 @@ export default class Collector extends FlowNode {
38
51
  * @param {number} uniqueId
39
52
  */
40
53
  findDatumByUniqueId(uniqueId: number): import("./flowNode.js").Datum;
54
+ /**
55
+ * Uses a lazy index to find a datum by its key fields.
56
+ *
57
+ * @param {string[]} keyFields
58
+ * @param {import("../spec/channel.js").Scalar[]} keyTuple
59
+ */
60
+ findDatumByKey(keyFields: string[], keyTuple: import("../spec/channel.js").Scalar[]): import("./flowNode.js").Datum;
41
61
  #private;
42
62
  }
43
63
  import FlowNode from "./flowNode.js";
@@ -1 +1 @@
1
- {"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../../src/data/collector.js"],"names":[],"mappings":"AAUA;;;;;GAKG;AACH;IAuCI;;OAEG;IACH,qBAFW,OAAO,sBAAsB,EAAE,aAAa,EAiBtD;IAZG,qDAA2C;IAE3C,4CAA4C;IAC5C,WADW,GAAG,CAAC,CAAS,IAAS,EAAT,SAAS,KAAE,IAAI,CAAC,CACd;IAG1B,yFAAyF;IACzF,cADW,GAAG,CAAC,OAAO,oBAAoB,EAAE,MAAM,EAAE,+BAAO,CACN;IAmFzD;;;OAGG;IACH,kBAHW,CAAS,IAAS,EAAT,SAAS,KAAE,IAAI,GACtB,MAAM,IAAI,CAOtB;IA+BD;;OAEG;IACH,WAFa,QAAQ,+BAAO,CAqB3B;IAED;;;OAGG;IACH,mBAFW,CAAC,KAAK,+BAAO,KAAK,IAAI,QAUhC;IAED;;OAEG;IACH,uBAMC;IA8CD;;;;OAIG;IACH,8BAFW,MAAM,iCA4BhB;;CACJ;qBAxTyD,eAAe"}
1
+ {"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../../src/data/collector.js"],"names":[],"mappings":"AAYA;;;;;GAKG;AACH;IA6CI;;OAEG;IACH,qBAFW,OAAO,sBAAsB,EAAE,aAAa,EAiBtD;IAZG,qDAA2C;IAE3C,4CAA4C;IAC5C,WADW,GAAG,CAAC,CAAS,IAAS,EAAT,SAAS,KAAE,IAAI,CAAC,CACd;IAG1B,yFAAyF;IACzF,cADW,GAAG,CAAC,OAAO,oBAAoB,EAAE,MAAM,EAAE,+BAAO,CACN;IAwFzD;;;OAGG;IACH,kBAHW,CAAS,IAAS,EAAT,SAAS,KAAE,IAAI,GACtB,MAAM,IAAI,CAOtB;IAiCD;;;;;OAKG;IACH,qBALW,MAAM,QACN,OAAO,oBAAoB,EAAE,IAAI,YACjC,OAAO,qBAAqB,EAAE,QAAQ,GACpC,OAAO,yBAAyB,EAAE,WAAW,CAkBzD;IAED;;;;OAIG;IACH,kCAJW,MAAM,YACN,MAAM,IAAI,GACR,MAAM,IAAI,CAItB;IAED;;OAEG;IACH,WAFa,QAAQ,+BAAO,CAqB3B;IAED;;;OAGG;IACH,mBAFW,CAAC,KAAK,+BAAO,KAAK,IAAI,QAUhC;IAED;;OAEG;IACH,uBAMC;IAqDD;;;;OAIG;IACH,8BAFW,MAAM,iCA4BhB;IAED;;;;;OAKG;IACH,0BAHW,MAAM,EAAE,YACR,OAAO,oBAAoB,EAAE,MAAM,EAAE,iCAS/C;;CACJ;qBA9XyD,eAAe"}
@@ -7,6 +7,8 @@ import { field } from "../utils/field.js";
7
7
  import { asArray } from "../utils/arrayUtils.js";
8
8
  import { radixSortIntoLookupArray } from "../utils/radixSort.js";
9
9
  import { UNIQUE_ID_KEY } from "./transforms/identifier.js";
10
+ import createDomain from "../utils/domainArray.js";
11
+ import KeyIndex from "./keyIndex.js";
10
12
 
11
13
  /**
12
14
  * Collects (materializes) the data that flows through this node.
@@ -33,6 +35,9 @@ export default class Collector extends FlowNode {
33
35
  */
34
36
  #uniqueIdIndex = [];
35
37
 
38
+ /** @type {KeyIndex} */
39
+ #keyIndex = new KeyIndex();
40
+
36
41
  /**
37
42
  * Start and end indices of all facets if they are concatenated into a single array.
38
43
  * Used together with the uniqueIdIndex for looking up data items by their unique id.
@@ -45,6 +50,9 @@ export default class Collector extends FlowNode {
45
50
  */
46
51
  #comparator;
47
52
 
53
+ /** @type {DomainCache} */
54
+ #domainCache = new DomainCache();
55
+
48
56
  get behavior() {
49
57
  return BEHAVIOR_COLLECTS;
50
58
  }
@@ -76,6 +84,7 @@ export default class Collector extends FlowNode {
76
84
  #init() {
77
85
  this.#buffer = [];
78
86
  this.#uniqueIdIndex = [];
87
+ this.#keyIndex.invalidate();
79
88
 
80
89
  this.facetBatches.clear();
81
90
  this.facetBatches.set(undefined, this.#buffer);
@@ -97,6 +106,8 @@ export default class Collector extends FlowNode {
97
106
  * @param {import("../types/flowBatch.js").FlowBatch} flowBatch
98
107
  */
99
108
  beginBatch(flowBatch) {
109
+ this.#keyIndex.invalidate();
110
+
100
111
  if (isFacetBatch(flowBatch)) {
101
112
  this.#buffer = [];
102
113
  this.facetBatches.set(asArray(flowBatch.facetId), this.#buffer);
@@ -144,6 +155,8 @@ export default class Collector extends FlowNode {
144
155
 
145
156
  super.complete();
146
157
 
158
+ this.#invalidateDomains();
159
+
147
160
  for (const observer of this.observers) {
148
161
  observer(this);
149
162
  }
@@ -187,6 +200,41 @@ export default class Collector extends FlowNode {
187
200
  for (const child of this.children) {
188
201
  child.complete();
189
202
  }
203
+
204
+ this.#invalidateDomains();
205
+ }
206
+
207
+ /**
208
+ * @param {string} domainKey
209
+ * @param {import("../spec/channel.js").Type} type
210
+ * @param {import("../types/encoder.js").Accessor} accessor
211
+ * @returns {import("../utils/domainArray.js").DomainArray}
212
+ */
213
+ getDomain(domainKey, type, accessor) {
214
+ return this.#domainCache.getDomain(domainKey, () => {
215
+ const domain = createDomain(type);
216
+
217
+ if (accessor.constant) {
218
+ domain.extend(accessor({}));
219
+ } else if (this.completed) {
220
+ for (const data of this.facetBatches.values()) {
221
+ for (let i = 0, n = data.length; i < n; i++) {
222
+ domain.extend(accessor(data[i]));
223
+ }
224
+ }
225
+ }
226
+
227
+ return domain;
228
+ });
229
+ }
230
+
231
+ /**
232
+ * @param {string} domainKey
233
+ * @param {() => void} listener
234
+ * @returns {() => void}
235
+ */
236
+ subscribeDomainChanges(domainKey, listener) {
237
+ return this.#domainCache.subscribe(domainKey, listener);
190
238
  }
191
239
 
192
240
  /**
@@ -246,6 +294,13 @@ export default class Collector extends FlowNode {
246
294
  }
247
295
  }
248
296
 
297
+ #invalidateDomains() {
298
+ if (this.#domainCache.hasCachedDomains()) {
299
+ this.#domainCache.clear();
300
+ }
301
+ this.#domainCache.notify();
302
+ }
303
+
249
304
  /**
250
305
  * Builds an index for looking up data items by their unique id.
251
306
  * Using a sorted index and binary search for O(log n) complexity.
@@ -314,6 +369,99 @@ export default class Collector extends FlowNode {
314
369
  }
315
370
  }
316
371
  }
372
+
373
+ /**
374
+ * Uses a lazy index to find a datum by its key fields.
375
+ *
376
+ * @param {string[]} keyFields
377
+ * @param {import("../spec/channel.js").Scalar[]} keyTuple
378
+ */
379
+ findDatumByKey(keyFields, keyTuple) {
380
+ this.#checkStatus();
381
+ return this.#keyIndex.findDatum(
382
+ keyFields,
383
+ keyTuple,
384
+ this.facetBatches.values()
385
+ );
386
+ }
387
+ }
388
+
389
+ /**
390
+ * Manages cached domains and subscriptions for invalidation.
391
+ */
392
+ class DomainCache {
393
+ /** @type {Map<string, import("../utils/domainArray.js").DomainArray>} */
394
+ #cache = new Map();
395
+
396
+ /** @type {Map<string, Set<() => void>>} */
397
+ #observers = new Map();
398
+
399
+ hasCachedDomains() {
400
+ return this.#cache.size > 0;
401
+ }
402
+
403
+ clear() {
404
+ this.#cache.clear();
405
+ }
406
+
407
+ /**
408
+ * @param {string} domainKey
409
+ * @param {() => import("../utils/domainArray.js").DomainArray} build
410
+ * @returns {import("../utils/domainArray.js").DomainArray}
411
+ */
412
+ getDomain(domainKey, build) {
413
+ const cached = this.#cache.get(domainKey);
414
+ if (cached) {
415
+ return cached;
416
+ } else {
417
+ const domain = build();
418
+ this.#cache.set(domainKey, domain);
419
+ return domain;
420
+ }
421
+ }
422
+
423
+ /**
424
+ * @param {string} domainKey
425
+ * @param {() => void} listener
426
+ * @returns {() => void}
427
+ */
428
+ subscribe(domainKey, listener) {
429
+ let listeners = this.#observers.get(domainKey);
430
+ if (!listeners) {
431
+ listeners = new Set();
432
+ this.#observers.set(domainKey, listeners);
433
+ }
434
+ listeners.add(listener);
435
+
436
+ return () => {
437
+ const entry = this.#observers.get(domainKey);
438
+ if (!entry) {
439
+ return;
440
+ }
441
+ entry.delete(listener);
442
+ if (entry.size === 0) {
443
+ this.#observers.delete(domainKey);
444
+ }
445
+ };
446
+ }
447
+
448
+ notify() {
449
+ if (this.#observers.size === 0) {
450
+ return;
451
+ }
452
+
453
+ /** @type {Set<() => void>} */
454
+ const listeners = new Set();
455
+ for (const observers of this.#observers.values()) {
456
+ for (const observer of observers) {
457
+ listeners.add(observer);
458
+ }
459
+ }
460
+
461
+ for (const listener of listeners) {
462
+ listener();
463
+ }
464
+ }
317
465
  }
318
466
 
319
467
  /**
@@ -2,6 +2,12 @@
2
2
  * DataFlow holds data sources and collectors for optimization and initialization.
3
3
  */
4
4
  export default class DataFlow {
5
+ /**
6
+ * Registry for per-view loading status. The host may replace this.
7
+ *
8
+ * @type {import("../genomeSpy/loadingStatusRegistry.js").default}
9
+ */
10
+ loadingStatusRegistry: import("../genomeSpy/loadingStatusRegistry.js").default;
5
11
  get dataSources(): DataSource[];
6
12
  get collectors(): import("./collector.js").default[];
7
13
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"dataFlow.d.ts","sourceRoot":"","sources":["../../../src/data/dataFlow.js"],"names":[],"mappings":"AAGA;;GAEG;AACH;IAeI,gCAEC;IAED,qDAEC;IAED;;OAEG;IACH,gCAFW,QAAQ,CAAC,OAAO,yBAAyB,EAAE,OAAO,CAAC,QAI7D;IAED;;OAEG;IACH,0BAFW,OAAO,yBAAyB,EAAE,OAAO,QAInD;IAED;;OAEG;IACH,6BAFW,OAAO,yBAAyB,EAAE,OAAO,QAInD;IAED;;OAEG;IACH,wBAFW,OAAO,gBAAgB,EAAE,OAAO,QAI1C;IAED;;OAEG;IACH,2BAFW,OAAO,gBAAgB,EAAE,OAAO,QAK1C;IAED;;;;OAIG;IACH,gCAFW,OAAO,gBAAgB,EAAE,OAAO,QAiB1C;IAED;;OAEG;IACH,0BAFW,MAAM;;MA2BhB;;CAGJ;uBAtHsB,yBAAyB;wBACxB,0BAA0B"}
1
+ {"version":3,"file":"dataFlow.d.ts","sourceRoot":"","sources":["../../../src/data/dataFlow.js"],"names":[],"mappings":"AAIA;;GAEG;AACH;IAOI;;;;OAIG;IACH,uBAFU,OAAO,uCAAuC,EAAE,OAAO,CAE3C;IAYtB,gCAEC;IAED,qDAEC;IAED;;OAEG;IACH,gCAFW,QAAQ,CAAC,OAAO,yBAAyB,EAAE,OAAO,CAAC,QAI7D;IAED;;OAEG;IACH,0BAFW,OAAO,yBAAyB,EAAE,OAAO,QAInD;IAED;;OAEG;IACH,6BAFW,OAAO,yBAAyB,EAAE,OAAO,QAKnD;IAED;;OAEG;IACH,wBAFW,OAAO,gBAAgB,EAAE,OAAO,QAI1C;IAED;;OAEG;IACH,2BAFW,OAAO,gBAAgB,EAAE,OAAO,QAS1C;IAED;;;;OAIG;IACH,gCAFW,OAAO,gBAAgB,EAAE,OAAO,QAsB1C;IAED;;OAEG;IACH,0BAFW,MAAM;;MA2BhB;;CAGJ;uBAzIsB,yBAAyB;wBACxB,0BAA0B"}
@@ -1,3 +1,4 @@
1
+ import LoadingStatusRegistry from "../genomeSpy/loadingStatusRegistry.js";
1
2
  import DataSource from "./sources/dataSource.js";
2
3
  import NamedSource from "./sources/namedSource.js";
3
4
 
@@ -11,12 +12,21 @@ export default class DataFlow {
11
12
  /** @type {Set<import("./collector.js").default>} */
12
13
  #collectors;
13
14
 
15
+ /**
16
+ * Registry for per-view loading status. The host may replace this.
17
+ *
18
+ * @type {import("../genomeSpy/loadingStatusRegistry.js").default}
19
+ */
20
+ loadingStatusRegistry;
21
+
14
22
  constructor() {
15
23
  /** @type {Set<import("./sources/dataSource.js").default>} */
16
24
  this.#dataSources = new Set();
17
25
 
18
26
  /** @type {Set<import("./collector.js").default>} */
19
27
  this.#collectors = new Set();
28
+
29
+ this.loadingStatusRegistry = new LoadingStatusRegistry();
20
30
  }
21
31
 
22
32
  get dataSources() {
@@ -45,6 +55,7 @@ export default class DataFlow {
45
55
  * @param {import("./sources/dataSource.js").default} dataSource
46
56
  */
47
57
  removeDataSource(dataSource) {
58
+ dataSource.disposeSubtree();
48
59
  this.#dataSources.delete(dataSource);
49
60
  }
50
61
 
@@ -59,6 +70,10 @@ export default class DataFlow {
59
70
  * @param {import("./collector.js").default} collector
60
71
  */
61
72
  removeCollector(collector) {
73
+ if (collector.parent) {
74
+ collector.parent.removeChild(collector);
75
+ }
76
+ collector.disposeSubtree();
62
77
  collector.observers.clear();
63
78
  this.#collectors.delete(collector);
64
79
  }
@@ -74,13 +89,18 @@ export default class DataFlow {
74
89
  parent.removeChild(collector);
75
90
  }
76
91
 
92
+ collector.disposeSubtree();
93
+
77
94
  while (parent && parent.children.length === 0) {
78
95
  const current = parent;
79
96
  parent = current.parent;
80
97
  if (parent) {
81
98
  parent.removeChild(current);
99
+ current.dispose();
82
100
  } else if (current instanceof DataSource) {
83
101
  this.removeDataSource(current);
102
+ } else {
103
+ current.dispose();
84
104
  }
85
105
  }
86
106
  }
@@ -1 +1 @@
1
- {"version":3,"file":"flowInit.d.ts","sourceRoot":"","sources":["../../../src/data/flowInit.js"],"names":[],"mappings":"AAyDA;;;;;GAKG;AACH,sCAHW,OAAO,iBAAiB,EAAE,OAAO,qBACjC,GAAG,CAAC,OAAO,yBAAyB,EAAE,OAAO,EAAE,OAAO,yBAAyB,EAAE,OAAO,CAAC,QAcnG;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,mDAXW,OAAO,iBAAiB,EAAE,OAAO,QACjC,OAAO,eAAe,EAAE,OAAO,eAC/B,CAAC,IAAI,EAAE,OAAO,iBAAiB,EAAE,OAAO,KAAK,OAAO,gCACpD,CAAC,IAAI,EAAE,OAAO,iBAAiB,EAAE,OAAO,KAAK,OAAO,GAClD;IACN,QAAQ,EAAE,OAAO,eAAe,EAAE,OAAO,CAAC;IAC1C,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,WAAW,EAAE,GAAG,CAAC,OAAO,yBAAyB,EAAE,OAAO,CAAC,CAAC;IAC5D,gBAAgB,EAAE,OAAO,CAAC,OAAO,kBAAkB,EAAE,OAAO,CAAC,EAAE,CAAA;CAClE,CA4FH;AAED;;;;;;;GAOG;AACH,2DAJW,OAAO,iBAAiB,EAAE,OAAO,GAAG,OAAO,iBAAiB,EAAE,OAAO,EAAE,eACvE,CAAC,IAAI,EAAE,OAAO,iBAAiB,EAAE,OAAO,KAAK,OAAO,GAClD,GAAG,CAAC,OAAO,yBAAyB,EAAE,OAAO,CAAC,CAsB1D;AAED;;;;;;;GAOG;AACH,kEAJW,OAAO,iBAAiB,EAAE,OAAO,eACjC,CAAC,IAAI,EAAE,OAAO,iBAAiB,EAAE,OAAO,KAAK,OAAO,GAClD,GAAG,CAAC,OAAO,yBAAyB,EAAE,OAAO,CAAC,CAe1D;AAED;;;;;;;;;GASG;AACH,iDANW,OAAO,iBAAiB,EAAE,OAAO,gBACjC,GAAG,CAAC,OAAO,yBAAyB,EAAE,OAAO,CAAC,eAC9C,CAAC,IAAI,EAAE,OAAO,iBAAiB,EAAE,OAAO,KAAK,OAAO,gBACpD;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GACvB,OAAO,CAAC,IAAI,EAAE,CAAC,CAuB3B;qBA5SoB,qBAAqB"}
1
+ {"version":3,"file":"flowInit.d.ts","sourceRoot":"","sources":["../../../src/data/flowInit.js"],"names":[],"mappings":"AAwDA;;;;;GAKG;AACH,sCAHW,OAAO,iBAAiB,EAAE,OAAO,qBACjC,GAAG,CAAC,OAAO,yBAAyB,EAAE,OAAO,EAAE,OAAO,yBAAyB,EAAE,OAAO,CAAC,QAcnG;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,mDAXW,OAAO,iBAAiB,EAAE,OAAO,QACjC,OAAO,eAAe,EAAE,OAAO,eAC/B,CAAC,IAAI,EAAE,OAAO,iBAAiB,EAAE,OAAO,KAAK,OAAO,gCACpD,CAAC,IAAI,EAAE,OAAO,iBAAiB,EAAE,OAAO,KAAK,OAAO,GAClD;IACN,QAAQ,EAAE,OAAO,eAAe,EAAE,OAAO,CAAC;IAC1C,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,WAAW,EAAE,GAAG,CAAC,OAAO,yBAAyB,EAAE,OAAO,CAAC,CAAC;IAC5D,gBAAgB,EAAE,OAAO,CAAC,OAAO,kBAAkB,EAAE,OAAO,CAAC,EAAE,CAAA;CAClE,CA6FH;AAED;;;;;;;GAOG;AACH,2DAJW,OAAO,iBAAiB,EAAE,OAAO,GAAG,OAAO,iBAAiB,EAAE,OAAO,EAAE,eACvE,CAAC,IAAI,EAAE,OAAO,iBAAiB,EAAE,OAAO,KAAK,OAAO,GAClD,GAAG,CAAC,OAAO,yBAAyB,EAAE,OAAO,CAAC,CAsB1D;AAED;;;;;;;GAOG;AACH,kEAJW,OAAO,iBAAiB,EAAE,OAAO,eACjC,CAAC,IAAI,EAAE,OAAO,iBAAiB,EAAE,OAAO,KAAK,OAAO,GAClD,GAAG,CAAC,OAAO,yBAAyB,EAAE,OAAO,CAAC,CAe1D;AAED;;;;;;;;;GASG;AACH,iDANW,OAAO,iBAAiB,EAAE,OAAO,gBACjC,GAAG,CAAC,OAAO,yBAAyB,EAAE,OAAO,CAAC,eAC9C,CAAC,IAAI,EAAE,OAAO,iBAAiB,EAAE,OAAO,KAAK,OAAO,gBACpD;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GACvB,OAAO,CAAC,IAAI,EAAE,CAAC,CAsB3B;qBA3SoB,qBAAqB"}
@@ -2,7 +2,6 @@ import UnitView from "../view/unitView.js";
2
2
  import { buildDataFlow } from "../view/flowBuilder.js";
3
3
  import { optimizeDataFlow } from "./flowOptimizer.js";
4
4
  import { VISIT_SKIP } from "../view/view.js";
5
- import { reconfigureScaleDomains } from "../scales/scaleResolution.js";
6
5
 
7
6
  /** @type {WeakMap<import("./sources/dataSource.js").default, Promise<void>>} */
8
7
  const inFlightLoads = new WeakMap();
@@ -163,7 +162,7 @@ export function initializeViewSubtree(
163
162
 
164
163
  // Initialize flow nodes for the sources that belong to this subtree.
165
164
  for (const dataSource of dataSources) {
166
- dataSource.visit((node) => node.initialize());
165
+ dataSource.visit((node) => node.initializeOnce());
167
166
  }
168
167
 
169
168
  /** @type {UnitView[]} */
@@ -180,6 +179,7 @@ export function initializeViewSubtree(
180
179
  const mark = view.mark;
181
180
  // Encoders can be initialized immediately; graphics need a GL context.
182
181
  mark.initializeEncoders();
182
+ view.registerDomainSubscriptions();
183
183
  if (canInitializeGraphics) {
184
184
  graphicsPromises.push(mark.initializeGraphics().then(() => mark));
185
185
  }
@@ -294,7 +294,6 @@ export function loadViewSubtreeData(
294
294
  loadDataSourceOnce(dataSource, loadOptions)
295
295
  )
296
296
  ).then((results) => {
297
- reconfigureScaleDomains(subtreeRoot, viewFilter);
298
297
  broadcastSubtreeDataReady(subtreeRoot);
299
298
  return results;
300
299
  });
@@ -24,7 +24,7 @@ export const BEHAVIOR_MODIFIES: number;
24
24
  */
25
25
  export const BEHAVIOR_COLLECTS: number;
26
26
  /**
27
- * @typedef {{paramMediator: import("../view/paramMediator.js").default}} ParamMediatorProvider
27
+ * @typedef {{paramRuntime?: import("../paramRuntime/viewParamRuntime.js").default}} ParamRuntimeProvider
28
28
  */
29
29
  /**
30
30
  * This is heavily inspired by Vega's and Vega-Lite's data flow system.
@@ -34,20 +34,20 @@ export const BEHAVIOR_COLLECTS: number;
34
34
  */
35
35
  export default class FlowNode {
36
36
  /**
37
- * @param {ParamMediatorProvider} [paramMediatorProvider]
37
+ * @param {ParamRuntimeProvider} [paramRuntimeProvider]
38
38
  */
39
- constructor(paramMediatorProvider?: ParamMediatorProvider);
39
+ constructor(paramRuntimeProvider?: ParamRuntimeProvider);
40
40
  stats: {
41
41
  count: number;
42
42
  /** @type {Datum} */
43
43
  first: Datum;
44
44
  };
45
45
  /**
46
- * An object that provides a paramMediator. (Most likely a View)
46
+ * An object that provides a paramRuntime. (Most likely a View)
47
47
  *
48
- * @type {ParamMediatorProvider}
48
+ * @type {ParamRuntimeProvider}
49
49
  */
50
- paramMediatorProvider: ParamMediatorProvider;
50
+ paramRuntimeProvider: ParamRuntimeProvider;
51
51
  get behavior(): number;
52
52
  /**
53
53
  * A human-readable label for the node. Used for debugging and logging.
@@ -61,6 +61,7 @@ export default class FlowNode {
61
61
  parent: FlowNode;
62
62
  /** True if all data have been processed */
63
63
  completed: boolean;
64
+ get disposed(): boolean;
64
65
  /**
65
66
  * Resets the node and all its descendants to their initial state, i.e., preparing
66
67
  * for a new batch of data.
@@ -69,8 +70,16 @@ export default class FlowNode {
69
70
  /**
70
71
  * Allows for doing final initialization after the flow structure has been
71
72
  * built and optimized. Must be called before any data are to be propagated.
73
+ * Note: Some transforms call initialize() from reset() to rebuild internal
74
+ * fast paths per batch. Use initializeOnce() for graph-level init to avoid
75
+ * double-initialization issues.
72
76
  */
73
77
  initialize(): void;
78
+ /**
79
+ * Calls initialize() once per node instance. Intended for graph-level init
80
+ * passes that should not rerun when reusing existing branches.
81
+ */
82
+ initializeOnce(): void;
74
83
  /**
75
84
  * @param {Datum} datum
76
85
  * @protected
@@ -129,6 +138,20 @@ export default class FlowNode {
129
138
  */
130
139
  handle(datum: Datum): void;
131
140
  complete(): void;
141
+ /**
142
+ * Register a disposer to be executed when this node is disposed.
143
+ *
144
+ * @param {() => void} disposer
145
+ */
146
+ registerDisposer(disposer: () => void): void;
147
+ /**
148
+ * Release resources owned by this flow node.
149
+ */
150
+ dispose(): void;
151
+ /**
152
+ * Dispose this flow node and all descendants in post-order.
153
+ */
154
+ disposeSubtree(): void;
132
155
  /**
133
156
  * Signals that a new batch of data will be propagated.
134
157
  *
@@ -136,10 +159,10 @@ export default class FlowNode {
136
159
  */
137
160
  beginBatch(flowBatch: import("../types/flowBatch.js").FlowBatch): void;
138
161
  /**
139
- * @returns {import("../view/paramMediator.js").default}
162
+ * @returns {import("../paramRuntime/viewParamRuntime.js").default}
140
163
  * @protected
141
164
  */
142
- protected get paramMediator(): import("../view/paramMediator.js").default;
165
+ protected get paramRuntime(): import("../paramRuntime/viewParamRuntime.js").default;
143
166
  /**
144
167
  * Repropagates the stored data. If this node has no stored data,
145
168
  * find the nearest ancestor that has and repropagate from there.
@@ -148,8 +171,8 @@ export default class FlowNode {
148
171
  protected repropagate(): void;
149
172
  #private;
150
173
  }
151
- export type ParamMediatorProvider = {
152
- paramMediator: import("../view/paramMediator.js").default;
174
+ export type ParamRuntimeProvider = {
175
+ paramRuntime?: import("../paramRuntime/viewParamRuntime.js").default;
153
176
  };
154
177
  /**
155
178
  * This is heavily inspired by Vega's and Vega-Lite's data flow system.
@@ -1 +1 @@
1
- {"version":3,"file":"flowNode.d.ts","sourceRoot":"","sources":["../../../src/data/flowNode.js"],"names":[],"mappings":"AAuUA;;;GAGG;AACH,uCAHW,OAAO,uBAAuB,EAAE,SAAS,GACvC,SAAS,IAAI,OAAO,uBAAuB,EAAE,SAAS,CAIlE;AAED;;;GAGG;AACH,wCAHW,OAAO,uBAAuB,EAAE,SAAS,GACvC,SAAS,IAAI,OAAO,uBAAuB,EAAE,UAAU,CAInE;AAnVD;;;GAGG;AACH,qCAAsC;AAEtC;;;GAGG;AACH,uCAAwC;AAExC;;;GAGG;AACH,uCAAwC;AAExC;;GAEG;AAEH;;;;;GAKG;AACH;IA2BI;;OAEG;IACH,oCAFW,qBAAqB,EAa/B;IAxCD;;QAEI,oBAAoB;eAAT,KAAK;MAElB;IAEF;;;;OAIG;IACH,uBAFU,qBAAqB,CAEF;IAE7B,uBAEC;IAED;;;;OAIG;IACH,aAFa,MAAM,CAIlB;IAQG,yBAAyB;IACzB,UADW,QAAQ,EAAE,CACH;IAElB,uBAAuB;IACvB,QADW,QAAQ,CACI;IAEvB,2CAA2C;IAC3C,mBAAsB;IAG1B;;;OAGG;IACH,cASC;IAED;;;OAGG;IACH,mBAEC;IAgOD;;;OAGG;IACH,4BAHW,KAAK,QAKf;IA7MD;;;OAGG;IACH,kBAFW,QAAQ,QAIlB;IAED;;;OAGG;IACH,gBAFW,QAAQ,QAUlB;IAED;;OAEG;IACH,YAFW,QAAQ,QAQlB;IAED;;OAEG;IACH,6BAFW,QAAQ,QAMlB;IAED;;OAEG;IACH,0BAFW,QAAQ,QAalB;IAED;;;OAGG;IACH,mBAFW,QAAQ,QAWlB;IAED;;OAEG;IACH,eAiBC;IAED,kBAEC;IAED,uBAEC;IAED,sBAEC;IAED;;;;OAIG;IACH,eAFW,CAAC,CAAS,IAAQ,EAAR,QAAQ,KAAE,IAAI,CAAC,GAAG;QAAE,aAAa,CAAC,EAAE,CAAS,IAAQ,EAAR,QAAQ,KAAE,IAAI,CAAA;KAAC,QAchF;IAED;;;OAGG;IACH,wBAHW,MAAM,GACJ,MAAM,CAWlB;IAED;;;OAGG;IACH,cAFW,KAAK,QAKf;IAED,iBAMC;IAED;;;;OAIG;IACH,sBAFW,OAAO,uBAAuB,EAAE,SAAS,QAMnD;IAED;;;OAGG;IACH,+BAHa,OAAO,0BAA0B,EAAE,OAAO,CAYtD;IAED;;;;OAIG;IACH,8BAQC;;CASJ;oCAhTY;IAAC,aAAa,EAAE,OAAO,0BAA0B,EAAE,OAAO,CAAA;CAAC;;;;oBAM3D,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;;;;mBACnB,KAAK,EAAE"}
1
+ {"version":3,"file":"flowNode.d.ts","sourceRoot":"","sources":["../../../src/data/flowNode.js"],"names":[],"mappings":"AA8YA;;;GAGG;AACH,uCAHW,OAAO,uBAAuB,EAAE,SAAS,GACvC,SAAS,IAAI,OAAO,uBAAuB,EAAE,SAAS,CAIlE;AAED;;;GAGG;AACH,wCAHW,OAAO,uBAAuB,EAAE,SAAS,GACvC,SAAS,IAAI,OAAO,uBAAuB,EAAE,UAAU,CAInE;AA1ZD;;;GAGG;AACH,qCAAsC;AAEtC;;;GAGG;AACH,uCAAwC;AAExC;;;GAGG;AACH,uCAAwC;AAExC;;GAEG;AAEH;;;;;GAKG;AACH;IAoCI;;OAEG;IACH,mCAFW,oBAAoB,EAa9B;IAjDD;;QAEI,oBAAoB;eAAT,KAAK;MAElB;IAWF;;;;OAIG;IACH,sBAFU,oBAAoB,CAEF;IAE5B,uBAEC;IAED;;;;OAIG;IACH,aAFa,MAAM,CAIlB;IAQG,yBAAyB;IACzB,UADW,QAAQ,EAAE,CACH;IAElB,uBAAuB;IACvB,QADW,QAAQ,CACI;IAEvB,2CAA2C;IAC3C,mBAAsB;IAG1B,wBAEC;IAED;;;OAGG;IACH,cASC;IAED;;;;;;OAMG;IACH,mBAEC;IAED;;;OAGG;IACH,uBAMC;IA2QD;;;OAGG;IACH,4BAHW,KAAK,QAKf;IAxPD;;;OAGG;IACH,kBAFW,QAAQ,QAIlB;IAED;;;OAGG;IACH,gBAFW,QAAQ,QAUlB;IAED;;OAEG;IACH,YAFW,QAAQ,QAQlB;IAED;;OAEG;IACH,6BAFW,QAAQ,QAMlB;IAED;;OAEG;IACH,0BAFW,QAAQ,QAalB;IAED;;;OAGG;IACH,mBAFW,QAAQ,QAWlB;IAED;;OAEG;IACH,eAiBC;IAED,kBAEC;IAED,uBAEC;IAED,sBAEC;IAED;;;;OAIG;IACH,eAFW,CAAC,CAAS,IAAQ,EAAR,QAAQ,KAAE,IAAI,CAAC,GAAG;QAAE,aAAa,CAAC,EAAE,CAAS,IAAQ,EAAR,QAAQ,KAAE,IAAI,CAAA;KAAC,QAchF;IAED;;;OAGG;IACH,wBAHW,MAAM,GACJ,MAAM,CAWlB;IAED;;;OAGG;IACH,cAFW,KAAK,QAKf;IAED,iBAMC;IAED;;;;OAIG;IACH,2BAFW,MAAM,IAAI,QAQpB;IAED;;OAEG;IACH,gBAWC;IAED;;OAEG;IACH,uBAOC;IAED;;;;OAIG;IACH,sBAFW,OAAO,uBAAuB,EAAE,SAAS,QAMnD;IAED;;;OAGG;IACH,8BAHa,OAAO,qCAAqC,EAAE,OAAO,CAcjE;IAED;;;;OAIG;IACH,8BAQC;;CASJ;mCAvXY;IAAC,YAAY,CAAC,EAAE,OAAO,qCAAqC,EAAE,OAAO,CAAA;CAAC;;;;oBAMtE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;;;;mBACnB,KAAK,EAAE"}
@@ -19,7 +19,7 @@ export const BEHAVIOR_MODIFIES = 1 << 1;
19
19
  export const BEHAVIOR_COLLECTS = 1 << 2;
20
20
 
21
21
  /**
22
- * @typedef {{paramMediator: import("../view/paramMediator.js").default}} ParamMediatorProvider
22
+ * @typedef {{paramRuntime?: import("../paramRuntime/viewParamRuntime.js").default}} ParamRuntimeProvider
23
23
  */
24
24
 
25
25
  /**
@@ -35,12 +35,21 @@ export default class FlowNode {
35
35
  first: null,
36
36
  };
37
37
 
38
+ /** @type {boolean} */
39
+ #initialized = false;
40
+
41
+ /** @type {boolean} */
42
+ #disposed = false;
43
+
44
+ /** @type {(() => void)[]} */
45
+ #disposers = [];
46
+
38
47
  /**
39
- * An object that provides a paramMediator. (Most likely a View)
48
+ * An object that provides a paramRuntime. (Most likely a View)
40
49
  *
41
- * @type {ParamMediatorProvider}
50
+ * @type {ParamRuntimeProvider}
42
51
  */
43
- paramMediatorProvider = null;
52
+ paramRuntimeProvider = null;
44
53
 
45
54
  get behavior() {
46
55
  return 0;
@@ -56,10 +65,10 @@ export default class FlowNode {
56
65
  }
57
66
 
58
67
  /**
59
- * @param {ParamMediatorProvider} [paramMediatorProvider]
68
+ * @param {ParamRuntimeProvider} [paramRuntimeProvider]
60
69
  */
61
- constructor(paramMediatorProvider) {
62
- this.paramMediatorProvider = paramMediatorProvider;
70
+ constructor(paramRuntimeProvider) {
71
+ this.paramRuntimeProvider = paramRuntimeProvider;
63
72
 
64
73
  /** @type {FlowNode[]} */
65
74
  this.children = [];
@@ -71,6 +80,10 @@ export default class FlowNode {
71
80
  this.completed = false;
72
81
  }
73
82
 
83
+ get disposed() {
84
+ return this.#disposed;
85
+ }
86
+
74
87
  /**
75
88
  * Resets the node and all its descendants to their initial state, i.e., preparing
76
89
  * for a new batch of data.
@@ -89,11 +102,26 @@ export default class FlowNode {
89
102
  /**
90
103
  * Allows for doing final initialization after the flow structure has been
91
104
  * built and optimized. Must be called before any data are to be propagated.
105
+ * Note: Some transforms call initialize() from reset() to rebuild internal
106
+ * fast paths per batch. Use initializeOnce() for graph-level init to avoid
107
+ * double-initialization issues.
92
108
  */
93
109
  initialize() {
94
110
  // override
95
111
  }
96
112
 
113
+ /**
114
+ * Calls initialize() once per node instance. Intended for graph-level init
115
+ * passes that should not rerun when reusing existing branches.
116
+ */
117
+ initializeOnce() {
118
+ if (this.#initialized) {
119
+ return;
120
+ }
121
+ this.initialize();
122
+ this.#initialized = true;
123
+ }
124
+
97
125
  /**
98
126
  * Dynamically updates the propagator method to allow the JavaScript engine
99
127
  * to employ optimizations such as inlining.
@@ -275,6 +303,47 @@ export default class FlowNode {
275
303
  }
276
304
  }
277
305
 
306
+ /**
307
+ * Register a disposer to be executed when this node is disposed.
308
+ *
309
+ * @param {() => void} disposer
310
+ */
311
+ registerDisposer(disposer) {
312
+ if (this.#disposed) {
313
+ disposer();
314
+ } else {
315
+ this.#disposers.push(disposer);
316
+ }
317
+ }
318
+
319
+ /**
320
+ * Release resources owned by this flow node.
321
+ */
322
+ dispose() {
323
+ if (this.#disposed) {
324
+ return;
325
+ }
326
+
327
+ this.#disposed = true;
328
+
329
+ for (const disposer of this.#disposers) {
330
+ disposer();
331
+ }
332
+ this.#disposers.length = 0;
333
+ }
334
+
335
+ /**
336
+ * Dispose this flow node and all descendants in post-order.
337
+ */
338
+ disposeSubtree() {
339
+ /** @type {(function(FlowNode): void) & { afterChildren?: (node: FlowNode) => void }} */
340
+ const visitor = () => undefined;
341
+ visitor.afterChildren = (node) => {
342
+ node.dispose();
343
+ };
344
+ this.visit(visitor);
345
+ }
346
+
278
347
  /**
279
348
  * Signals that a new batch of data will be propagated.
280
349
  *
@@ -287,18 +356,20 @@ export default class FlowNode {
287
356
  }
288
357
 
289
358
  /**
290
- * @returns {import("../view/paramMediator.js").default}
359
+ * @returns {import("../paramRuntime/viewParamRuntime.js").default}
291
360
  * @protected
292
361
  */
293
- get paramMediator() {
294
- if (this.paramMediatorProvider) {
295
- return this.paramMediatorProvider.paramMediator;
362
+ get paramRuntime() {
363
+ if (this.paramRuntimeProvider) {
364
+ if (this.paramRuntimeProvider.paramRuntime) {
365
+ return this.paramRuntimeProvider.paramRuntime;
366
+ }
296
367
  }
297
368
 
298
369
  if (!this.parent) {
299
- throw new Error("Cannot find paramMediator!");
370
+ throw new Error("Cannot find paramRuntime!");
300
371
  }
301
- return this.parent.paramMediator;
372
+ return this.parent.paramRuntime;
302
373
  }
303
374
 
304
375
  /**
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  *
3
- * @returns {import("./flowNode.js").ParamMediatorProvider}
3
+ * @returns {import("./flowNode.js").ParamRuntimeProvider}
4
4
  */
5
- export function makeParamMediatorProvider(): import("./flowNode.js").ParamMediatorProvider;
5
+ export function makeParamRuntimeProvider(): import("./flowNode.js").ParamRuntimeProvider;
6
6
  /**
7
7
  *
8
8
  * @param {import("./flowNode.js").default} flowNode
@@ -1 +1 @@
1
- {"version":3,"file":"flowTestUtils.d.ts","sourceRoot":"","sources":["../../../src/data/flowTestUtils.js"],"names":[],"mappings":"AAIA;;;GAGG;AACH,6CAFa,OAAO,eAAe,EAAE,qBAAqB,CAMzD;AAED;;;;GAIG;AACH,sCAHW,OAAO,eAAe,EAAE,OAAO,QAC/B,GAAG,EAAE,mCAcf;AAED;;GAEG;AACH;IACI;;;OAGG;IACH,kBAFW,GAAG,EAAE,EAKf;IADG,YAAgB;IAGpB,iBAMC;CACJ;AAED;;GAEG;AACH;IACI;;;OAGG;IACH,eAFW,MAAM,EAWhB;CACJ;qBAvEoB,eAAe"}
1
+ {"version":3,"file":"flowTestUtils.d.ts","sourceRoot":"","sources":["../../../src/data/flowTestUtils.js"],"names":[],"mappings":"AAIA;;;GAGG;AACH,4CAFa,OAAO,eAAe,EAAE,oBAAoB,CAOxD;AAED;;;;GAIG;AACH,sCAHW,OAAO,eAAe,EAAE,OAAO,QAC/B,GAAG,EAAE,mCAcf;AAED;;GAEG;AACH;IACI;;;OAGG;IACH,kBAFW,GAAG,EAAE,EAKf;IADG,YAAgB;IAGpB,iBAMC;CACJ;AAED;;GAEG;AACH;IACI;;;OAGG;IACH,eAFW,MAAM,EAWhB;CACJ;qBAxEoB,eAAe"}