@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.
- package/dist/bundle/index.es.js +15884 -13130
- package/dist/bundle/index.js +130 -149
- package/dist/schema.json +6498 -6191
- package/dist/src/data/collector.d.ts +20 -0
- package/dist/src/data/collector.d.ts.map +1 -1
- package/dist/src/data/collector.js +148 -0
- package/dist/src/data/dataFlow.d.ts +6 -0
- package/dist/src/data/dataFlow.d.ts.map +1 -1
- package/dist/src/data/dataFlow.js +20 -0
- package/dist/src/data/flowInit.d.ts.map +1 -1
- package/dist/src/data/flowInit.js +2 -3
- package/dist/src/data/flowNode.d.ts +33 -10
- package/dist/src/data/flowNode.d.ts.map +1 -1
- package/dist/src/data/flowNode.js +84 -13
- package/dist/src/data/flowTestUtils.d.ts +2 -2
- package/dist/src/data/flowTestUtils.d.ts.map +1 -1
- package/dist/src/data/flowTestUtils.js +5 -4
- package/dist/src/data/keyIndex.d.ts +18 -0
- package/dist/src/data/keyIndex.d.ts.map +1 -0
- package/dist/src/data/keyIndex.js +241 -0
- package/dist/src/data/keyIndex.test.d.ts +2 -0
- package/dist/src/data/keyIndex.test.d.ts.map +1 -0
- package/dist/src/data/sources/dataSource.d.ts.map +1 -1
- package/dist/src/data/sources/dataSource.js +7 -3
- package/dist/src/data/sources/dataSourceFactory.d.ts +14 -12
- package/dist/src/data/sources/dataSourceFactory.d.ts.map +1 -1
- package/dist/src/data/sources/dataSourceFactory.js +52 -16
- package/dist/src/data/sources/lazy/bigBedSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/bigBedSource.js +11 -10
- package/dist/src/data/sources/lazy/bigWigSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/bigWigSource.js +11 -10
- package/dist/src/data/sources/lazy/mockLazySource.d.ts +29 -0
- package/dist/src/data/sources/lazy/mockLazySource.d.ts.map +1 -0
- package/dist/src/data/sources/lazy/mockLazySource.js +44 -0
- package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts +22 -1
- package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/singleAxisLazySource.js +34 -2
- package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/singleAxisWindowedSource.js +16 -1
- package/dist/src/data/sources/lazy/tabixSource.d.ts +0 -1
- package/dist/src/data/sources/lazy/tabixSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/tabixSource.js +56 -16
- package/dist/src/data/sources/sequenceSource.d.ts.map +1 -1
- package/dist/src/data/sources/sequenceSource.js +5 -3
- package/dist/src/data/sources/urlSource.d.ts.map +1 -1
- package/dist/src/data/sources/urlSource.js +7 -3
- package/dist/src/data/transforms/filter.d.ts +4 -4
- package/dist/src/data/transforms/filter.d.ts.map +1 -1
- package/dist/src/data/transforms/filter.js +13 -7
- package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
- package/dist/src/data/transforms/filterScoredLabels.js +11 -6
- package/dist/src/data/transforms/filterScoredLabels.test.d.ts +2 -0
- package/dist/src/data/transforms/filterScoredLabels.test.d.ts.map +1 -0
- package/dist/src/data/transforms/formula.d.ts +4 -4
- package/dist/src/data/transforms/formula.d.ts.map +1 -1
- package/dist/src/data/transforms/formula.js +12 -6
- package/dist/src/data/transforms/measureText.d.ts +2 -2
- package/dist/src/data/transforms/measureText.d.ts.map +1 -1
- package/dist/src/data/transforms/measureText.js +16 -12
- package/dist/src/data/transforms/stack.d.ts.map +1 -1
- package/dist/src/data/transforms/stack.js +1 -0
- package/dist/src/data/transforms/transform.d.ts +2 -2
- package/dist/src/data/transforms/transform.d.ts.map +1 -1
- package/dist/src/data/transforms/transform.js +3 -3
- package/dist/src/encoder/accessor.d.ts +51 -4
- package/dist/src/encoder/accessor.d.ts.map +1 -1
- package/dist/src/encoder/accessor.js +174 -10
- package/dist/src/encoder/encoder.d.ts +11 -2
- package/dist/src/encoder/encoder.d.ts.map +1 -1
- package/dist/src/encoder/encoder.js +29 -9
- package/dist/src/encoder/metadataChannels.d.ts +15 -0
- package/dist/src/encoder/metadataChannels.d.ts.map +1 -0
- package/dist/src/encoder/metadataChannels.js +65 -0
- package/dist/src/encoder/metadataChannels.test.d.ts +2 -0
- package/dist/src/encoder/metadataChannels.test.d.ts.map +1 -0
- package/dist/src/genome/genome.d.ts +8 -0
- package/dist/src/genome/genome.d.ts.map +1 -1
- package/dist/src/genome/genome.js +16 -1
- package/dist/src/genome/scaleLocus.d.ts.map +1 -1
- package/dist/src/genome/scaleLocus.js +14 -1
- package/dist/src/genomeSpy/containerUi.d.ts +0 -1
- package/dist/src/genomeSpy/containerUi.d.ts.map +1 -1
- package/dist/src/genomeSpy/containerUi.js +0 -14
- package/dist/src/genomeSpy/inputBindingManager.js +1 -1
- package/dist/src/genomeSpy/interactionController.d.ts.map +1 -1
- package/dist/src/genomeSpy/interactionController.js +7 -1
- package/dist/src/genomeSpy/loadingIndicatorManager.d.ts +3 -7
- package/dist/src/genomeSpy/loadingIndicatorManager.d.ts.map +1 -1
- package/dist/src/genomeSpy/loadingIndicatorManager.js +68 -20
- package/dist/src/genomeSpy/loadingStatusRegistry.d.ts +52 -0
- package/dist/src/genomeSpy/loadingStatusRegistry.d.ts.map +1 -0
- package/dist/src/genomeSpy/loadingStatusRegistry.js +86 -0
- package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -1
- package/dist/src/genomeSpy/viewContextFactory.js +0 -1
- package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -1
- package/dist/src/genomeSpy/viewDataInit.js +56 -11
- package/dist/src/genomeSpy.d.ts +0 -2
- package/dist/src/genomeSpy.d.ts.map +1 -1
- package/dist/src/genomeSpy.js +47 -27
- package/dist/src/gl/glslScaleGenerator.js +1 -1
- package/dist/src/marks/mark.d.ts.map +1 -1
- package/dist/src/marks/mark.js +40 -41
- package/dist/src/marks/markUtils.js +1 -1
- package/dist/src/marks/point.d.ts.map +1 -1
- package/dist/src/marks/point.js +4 -6
- package/dist/src/paramRuntime/expressionCompiler.d.ts +7 -0
- package/dist/src/paramRuntime/expressionCompiler.d.ts.map +1 -0
- package/dist/src/paramRuntime/expressionCompiler.js +10 -0
- package/dist/src/paramRuntime/expressionRef.d.ts +20 -0
- package/dist/src/paramRuntime/expressionRef.d.ts.map +1 -0
- package/dist/src/paramRuntime/expressionRef.js +95 -0
- package/dist/src/paramRuntime/expressionRef.test.d.ts +2 -0
- package/dist/src/paramRuntime/expressionRef.test.d.ts.map +1 -0
- package/dist/src/paramRuntime/graphRuntime.d.ts +176 -0
- package/dist/src/paramRuntime/graphRuntime.d.ts.map +1 -0
- package/dist/src/paramRuntime/graphRuntime.js +628 -0
- package/dist/src/paramRuntime/graphRuntime.test.d.ts +2 -0
- package/dist/src/paramRuntime/graphRuntime.test.d.ts.map +1 -0
- package/dist/src/paramRuntime/index.d.ts +9 -0
- package/dist/src/paramRuntime/index.d.ts.map +1 -0
- package/dist/src/paramRuntime/index.js +8 -0
- package/dist/src/paramRuntime/lifecycleRegistry.d.ts +27 -0
- package/dist/src/paramRuntime/lifecycleRegistry.d.ts.map +1 -0
- package/dist/src/paramRuntime/lifecycleRegistry.js +54 -0
- package/dist/src/paramRuntime/paramRuntime.d.ts +165 -0
- package/dist/src/paramRuntime/paramRuntime.d.ts.map +1 -0
- package/dist/src/paramRuntime/paramRuntime.js +222 -0
- package/dist/src/paramRuntime/paramRuntime.test.d.ts +2 -0
- package/dist/src/paramRuntime/paramRuntime.test.d.ts.map +1 -0
- package/dist/src/paramRuntime/paramStore.d.ts +68 -0
- package/dist/src/paramRuntime/paramStore.d.ts.map +1 -0
- package/dist/src/paramRuntime/paramStore.js +148 -0
- package/dist/src/paramRuntime/paramStore.test.d.ts +2 -0
- package/dist/src/paramRuntime/paramStore.test.d.ts.map +1 -0
- package/dist/src/paramRuntime/paramUtils.d.ts +86 -0
- package/dist/src/paramRuntime/paramUtils.d.ts.map +1 -0
- package/dist/src/paramRuntime/paramUtils.js +272 -0
- package/dist/src/paramRuntime/selectionStore.d.ts +6 -0
- package/dist/src/paramRuntime/selectionStore.d.ts.map +1 -0
- package/dist/src/paramRuntime/selectionStore.js +13 -0
- package/dist/src/paramRuntime/types.d.ts +16 -0
- package/dist/src/paramRuntime/types.d.ts.map +1 -0
- package/dist/src/paramRuntime/types.js +25 -0
- package/dist/src/paramRuntime/viewParamRuntime.d.ts +164 -0
- package/dist/src/paramRuntime/viewParamRuntime.d.ts.map +1 -0
- package/dist/src/paramRuntime/viewParamRuntime.js +443 -0
- package/dist/src/scale/scale.d.ts +6 -1
- package/dist/src/scale/scale.d.ts.map +1 -1
- package/dist/src/scale/scale.js +83 -23
- package/dist/src/scales/axisResolution.d.ts.map +1 -1
- package/dist/src/scales/axisResolution.js +10 -0
- package/dist/src/scales/{scaleDomainAggregator.d.ts → domainPlanner.d.ts} +6 -3
- package/dist/src/scales/domainPlanner.d.ts.map +1 -0
- package/dist/src/scales/{scaleDomainAggregator.js → domainPlanner.js} +128 -10
- package/dist/src/scales/domainPlanner.test.d.ts +2 -0
- package/dist/src/scales/domainPlanner.test.d.ts.map +1 -0
- package/dist/src/scales/scaleInstanceManager.d.ts +6 -3
- package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -1
- package/dist/src/scales/scaleInstanceManager.js +17 -11
- package/dist/src/scales/scaleInteractionController.d.ts +6 -0
- package/dist/src/scales/scaleInteractionController.d.ts.map +1 -1
- package/dist/src/scales/scaleInteractionController.js +41 -3
- package/dist/src/scales/scaleResolution.d.ts +20 -17
- package/dist/src/scales/scaleResolution.d.ts.map +1 -1
- package/dist/src/scales/scaleResolution.js +188 -71
- package/dist/src/scales/scaleResolution.test.d.ts.map +1 -1
- package/dist/src/selection/selection.d.ts +21 -0
- package/dist/src/selection/selection.d.ts.map +1 -1
- package/dist/src/selection/selection.js +83 -1
- package/dist/src/spec/channel.d.ts +52 -15
- package/dist/src/spec/coreSchemaRoot.d.ts +53 -0
- package/dist/src/spec/data.d.ts +4 -0
- package/dist/src/spec/parameter.d.ts +16 -11
- package/dist/src/spec/root.d.ts +1 -1
- package/dist/src/spec/testing.d.ts +12 -0
- package/dist/src/spec/testing.d.ts.map +1 -0
- package/dist/src/spec/testing.js +20 -0
- package/dist/src/spec/view.d.ts +157 -41
- package/dist/src/styles/genome-spy.css +3 -31
- package/dist/src/styles/genome-spy.css.d.ts +1 -1
- package/dist/src/styles/genome-spy.css.d.ts.map +1 -1
- package/dist/src/styles/genome-spy.css.js +0 -29
- package/dist/src/tooltip/dataTooltipHandler.d.ts +1 -1
- package/dist/src/tooltip/dataTooltipHandler.js +23 -32
- package/dist/src/tooltip/dataTooltipHandler.test.d.ts +2 -0
- package/dist/src/tooltip/dataTooltipHandler.test.d.ts.map +1 -0
- package/dist/src/tooltip/flattenDatumRows.d.ts +13 -0
- package/dist/src/tooltip/flattenDatumRows.d.ts.map +1 -0
- package/dist/src/tooltip/flattenDatumRows.js +47 -0
- package/dist/src/tooltip/flattenDatumRows.test.d.ts +2 -0
- package/dist/src/tooltip/flattenDatumRows.test.d.ts.map +1 -0
- package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts +1 -1
- package/dist/src/tooltip/refseqGeneTooltipHandler.js +7 -1
- package/dist/src/tooltip/tooltipContext.d.ts +13 -0
- package/dist/src/tooltip/tooltipContext.d.ts.map +1 -0
- package/dist/src/tooltip/tooltipContext.js +543 -0
- package/dist/src/tooltip/tooltipContext.test.d.ts +2 -0
- package/dist/src/tooltip/tooltipContext.test.d.ts.map +1 -0
- package/dist/src/tooltip/tooltipHandler.d.ts +40 -1
- package/dist/src/tooltip/tooltipHandler.d.ts.map +1 -1
- package/dist/src/tooltip/tooltipHandler.ts +62 -1
- package/dist/src/types/encoder.d.ts +38 -3
- package/dist/src/types/rendering.d.ts +4 -3
- package/dist/src/types/viewContext.d.ts +0 -14
- package/dist/src/utils/inputBinding.d.ts +10 -2
- package/dist/src/utils/inputBinding.d.ts.map +1 -1
- package/dist/src/utils/inputBinding.js +12 -3
- package/dist/src/utils/throttle.d.ts +4 -1
- package/dist/src/utils/throttle.d.ts.map +1 -1
- package/dist/src/utils/throttle.js +54 -23
- package/dist/src/utils/throttle.test.d.ts +2 -0
- package/dist/src/utils/throttle.test.d.ts.map +1 -0
- package/dist/src/utils/transition.d.ts +21 -0
- package/dist/src/utils/transition.d.ts.map +1 -1
- package/dist/src/utils/transition.js +28 -0
- package/dist/src/utils/ui/tooltip.d.ts.map +1 -1
- package/dist/src/utils/ui/tooltip.js +7 -1
- package/dist/src/utils/ui/tooltip.test.d.ts +2 -0
- package/dist/src/utils/ui/tooltip.test.d.ts.map +1 -0
- package/dist/src/view/axisGridView.d.ts.map +1 -1
- package/dist/src/view/axisGridView.js +22 -5
- package/dist/src/view/axisView.d.ts.map +1 -1
- package/dist/src/view/axisView.js +20 -5
- package/dist/src/view/concatView.js +3 -3
- package/dist/src/view/containerMutationHelper.js +1 -1
- package/dist/src/view/containerView.d.ts +9 -5
- package/dist/src/view/containerView.d.ts.map +1 -1
- package/dist/src/view/containerView.js +34 -9
- package/dist/src/view/dataReadiness.d.ts +46 -0
- package/dist/src/view/dataReadiness.d.ts.map +1 -0
- package/dist/src/view/dataReadiness.js +267 -0
- package/dist/src/view/dataReadiness.test.d.ts +2 -0
- package/dist/src/view/dataReadiness.test.d.ts.map +1 -0
- package/dist/src/view/facetView.d.ts.map +1 -1
- package/dist/src/view/facetView.js +7 -5
- package/dist/src/view/flowBuilder.d.ts.map +1 -1
- package/dist/src/view/flowBuilder.js +17 -4
- package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
- package/dist/src/view/gridView/gridChild.js +16 -3
- package/dist/src/view/gridView/gridView.d.ts.map +1 -1
- package/dist/src/view/gridView/gridView.js +119 -2
- package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
- package/dist/src/view/gridView/scrollbar.js +3 -0
- package/dist/src/view/gridView/selectionRect.d.ts +6 -10
- package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
- package/dist/src/view/gridView/selectionRect.js +22 -24
- package/dist/src/view/gridView/separatorView.d.ts +51 -0
- package/dist/src/view/gridView/separatorView.d.ts.map +1 -0
- package/dist/src/view/gridView/separatorView.js +275 -0
- package/dist/src/view/layerView.d.ts.map +1 -1
- package/dist/src/view/layerView.js +7 -5
- package/dist/src/view/layout/flexLayout.d.ts +0 -30
- package/dist/src/view/layout/flexLayout.d.ts.map +1 -1
- package/dist/src/view/layout/flexLayout.js +0 -86
- package/dist/src/view/multiscale.d.ts +35 -0
- package/dist/src/view/multiscale.d.ts.map +1 -0
- package/dist/src/view/multiscale.js +233 -0
- package/dist/src/view/multiscale.test.d.ts +2 -0
- package/dist/src/view/multiscale.test.d.ts.map +1 -0
- package/dist/src/view/testUtils.d.ts.map +1 -1
- package/dist/src/view/testUtils.js +6 -1
- package/dist/src/view/unitView.d.ts +8 -13
- package/dist/src/view/unitView.d.ts.map +1 -1
- package/dist/src/view/unitView.js +120 -45
- package/dist/src/view/view.d.ts +27 -18
- package/dist/src/view/view.d.ts.map +1 -1
- package/dist/src/view/view.js +298 -37
- package/dist/src/view/viewFactory.d.ts +0 -12
- package/dist/src/view/viewFactory.d.ts.map +1 -1
- package/dist/src/view/viewFactory.js +55 -25
- package/dist/src/view/viewParamRuntime.test.d.ts +2 -0
- package/dist/src/view/viewParamRuntime.test.d.ts.map +1 -0
- package/dist/src/view/viewSelectors.d.ts +148 -0
- package/dist/src/view/viewSelectors.d.ts.map +1 -0
- package/dist/src/view/viewSelectors.js +776 -0
- package/dist/src/view/viewSelectors.test.d.ts +2 -0
- package/dist/src/view/viewSelectors.test.d.ts.map +1 -0
- package/dist/src/view/viewUtils.d.ts +0 -8
- package/dist/src/view/viewUtils.d.ts.map +1 -1
- package/dist/src/view/viewUtils.js +1 -21
- package/package.json +4 -4
- package/dist/src/scales/scaleDomainAggregator.d.ts.map +0 -1
- package/dist/src/scales/scaleDomainAggregator.test.d.ts +0 -2
- package/dist/src/scales/scaleDomainAggregator.test.d.ts.map +0 -1
- package/dist/src/spec/sampleView.d.ts +0 -197
- package/dist/src/view/paramMediator.d.ts +0 -149
- package/dist/src/view/paramMediator.d.ts.map +0 -1
- package/dist/src/view/paramMediator.js +0 -478
- package/dist/src/view/paramMediator.test.d.ts +0 -2
- 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":"
|
|
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":"
|
|
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":"
|
|
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.
|
|
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 {{
|
|
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 {
|
|
37
|
+
* @param {ParamRuntimeProvider} [paramRuntimeProvider]
|
|
38
38
|
*/
|
|
39
|
-
constructor(
|
|
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
|
|
46
|
+
* An object that provides a paramRuntime. (Most likely a View)
|
|
47
47
|
*
|
|
48
|
-
* @type {
|
|
48
|
+
* @type {ParamRuntimeProvider}
|
|
49
49
|
*/
|
|
50
|
-
|
|
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("../
|
|
162
|
+
* @returns {import("../paramRuntime/viewParamRuntime.js").default}
|
|
140
163
|
* @protected
|
|
141
164
|
*/
|
|
142
|
-
protected get
|
|
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
|
|
152
|
-
|
|
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":"
|
|
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 {{
|
|
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
|
|
48
|
+
* An object that provides a paramRuntime. (Most likely a View)
|
|
40
49
|
*
|
|
41
|
-
* @type {
|
|
50
|
+
* @type {ParamRuntimeProvider}
|
|
42
51
|
*/
|
|
43
|
-
|
|
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 {
|
|
68
|
+
* @param {ParamRuntimeProvider} [paramRuntimeProvider]
|
|
60
69
|
*/
|
|
61
|
-
constructor(
|
|
62
|
-
this.
|
|
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("../
|
|
359
|
+
* @returns {import("../paramRuntime/viewParamRuntime.js").default}
|
|
291
360
|
* @protected
|
|
292
361
|
*/
|
|
293
|
-
get
|
|
294
|
-
if (this.
|
|
295
|
-
|
|
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
|
|
370
|
+
throw new Error("Cannot find paramRuntime!");
|
|
300
371
|
}
|
|
301
|
-
return this.parent.
|
|
372
|
+
return this.parent.paramRuntime;
|
|
302
373
|
}
|
|
303
374
|
|
|
304
375
|
/**
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
*
|
|
3
|
-
* @returns {import("./flowNode.js").
|
|
3
|
+
* @returns {import("./flowNode.js").ParamRuntimeProvider}
|
|
4
4
|
*/
|
|
5
|
-
export function
|
|
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,
|
|
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"}
|