stream-charts 1.2.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +809 -1022
- package/changes.md +40 -0
- package/dist/app/charts/Chart.d.ts +35 -139
- package/dist/app/charts/Chart.d.ts.map +1 -0
- package/dist/app/charts/Chart.js +74 -65
- package/dist/app/charts/Chart.js.map +1 -1
- package/dist/app/charts/axes/AxesState.d.ts +26 -18
- package/dist/app/charts/axes/AxesState.d.ts.map +1 -0
- package/dist/app/charts/axes/AxesState.js +26 -24
- package/dist/app/charts/axes/AxesState.js.map +1 -1
- package/dist/app/charts/axes/AxisInterval.d.ts +44 -26
- package/dist/app/charts/axes/AxisInterval.d.ts.map +1 -0
- package/dist/app/charts/axes/AxisInterval.js +48 -29
- package/dist/app/charts/axes/AxisInterval.js.map +1 -1
- package/dist/app/charts/axes/BaseAxisRange.d.ts +46 -22
- package/dist/app/charts/axes/BaseAxisRange.d.ts.map +1 -0
- package/dist/app/charts/axes/BaseAxisRange.js +17 -12
- package/dist/app/charts/axes/BaseAxisRange.js.map +1 -1
- package/dist/app/charts/axes/ContinuousAxis.d.ts +47 -6
- package/dist/app/charts/axes/ContinuousAxis.d.ts.map +1 -0
- package/dist/app/charts/axes/ContinuousAxis.js +160 -27
- package/dist/app/charts/axes/ContinuousAxis.js.map +1 -1
- package/dist/app/charts/axes/ContinuousAxisRange.d.ts +29 -10
- package/dist/app/charts/axes/ContinuousAxisRange.d.ts.map +1 -0
- package/dist/app/charts/axes/ContinuousAxisRange.js +29 -11
- package/dist/app/charts/axes/ContinuousAxisRange.js.map +1 -1
- package/dist/app/charts/axes/EmptyAxis.d.ts +5 -2
- package/dist/app/charts/axes/EmptyAxis.d.ts.map +1 -0
- package/dist/app/charts/axes/EmptyAxis.js +30 -9
- package/dist/app/charts/axes/EmptyAxis.js.map +1 -1
- package/dist/app/charts/axes/OrdinalAxis.d.ts +5 -3
- package/dist/app/charts/axes/OrdinalAxis.d.ts.map +1 -0
- package/dist/app/charts/axes/OrdinalAxis.js +39 -16
- package/dist/app/charts/axes/OrdinalAxis.js.map +1 -1
- package/dist/app/charts/axes/OrdinalAxisRange.d.ts +76 -13
- package/dist/app/charts/axes/OrdinalAxisRange.d.ts.map +1 -0
- package/dist/app/charts/axes/OrdinalAxisRange.js +95 -16
- package/dist/app/charts/axes/OrdinalAxisRange.js.map +1 -1
- package/dist/app/charts/axes/autoScale.d.ts +111 -0
- package/dist/app/charts/axes/autoScale.d.ts.map +1 -0
- package/dist/app/charts/axes/autoScale.js +188 -0
- package/dist/app/charts/axes/autoScale.js.map +1 -0
- package/dist/app/charts/axes/axes.d.ts +273 -150
- package/dist/app/charts/axes/axes.d.ts.map +1 -0
- package/dist/app/charts/axes/axes.js +808 -583
- package/dist/app/charts/axes/axes.js.map +1 -1
- package/dist/app/charts/d3types.d.ts +40 -11
- package/dist/app/charts/d3types.d.ts.map +1 -0
- package/dist/app/charts/d3types.js +3 -0
- package/dist/app/charts/d3types.js.map +1 -1
- package/dist/app/charts/datasources/StreamingDataSource.d.ts +149 -0
- package/dist/app/charts/datasources/StreamingDataSource.d.ts.map +1 -0
- package/dist/app/charts/datasources/StreamingDataSource.js +110 -0
- package/dist/app/charts/datasources/StreamingDataSource.js.map +1 -0
- package/dist/app/charts/datasources/iteratesDataSource.d.ts +73 -0
- package/dist/app/charts/datasources/iteratesDataSource.d.ts.map +1 -0
- package/dist/app/charts/datasources/iteratesDataSource.js +87 -0
- package/dist/app/charts/datasources/iteratesDataSource.js.map +1 -0
- package/dist/app/charts/datasources/ordinalDataSource.d.ts +75 -0
- package/dist/app/charts/datasources/ordinalDataSource.d.ts.map +1 -0
- package/dist/app/charts/datasources/ordinalDataSource.js +135 -0
- package/dist/app/charts/datasources/ordinalDataSource.js.map +1 -0
- package/dist/app/charts/datasources/outlierDataSource.d.ts +53 -0
- package/dist/app/charts/datasources/outlierDataSource.d.ts.map +1 -0
- package/dist/app/charts/datasources/outlierDataSource.js +57 -0
- package/dist/app/charts/datasources/outlierDataSource.js.map +1 -0
- package/dist/app/charts/datasources/timeSeriesDataSource.d.ts +77 -0
- package/dist/app/charts/datasources/timeSeriesDataSource.d.ts.map +1 -0
- package/dist/app/charts/datasources/timeSeriesDataSource.js +85 -0
- package/dist/app/charts/datasources/timeSeriesDataSource.js.map +1 -0
- package/dist/app/charts/filters/regexFilter.d.ts +31 -4
- package/dist/app/charts/filters/regexFilter.d.ts.map +1 -0
- package/dist/app/charts/filters/regexFilter.js +38 -4
- package/dist/app/charts/filters/regexFilter.js.map +1 -1
- package/dist/app/charts/hooks/AxesProvider.d.ts +21 -0
- package/dist/app/charts/hooks/AxesProvider.d.ts.map +1 -0
- package/dist/app/charts/hooks/AxesProvider.js +213 -0
- package/dist/app/charts/hooks/AxesProvider.js.map +1 -0
- package/dist/app/charts/hooks/CanvasSurfaceProvider.d.ts +25 -0
- package/dist/app/charts/hooks/CanvasSurfaceProvider.d.ts.map +1 -0
- package/dist/app/charts/hooks/CanvasSurfaceProvider.js +76 -0
- package/dist/app/charts/hooks/CanvasSurfaceProvider.js.map +1 -0
- package/dist/app/charts/hooks/ChartProvider.d.ts +40 -0
- package/dist/app/charts/hooks/ChartProvider.d.ts.map +1 -0
- package/dist/app/charts/hooks/ChartProvider.js +33 -0
- package/dist/app/charts/hooks/ChartProvider.js.map +1 -0
- package/dist/app/charts/hooks/InteractionProvider.d.ts +23 -0
- package/dist/app/charts/hooks/InteractionProvider.d.ts.map +1 -0
- package/dist/app/charts/hooks/InteractionProvider.js +60 -0
- package/dist/app/charts/hooks/InteractionProvider.js.map +1 -0
- package/dist/app/charts/hooks/PlotDimensionsProvider.d.ts +16 -0
- package/dist/app/charts/hooks/PlotDimensionsProvider.d.ts.map +1 -0
- package/dist/app/charts/hooks/PlotDimensionsProvider.js +76 -0
- package/dist/app/charts/hooks/PlotDimensionsProvider.js.map +1 -0
- package/dist/app/charts/hooks/defaultAxesValues.d.ts +11 -0
- package/dist/app/charts/hooks/defaultAxesValues.d.ts.map +1 -0
- package/dist/app/charts/hooks/defaultAxesValues.js +36 -0
- package/dist/app/charts/hooks/defaultAxesValues.js.map +1 -0
- package/dist/app/charts/hooks/defaultMouseValues.d.ts +9 -0
- package/dist/app/charts/hooks/defaultMouseValues.d.ts.map +1 -0
- package/dist/app/charts/hooks/defaultMouseValues.js +23 -0
- package/dist/app/charts/hooks/defaultMouseValues.js.map +1 -0
- package/dist/app/charts/hooks/defaultPlotDimensions.d.ts +13 -0
- package/dist/app/charts/hooks/defaultPlotDimensions.d.ts.map +1 -0
- package/dist/app/charts/hooks/defaultPlotDimensions.js +23 -0
- package/dist/app/charts/hooks/defaultPlotDimensions.js.map +1 -0
- package/dist/app/charts/hooks/defaultTooltipValues.d.ts +9 -0
- package/dist/app/charts/hooks/defaultTooltipValues.d.ts.map +1 -0
- package/dist/app/charts/hooks/defaultTooltipValues.js +21 -0
- package/dist/app/charts/hooks/defaultTooltipValues.js.map +1 -0
- package/dist/app/charts/hooks/defaultUseChartValues.d.ts +14 -0
- package/dist/app/charts/hooks/defaultUseChartValues.d.ts.map +1 -0
- package/dist/app/charts/hooks/defaultUseChartValues.js +30 -0
- package/dist/app/charts/hooks/defaultUseChartValues.js.map +1 -0
- package/dist/app/charts/hooks/useAxes.d.ts +49 -36
- package/dist/app/charts/hooks/useAxes.d.ts.map +1 -0
- package/dist/app/charts/hooks/useAxes.js +16 -176
- package/dist/app/charts/hooks/useAxes.js.map +1 -1
- package/dist/app/charts/hooks/useCanvasSurface.d.ts +25 -0
- package/dist/app/charts/hooks/useCanvasSurface.d.ts.map +1 -0
- package/dist/app/charts/hooks/useCanvasSurface.js +18 -0
- package/dist/app/charts/hooks/useCanvasSurface.js.map +1 -0
- package/dist/app/charts/hooks/useChart.d.ts +30 -44
- package/dist/app/charts/hooks/useChart.d.ts.map +1 -0
- package/dist/app/charts/hooks/useChart.js +26 -48
- package/dist/app/charts/hooks/useChart.js.map +1 -1
- package/dist/app/charts/hooks/useDataSource.d.ts +68 -0
- package/dist/app/charts/hooks/useDataSource.d.ts.map +1 -0
- package/dist/app/charts/hooks/useDataSource.js +63 -0
- package/dist/app/charts/hooks/useDataSource.js.map +1 -0
- package/dist/app/charts/hooks/useHoveredSeries.d.ts +25 -0
- package/dist/app/charts/hooks/useHoveredSeries.d.ts.map +1 -0
- package/dist/app/charts/hooks/useHoveredSeries.js +15 -0
- package/dist/app/charts/hooks/useHoveredSeries.js.map +1 -0
- package/dist/app/charts/hooks/useMouse.d.ts +46 -22
- package/dist/app/charts/hooks/useMouse.d.ts.map +1 -0
- package/dist/app/charts/hooks/useMouse.js +12 -56
- package/dist/app/charts/hooks/useMouse.js.map +1 -1
- package/dist/app/charts/hooks/usePlotDimensions.d.ts +25 -13
- package/dist/app/charts/hooks/usePlotDimensions.d.ts.map +1 -0
- package/dist/app/charts/hooks/usePlotDimensions.js +6 -62
- package/dist/app/charts/hooks/usePlotDimensions.js.map +1 -1
- package/dist/app/charts/hooks/useTooltip.d.ts +24 -26
- package/dist/app/charts/hooks/useTooltip.d.ts.map +1 -0
- package/dist/app/charts/hooks/useTooltip.js +12 -42
- package/dist/app/charts/hooks/useTooltip.js.map +1 -1
- package/dist/app/charts/index.d.ts +66 -0
- package/dist/app/charts/index.d.ts.map +1 -0
- package/dist/app/charts/index.js +87 -0
- package/dist/app/charts/index.js.map +1 -0
- package/dist/app/charts/legends/Legend.d.ts +33 -12
- package/dist/app/charts/legends/Legend.d.ts.map +1 -0
- package/dist/app/charts/legends/Legend.js +138 -379
- package/dist/app/charts/legends/Legend.js.map +1 -1
- package/dist/app/charts/legends/constants.d.ts +19 -0
- package/dist/app/charts/legends/constants.d.ts.map +1 -0
- package/dist/app/charts/legends/constants.js +34 -0
- package/dist/app/charts/legends/constants.js.map +1 -0
- package/dist/app/charts/observables/ChartData.d.ts +1 -0
- package/dist/app/charts/observables/ChartData.d.ts.map +1 -0
- package/dist/app/charts/observables/iterates.d.ts +13 -7
- package/dist/app/charts/observables/iterates.d.ts.map +1 -0
- package/dist/app/charts/observables/iterates.js +42 -9
- package/dist/app/charts/observables/iterates.js.map +1 -1
- package/dist/app/charts/observables/ordinals.d.ts +70 -12
- package/dist/app/charts/observables/ordinals.d.ts.map +1 -0
- package/dist/app/charts/observables/ordinals.js +127 -48
- package/dist/app/charts/observables/ordinals.js.map +1 -1
- package/dist/app/charts/observables/outliers.d.ts +18 -0
- package/dist/app/charts/observables/outliers.d.ts.map +1 -0
- package/dist/app/charts/observables/outliers.js +2 -0
- package/dist/app/charts/observables/outliers.js.map +1 -0
- package/dist/app/charts/plots/BarPlot.d.ts +87 -13
- package/dist/app/charts/plots/BarPlot.d.ts.map +1 -0
- package/dist/app/charts/plots/BarPlot.js +603 -356
- package/dist/app/charts/plots/BarPlot.js.map +1 -1
- package/dist/app/charts/plots/OutlierPlot.d.ts +123 -0
- package/dist/app/charts/plots/OutlierPlot.d.ts.map +1 -0
- package/dist/app/charts/plots/OutlierPlot.js +430 -0
- package/dist/app/charts/plots/OutlierPlot.js.map +1 -0
- package/dist/app/charts/plots/PoincarePlot.d.ts +92 -14
- package/dist/app/charts/plots/PoincarePlot.d.ts.map +1 -0
- package/dist/app/charts/plots/PoincarePlot.js +523 -364
- package/dist/app/charts/plots/PoincarePlot.js.map +1 -1
- package/dist/app/charts/plots/RasterPlot.d.ts +31 -10
- package/dist/app/charts/plots/RasterPlot.d.ts.map +1 -0
- package/dist/app/charts/plots/RasterPlot.js +198 -306
- package/dist/app/charts/plots/RasterPlot.js.map +1 -1
- package/dist/app/charts/plots/ScatterPlot.d.ts +77 -21
- package/dist/app/charts/plots/ScatterPlot.d.ts.map +1 -0
- package/dist/app/charts/plots/ScatterPlot.js +359 -302
- package/dist/app/charts/plots/ScatterPlot.js.map +1 -1
- package/dist/app/charts/plots/autoScaleYAxes.d.ts +43 -0
- package/dist/app/charts/plots/autoScaleYAxes.d.ts.map +1 -0
- package/dist/app/charts/plots/autoScaleYAxes.js +71 -0
- package/dist/app/charts/plots/autoScaleYAxes.js.map +1 -0
- package/dist/app/charts/plots/colorizedLine.d.ts +61 -0
- package/dist/app/charts/plots/colorizedLine.d.ts.map +1 -0
- package/dist/app/charts/plots/colorizedLine.js +157 -0
- package/dist/app/charts/plots/colorizedLine.js.map +1 -0
- package/dist/app/charts/plots/constants.d.ts +7 -0
- package/dist/app/charts/plots/constants.d.ts.map +1 -0
- package/dist/app/charts/plots/constants.js +11 -0
- package/dist/app/charts/plots/constants.js.map +1 -0
- package/dist/app/charts/plots/hitTesting.d.ts +88 -0
- package/dist/app/charts/plots/hitTesting.d.ts.map +1 -0
- package/dist/app/charts/plots/hitTesting.js +136 -0
- package/dist/app/charts/plots/hitTesting.js.map +1 -0
- package/dist/app/charts/plots/plot.d.ts +52 -16
- package/dist/app/charts/plots/plot.d.ts.map +1 -0
- package/dist/app/charts/plots/plot.js +108 -35
- package/dist/app/charts/plots/plot.js.map +1 -1
- package/dist/app/charts/plots/useCanvasZoomPan.d.ts +119 -0
- package/dist/app/charts/plots/useCanvasZoomPan.d.ts.map +1 -0
- package/dist/app/charts/plots/useCanvasZoomPan.js +113 -0
- package/dist/app/charts/plots/useCanvasZoomPan.js.map +1 -0
- package/dist/app/charts/plots/useStreamingTimeAxes.d.ts +103 -0
- package/dist/app/charts/plots/useStreamingTimeAxes.d.ts.map +1 -0
- package/dist/app/charts/plots/useStreamingTimeAxes.js +257 -0
- package/dist/app/charts/plots/useStreamingTimeAxes.js.map +1 -0
- package/dist/app/charts/series/baseSeries.d.ts +60 -8
- package/dist/app/charts/series/baseSeries.d.ts.map +1 -0
- package/dist/app/charts/series/baseSeries.js +53 -8
- package/dist/app/charts/series/baseSeries.js.map +1 -1
- package/dist/app/charts/series/iterateSeries.d.ts +9 -8
- package/dist/app/charts/series/iterateSeries.d.ts.map +1 -0
- package/dist/app/charts/series/iterateSeries.js +7 -7
- package/dist/app/charts/series/iterateSeries.js.map +1 -1
- package/dist/app/charts/series/ordinalSeries.d.ts +27 -13
- package/dist/app/charts/series/ordinalSeries.d.ts.map +1 -0
- package/dist/app/charts/series/ordinalSeries.js +29 -15
- package/dist/app/charts/series/ordinalSeries.js.map +1 -1
- package/dist/app/charts/series/outlierSeries.d.ts +142 -0
- package/dist/app/charts/series/outlierSeries.d.ts.map +1 -0
- package/dist/app/charts/series/outlierSeries.js +82 -0
- package/dist/app/charts/series/outlierSeries.js.map +1 -0
- package/dist/app/charts/series/timeSeries.d.ts +13 -9
- package/dist/app/charts/series/timeSeries.d.ts.map +1 -0
- package/dist/app/charts/series/timeSeries.js +6 -3
- package/dist/app/charts/series/timeSeries.js.map +1 -1
- package/dist/app/charts/series/timeSeriesChartData.d.ts +18 -10
- package/dist/app/charts/series/timeSeriesChartData.d.ts.map +1 -0
- package/dist/app/charts/series/timeSeriesChartData.js +28 -14
- package/dist/app/charts/series/timeSeriesChartData.js.map +1 -1
- package/dist/app/charts/styling/barPlotStyle.d.ts +46 -2
- package/dist/app/charts/styling/barPlotStyle.d.ts.map +1 -0
- package/dist/app/charts/styling/barPlotStyle.js +37 -3
- package/dist/app/charts/styling/barPlotStyle.js.map +1 -1
- package/dist/app/charts/styling/canvasStyle.d.ts +53 -0
- package/dist/app/charts/styling/canvasStyle.d.ts.map +1 -0
- package/dist/app/charts/styling/canvasStyle.js +71 -0
- package/dist/app/charts/styling/canvasStyle.js.map +1 -0
- package/dist/app/charts/styling/margins.d.ts +21 -2
- package/dist/app/charts/styling/margins.d.ts.map +1 -0
- package/dist/app/charts/styling/margins.js +25 -4
- package/dist/app/charts/styling/margins.js.map +1 -1
- package/dist/app/charts/styling/svgStyle.d.ts +10 -56
- package/dist/app/charts/styling/svgStyle.d.ts.map +1 -0
- package/dist/app/charts/styling/svgStyle.js +3 -78
- package/dist/app/charts/styling/svgStyle.js.map +1 -1
- package/dist/app/charts/subscriptions/viewDrivers.d.ts +124 -0
- package/dist/app/charts/subscriptions/viewDrivers.d.ts.map +1 -0
- package/dist/app/charts/subscriptions/viewDrivers.js +338 -0
- package/dist/app/charts/subscriptions/viewDrivers.js.map +1 -0
- package/dist/app/charts/tooltips/BarPlotTooltipContent.d.ts +12 -78
- package/dist/app/charts/tooltips/BarPlotTooltipContent.d.ts.map +1 -0
- package/dist/app/charts/tooltips/BarPlotTooltipContent.js +65 -257
- package/dist/app/charts/tooltips/BarPlotTooltipContent.js.map +1 -1
- package/dist/app/charts/tooltips/DefaultOutlierTooltipContent.d.ts +9 -0
- package/dist/app/charts/tooltips/DefaultOutlierTooltipContent.d.ts.map +1 -0
- package/dist/app/charts/tooltips/DefaultOutlierTooltipContent.js +16 -0
- package/dist/app/charts/tooltips/DefaultOutlierTooltipContent.js.map +1 -0
- package/dist/app/charts/tooltips/OutlierPlotTooltipContent.d.ts +30 -0
- package/dist/app/charts/tooltips/OutlierPlotTooltipContent.d.ts.map +1 -0
- package/dist/app/charts/tooltips/OutlierPlotTooltipContent.js +26 -0
- package/dist/app/charts/tooltips/OutlierPlotTooltipContent.js.map +1 -0
- package/dist/app/charts/tooltips/PoincarePlotTooltipContent.d.ts +22 -72
- package/dist/app/charts/tooltips/PoincarePlotTooltipContent.d.ts.map +1 -0
- package/dist/app/charts/tooltips/PoincarePlotTooltipContent.js +104 -171
- package/dist/app/charts/tooltips/PoincarePlotTooltipContent.js.map +1 -1
- package/dist/app/charts/tooltips/RasterPlotTooltipContent.d.ts +32 -8
- package/dist/app/charts/tooltips/RasterPlotTooltipContent.d.ts.map +1 -0
- package/dist/app/charts/tooltips/RasterPlotTooltipContent.js +62 -115
- package/dist/app/charts/tooltips/RasterPlotTooltipContent.js.map +1 -1
- package/dist/app/charts/tooltips/ScatterPlotTooltipContent.d.ts +39 -12
- package/dist/app/charts/tooltips/ScatterPlotTooltipContent.d.ts.map +1 -0
- package/dist/app/charts/tooltips/ScatterPlotTooltipContent.js +162 -134
- package/dist/app/charts/tooltips/ScatterPlotTooltipContent.js.map +1 -1
- package/dist/app/charts/tooltips/Tooltip.d.ts +27 -32
- package/dist/app/charts/tooltips/Tooltip.d.ts.map +1 -0
- package/dist/app/charts/tooltips/Tooltip.js +37 -81
- package/dist/app/charts/tooltips/Tooltip.js.map +1 -1
- package/dist/app/charts/tooltips/TooltipContent.d.ts +81 -0
- package/dist/app/charts/tooltips/TooltipContent.d.ts.map +1 -0
- package/dist/app/charts/tooltips/TooltipContent.js +99 -0
- package/dist/app/charts/tooltips/TooltipContent.js.map +1 -0
- package/dist/app/charts/tooltips/tooltipUtils.d.ts +186 -36
- package/dist/app/charts/tooltips/tooltipUtils.d.ts.map +1 -0
- package/dist/app/charts/tooltips/tooltipUtils.js +277 -48
- package/dist/app/charts/tooltips/tooltipUtils.js.map +1 -1
- package/dist/app/charts/tooltips/useOutlierTooltip.d.ts +59 -0
- package/dist/app/charts/tooltips/useOutlierTooltip.d.ts.map +1 -0
- package/dist/app/charts/tooltips/useOutlierTooltip.js +16 -0
- package/dist/app/charts/tooltips/useOutlierTooltip.js.map +1 -0
- package/dist/app/charts/tooltips/useTooltipPlacement.d.ts +51 -0
- package/dist/app/charts/tooltips/useTooltipPlacement.d.ts.map +1 -0
- package/dist/app/charts/tooltips/useTooltipPlacement.js +52 -0
- package/dist/app/charts/tooltips/useTooltipPlacement.js.map +1 -0
- package/dist/app/charts/tooltips/useTooltipStyle.d.ts +11 -0
- package/dist/app/charts/tooltips/useTooltipStyle.d.ts.map +1 -0
- package/dist/app/charts/tooltips/useTooltipStyle.js +14 -0
- package/dist/app/charts/tooltips/useTooltipStyle.js.map +1 -0
- package/dist/app/charts/trackers/Tracker.d.ts +22 -6
- package/dist/app/charts/trackers/Tracker.d.ts.map +1 -0
- package/dist/app/charts/trackers/Tracker.js +36 -22
- package/dist/app/charts/trackers/Tracker.js.map +1 -1
- package/dist/app/charts/trackers/trackerUtils.d.ts +40 -18
- package/dist/app/charts/trackers/trackerUtils.d.ts.map +1 -0
- package/dist/app/charts/trackers/trackerUtils.js +213 -300
- package/dist/app/charts/trackers/trackerUtils.js.map +1 -1
- package/dist/app/charts/utils.d.ts +72 -33
- package/dist/app/charts/utils.d.ts.map +1 -0
- package/dist/app/charts/utils.js +87 -42
- package/dist/app/charts/utils.js.map +1 -1
- package/dist/index.d.ts +2 -45
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -72
- package/dist/index.js.map +1 -1
- package/package.json +87 -46
- package/src/app/charts/Chart.tsx +132 -168
- package/src/app/charts/axes/AxesState.ts +27 -29
- package/src/app/charts/axes/AxisInterval.ts +57 -32
- package/src/app/charts/axes/BaseAxisRange.ts +47 -27
- package/src/app/charts/axes/ContinuousAxis.tsx +235 -39
- package/src/app/charts/axes/ContinuousAxisRange.ts +29 -11
- package/src/app/charts/axes/EmptyAxis.tsx +52 -17
- package/src/app/charts/axes/OrdinalAxis.tsx +54 -28
- package/src/app/charts/axes/OrdinalAxisRange.ts +96 -16
- package/src/app/charts/axes/autoScale.ts +244 -0
- package/src/app/charts/axes/axes.ts +954 -735
- package/src/app/charts/d3types.ts +42 -13
- package/src/app/charts/datasources/StreamingDataSource.ts +214 -0
- package/src/app/charts/datasources/iteratesDataSource.ts +122 -0
- package/src/app/charts/datasources/ordinalDataSource.ts +205 -0
- package/src/app/charts/datasources/outlierDataSource.ts +90 -0
- package/src/app/charts/datasources/timeSeriesDataSource.ts +133 -0
- package/src/app/charts/filters/regexFilter.ts +45 -5
- package/src/app/charts/hooks/AxesProvider.tsx +301 -0
- package/src/app/charts/hooks/CanvasSurfaceProvider.tsx +117 -0
- package/src/app/charts/hooks/ChartProvider.tsx +79 -0
- package/src/app/charts/hooks/InteractionProvider.tsx +88 -0
- package/src/app/charts/hooks/PlotDimensionsProvider.tsx +109 -0
- package/src/app/charts/hooks/defaultAxesValues.ts +40 -0
- package/src/app/charts/hooks/defaultMouseValues.ts +24 -0
- package/src/app/charts/hooks/defaultPlotDimensions.ts +27 -0
- package/src/app/charts/hooks/defaultTooltipValues.tsx +23 -0
- package/src/app/charts/hooks/defaultUseChartValues.tsx +36 -0
- package/src/app/charts/hooks/useAxes.tsx +60 -228
- package/src/app/charts/hooks/useCanvasSurface.tsx +35 -0
- package/src/app/charts/hooks/useChart.tsx +47 -106
- package/src/app/charts/hooks/useDataSource.tsx +106 -0
- package/src/app/charts/hooks/useHoveredSeries.tsx +33 -0
- package/src/app/charts/hooks/useMouse.tsx +58 -82
- package/src/app/charts/hooks/usePlotDimensions.tsx +25 -89
- package/src/app/charts/hooks/useTooltip.tsx +32 -63
- package/src/app/charts/index.ts +213 -0
- package/src/app/charts/legends/Legend.tsx +198 -479
- package/src/app/charts/legends/constants.ts +37 -0
- package/src/app/charts/observables/iterates.ts +32 -12
- package/src/app/charts/observables/ordinals.ts +141 -67
- package/src/app/charts/observables/outliers.ts +20 -0
- package/src/app/charts/plots/BarPlot.tsx +784 -666
- package/src/app/charts/plots/OutlierPlot.tsx +685 -0
- package/src/app/charts/plots/PoincarePlot.tsx +707 -489
- package/src/app/charts/plots/RasterPlot.tsx +253 -445
- package/src/app/charts/plots/ScatterPlot.tsx +480 -463
- package/src/app/charts/plots/autoScaleYAxes.ts +102 -0
- package/src/app/charts/plots/colorizedLine.ts +185 -0
- package/src/app/charts/plots/constants.ts +16 -0
- package/src/app/charts/plots/hitTesting.ts +198 -0
- package/src/app/charts/plots/plot.ts +138 -44
- package/src/app/charts/plots/useCanvasZoomPan.ts +240 -0
- package/src/app/charts/plots/useStreamingTimeAxes.ts +384 -0
- package/src/app/charts/series/baseSeries.ts +81 -14
- package/src/app/charts/series/iterateSeries.ts +8 -8
- package/src/app/charts/series/ordinalSeries.ts +35 -20
- package/src/app/charts/series/outlierSeries.ts +188 -0
- package/src/app/charts/series/timeSeries.ts +14 -12
- package/src/app/charts/series/timeSeriesChartData.ts +31 -17
- package/src/app/charts/styling/barPlotStyle.ts +48 -5
- package/src/app/charts/styling/canvasStyle.ts +86 -0
- package/src/app/charts/styling/margins.ts +28 -4
- package/src/app/charts/styling/svgStyle.ts +10 -91
- package/src/app/charts/subscriptions/viewDrivers.ts +447 -0
- package/src/app/charts/tooltips/BarPlotTooltipContent.tsx +156 -380
- package/src/app/charts/tooltips/DefaultOutlierTooltipContent.tsx +40 -0
- package/src/app/charts/tooltips/OutlierPlotTooltipContent.tsx +67 -0
- package/src/app/charts/tooltips/PoincarePlotTooltipContent.tsx +229 -292
- package/src/app/charts/tooltips/RasterPlotTooltipContent.tsx +164 -217
- package/src/app/charts/tooltips/ScatterPlotTooltipContent.tsx +373 -236
- package/src/app/charts/tooltips/Tooltip.tsx +58 -124
- package/src/app/charts/tooltips/TooltipContent.tsx +177 -0
- package/src/app/charts/tooltips/tooltipUtils.ts +359 -61
- package/src/app/charts/tooltips/useOutlierTooltip.tsx +68 -0
- package/src/app/charts/tooltips/useTooltipPlacement.ts +86 -0
- package/src/app/charts/tooltips/useTooltipStyle.ts +15 -0
- package/src/app/charts/trackers/Tracker.tsx +68 -33
- package/src/app/charts/trackers/trackerUtils.ts +263 -376
- package/src/app/charts/utils.ts +90 -48
- package/src/index.ts +2 -322
- package/dist/app/charts/axes/AxesState.test.d.ts +0 -1
- package/dist/app/charts/axes/AxesState.test.js +0 -30
- package/dist/app/charts/axes/AxesState.test.js.map +0 -1
- package/dist/app/charts/axes/AxisInterval.test.d.ts +0 -1
- package/dist/app/charts/axes/AxisInterval.test.js +0 -120
- package/dist/app/charts/axes/AxisInterval.test.js.map +0 -1
- package/dist/app/charts/axes/ContinuousAxisRange.test.d.ts +0 -1
- package/dist/app/charts/axes/ContinuousAxisRange.test.js +0 -47
- package/dist/app/charts/axes/ContinuousAxisRange.test.js.map +0 -1
- package/dist/app/charts/axes/OrdinalAxisRange.test.d.ts +0 -1
- package/dist/app/charts/axes/OrdinalAxisRange.test.js +0 -48
- package/dist/app/charts/axes/OrdinalAxisRange.test.js.map +0 -1
- package/dist/app/charts/filters/regexFilter.test.d.ts +0 -1
- package/dist/app/charts/filters/regexFilter.test.js +0 -11
- package/dist/app/charts/filters/regexFilter.test.js.map +0 -1
- package/dist/app/charts/hooks/useDataObservable.d.ts +0 -72
- package/dist/app/charts/hooks/useDataObservable.js +0 -74
- package/dist/app/charts/hooks/useDataObservable.js.map +0 -1
- package/dist/app/charts/hooks/useInitialData.d.ts +0 -36
- package/dist/app/charts/hooks/useInitialData.js +0 -28
- package/dist/app/charts/hooks/useInitialData.js.map +0 -1
- package/dist/app/charts/observables/iterates.test.d.ts +0 -1
- package/dist/app/charts/observables/iterates.test.js +0 -180
- package/dist/app/charts/observables/iterates.test.js.map +0 -1
- package/dist/app/charts/observables/ordinals.test.d.ts +0 -1
- package/dist/app/charts/observables/ordinals.test.js +0 -102
- package/dist/app/charts/observables/ordinals.test.js.map +0 -1
- package/dist/app/charts/series/datumSeries.test.d.ts +0 -1
- package/dist/app/charts/series/datumSeries.test.js +0 -50
- package/dist/app/charts/series/datumSeries.test.js.map +0 -1
- package/dist/app/charts/styling/margins.test.d.ts +0 -1
- package/dist/app/charts/styling/margins.test.js +0 -19
- package/dist/app/charts/styling/margins.test.js.map +0 -1
- package/dist/app/charts/subscriptions/subscription.test.d.ts +0 -1
- package/dist/app/charts/subscriptions/subscription.test.js +0 -395
- package/dist/app/charts/subscriptions/subscription.test.js.map +0 -1
- package/dist/app/charts/subscriptions/subscriptions.d.ts +0 -100
- package/dist/app/charts/subscriptions/subscriptions.js +0 -449
- package/dist/app/charts/subscriptions/subscriptions.js.map +0 -1
- package/src/app/charts/axes/AxesState.test.ts +0 -34
- package/src/app/charts/axes/AxisInterval.test.ts +0 -143
- package/src/app/charts/axes/ContinuousAxisRange.test.ts +0 -55
- package/src/app/charts/axes/OrdinalAxisRange.test.ts +0 -55
- package/src/app/charts/filters/regexFilter.test.ts +0 -13
- package/src/app/charts/hooks/useDataObservable.tsx +0 -170
- package/src/app/charts/hooks/useInitialData.tsx +0 -64
- package/src/app/charts/observables/iterates.test.ts +0 -201
- package/src/app/charts/observables/ordinals.test.ts +0 -135
- package/src/app/charts/series/datumSeries.test.ts +0 -60
- package/src/app/charts/styling/margins.test.ts +0 -22
- package/src/app/charts/subscriptions/subscription.test.ts +0 -499
- package/src/app/charts/subscriptions/subscriptions.ts +0 -635
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef } from "react";
|
|
2
|
+
import * as d3 from "d3";
|
|
3
|
+
/**
|
|
4
|
+
* How far a wheel event scrolls (positive when scrolling down, toward you), scaled as d3-zoom's
|
|
5
|
+
* default `wheelDelta` scales it (which negates it, so that scrolling up raises the scale)
|
|
6
|
+
* @param event The wheel event
|
|
7
|
+
* @return The scroll amount, in d3-zoom's units
|
|
8
|
+
*/
|
|
9
|
+
function wheelDeltaOf(event) {
|
|
10
|
+
return event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * (event.ctrlKey ? 10 : 1);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Sets up panning (dragging) and zooming (the mouse wheel) on a plot's canvas, with d3's drag and
|
|
14
|
+
* zoom behaviors, and detaches them when the plot unmounts (or the canvas, or the settings they
|
|
15
|
+
* depend on, change).
|
|
16
|
+
*
|
|
17
|
+
* - Zooming only responds to wheel events (and, when required, only with the shift or ctrl key
|
|
18
|
+
* down): d3-zoom also handles mouse drags on its own, which would otherwise fire zoom events for
|
|
19
|
+
* the same gesture the dedicated drag behavior pans with.
|
|
20
|
+
* - d3-zoom's scale is cumulative; each zoom step is also handed to the plot as an incremental
|
|
21
|
+
* factor (relative to the previous step), which is reset whenever d3-zoom's transform is.
|
|
22
|
+
* - The handlers are always the plot's latest ones, so the behaviors needn't be re-attached when
|
|
23
|
+
* the handlers change.
|
|
24
|
+
* @param canvasContext The plot's canvas context (`null` until the canvas exists)
|
|
25
|
+
* @param options Whether panning and zooming are enabled, their extents, and the handlers
|
|
26
|
+
* @return The controls for d3-zoom's own transform (reset it, or set its scale)
|
|
27
|
+
*/
|
|
28
|
+
export function useCanvasZoomPan(canvasContext, options) {
|
|
29
|
+
const { panEnabled, zoomEnabled, keyModifiersRequired, scaleExtent: [minScale, maxScale], invertWheel = false, translateExtent: [[left, top], [right, bottom]], onZoomReset, } = options;
|
|
30
|
+
// the latest handlers (the behaviors call these, so they needn't be re-attached when they change)
|
|
31
|
+
const handlersRef = useRef(options);
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
handlersRef.current = options;
|
|
34
|
+
});
|
|
35
|
+
// d3-zoom's cumulative scale as of the previous zoom step, to turn its next one into an
|
|
36
|
+
// incremental factor
|
|
37
|
+
const lastKRef = useRef(1);
|
|
38
|
+
// the attached zoom behavior (undefined while zooming isn't set up)
|
|
39
|
+
const zoomRef = useRef(undefined);
|
|
40
|
+
const resetZoomTransform = useCallback(() => {
|
|
41
|
+
if (canvasContext !== null && zoomRef.current !== undefined) {
|
|
42
|
+
d3.select(canvasContext.canvas).call(zoomRef.current.transform, d3.zoomIdentity);
|
|
43
|
+
}
|
|
44
|
+
lastKRef.current = 1;
|
|
45
|
+
}, [canvasContext]);
|
|
46
|
+
const setZoomScale = useCallback((k) => {
|
|
47
|
+
if (canvasContext !== null) {
|
|
48
|
+
// (d3-zoom keeps an element's transform in its `__zoom` property)
|
|
49
|
+
d3.select(canvasContext.canvas).property("__zoom", d3.zoomIdentity.scale(k));
|
|
50
|
+
}
|
|
51
|
+
lastKRef.current = k;
|
|
52
|
+
}, [canvasContext]);
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
if (canvasContext === null)
|
|
55
|
+
return;
|
|
56
|
+
const canvasSelection = d3.select(canvasContext.canvas);
|
|
57
|
+
if (panEnabled) {
|
|
58
|
+
const drag = d3.drag()
|
|
59
|
+
.on("start", () => {
|
|
60
|
+
var _a, _b;
|
|
61
|
+
canvasSelection.style("cursor", "move");
|
|
62
|
+
(_b = (_a = handlersRef.current).onPanStart) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
63
|
+
})
|
|
64
|
+
.on("drag", event => handlersRef.current.onPan(event.dx, event.dy))
|
|
65
|
+
.on("end", () => {
|
|
66
|
+
var _a, _b;
|
|
67
|
+
canvasSelection.style("cursor", "auto");
|
|
68
|
+
(_b = (_a = handlersRef.current).onPanEnd) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
69
|
+
});
|
|
70
|
+
canvasSelection.call(drag);
|
|
71
|
+
}
|
|
72
|
+
if (zoomEnabled) {
|
|
73
|
+
const zoom = d3.zoom()
|
|
74
|
+
// wheel events only -- see the doc comment above
|
|
75
|
+
.filter(event => event.type === 'wheel' && (!keyModifiersRequired || event.shiftKey || event.ctrlKey))
|
|
76
|
+
// (the same gesture zooms every plot the same way -- see `invertWheel`)
|
|
77
|
+
.wheelDelta(event => (invertWheel ? 1 : -1) * wheelDeltaOf(event))
|
|
78
|
+
.scaleExtent([minScale, maxScale])
|
|
79
|
+
.translateExtent([[left, top], [right, bottom]])
|
|
80
|
+
.on("zoom", (event) => {
|
|
81
|
+
// a `null` source event means a programmatic change to the transform (e.g. a
|
|
82
|
+
// reset), not a user's gesture: there's nothing for the plot to do
|
|
83
|
+
if (event.sourceEvent === null)
|
|
84
|
+
return;
|
|
85
|
+
const k = event.transform.k;
|
|
86
|
+
const factor = k / lastKRef.current;
|
|
87
|
+
lastKRef.current = k;
|
|
88
|
+
const { offsetX, offsetY } = event.sourceEvent;
|
|
89
|
+
handlersRef.current.onZoom({ factor, k, x: offsetX, y: offsetY });
|
|
90
|
+
});
|
|
91
|
+
canvasSelection.call(zoom);
|
|
92
|
+
zoomRef.current = zoom;
|
|
93
|
+
onZoomReset === null || onZoomReset === void 0 ? void 0 : onZoomReset(() => {
|
|
94
|
+
var _a, _b;
|
|
95
|
+
resetZoomTransform();
|
|
96
|
+
(_b = (_a = handlersRef.current).resetView) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
return () => {
|
|
100
|
+
if (panEnabled)
|
|
101
|
+
canvasSelection.on(".drag", null);
|
|
102
|
+
if (zoomEnabled) {
|
|
103
|
+
canvasSelection.on(".zoom", null);
|
|
104
|
+
zoomRef.current = undefined;
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
}, [
|
|
108
|
+
canvasContext, panEnabled, zoomEnabled, keyModifiersRequired, invertWheel,
|
|
109
|
+
minScale, maxScale, left, top, right, bottom, onZoomReset, resetZoomTransform
|
|
110
|
+
]);
|
|
111
|
+
return { resetZoomTransform, setZoomScale };
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=useCanvasZoomPan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCanvasZoomPan.js","sourceRoot":"","sources":["../../../../src/app/charts/plots/useCanvasZoomPan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { type RefObject } from "react";
|
|
2
|
+
import type { CanvasContext } from "../d3types";
|
|
3
|
+
import type { StreamingDataSource } from "../datasources/StreamingDataSource";
|
|
4
|
+
import type { ChartData } from "../observables/ChartData";
|
|
5
|
+
import type { BaseSeries } from "../series/baseSeries";
|
|
6
|
+
import { type AxisTimesFor, TimeWindowBehavior } from "../subscriptions/viewDrivers";
|
|
7
|
+
import { type AxesAssignment } from "./plot";
|
|
8
|
+
/**
|
|
9
|
+
* The options for {@link useStreamingTimeAxes}
|
|
10
|
+
* @template CD The type of the chart data
|
|
11
|
+
* @template D The type of the series' datum
|
|
12
|
+
*/
|
|
13
|
+
export interface StreamingTimeAxesOptions<CD extends ChartData, D> {
|
|
14
|
+
/**
|
|
15
|
+
* The plot's canvas context (`null` until the canvas exists)
|
|
16
|
+
*/
|
|
17
|
+
canvasContext: CanvasContext | null;
|
|
18
|
+
/**
|
|
19
|
+
* The data source (and whether it's running)
|
|
20
|
+
*/
|
|
21
|
+
dataSource: StreamingDataSource<CD, D> | undefined;
|
|
22
|
+
running: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* The series the data source held when it was handed to the chart (see `useInitialData`)
|
|
25
|
+
*/
|
|
26
|
+
initialData: Array<BaseSeries<D>>;
|
|
27
|
+
/**
|
|
28
|
+
* The time of a datum (its x-value)
|
|
29
|
+
*/
|
|
30
|
+
timeOf: (datum: D) => number;
|
|
31
|
+
/**
|
|
32
|
+
* Gives the current time of each x-axis that a chunk of data has new points for (see
|
|
33
|
+
* `timeSeriesAxisTimes` and `outlierAxisTimes`)
|
|
34
|
+
*/
|
|
35
|
+
axisTimesFor: AxisTimesFor<CD>;
|
|
36
|
+
/**
|
|
37
|
+
* The assignment of the series to their x- and y-axes
|
|
38
|
+
*/
|
|
39
|
+
axisAssignments: Map<string, AxesAssignment>;
|
|
40
|
+
/**
|
|
41
|
+
* Draws the plot (registers its draw function with the canvas context, and requests a redraw)
|
|
42
|
+
*/
|
|
43
|
+
updatePlot: (canvasContext: CanvasContext) => void;
|
|
44
|
+
/**
|
|
45
|
+
* Resets the plot's own references to the data, when the data source is replaced -- called just
|
|
46
|
+
* before the axes are reset and the plot is redrawn
|
|
47
|
+
*/
|
|
48
|
+
onDataReset: () => void;
|
|
49
|
+
/**
|
|
50
|
+
* Whether the plot may show tooltips: when given, it's cleared while panning and while the data
|
|
51
|
+
* source is running, and restored afterward
|
|
52
|
+
*/
|
|
53
|
+
allowTooltipRef?: RefObject<boolean>;
|
|
54
|
+
/**
|
|
55
|
+
* Panning and zooming (see {@link useCanvasZoomPan})
|
|
56
|
+
*/
|
|
57
|
+
panEnabled: boolean;
|
|
58
|
+
zoomEnabled: boolean;
|
|
59
|
+
zoomKeyModifiersRequired: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* The plot's `onZoomReset` property (see {@link useCanvasZoomPan})
|
|
62
|
+
*/
|
|
63
|
+
onZoomReset?: (resetZoom: () => void) => void;
|
|
64
|
+
/**
|
|
65
|
+
* The time (ms) between cadence ticks (none, when undefined -- see `timeAxisViewDriverFor`)
|
|
66
|
+
*/
|
|
67
|
+
withCadenceOf?: number;
|
|
68
|
+
/**
|
|
69
|
+
* Whether the time axes scroll or squeeze as data passes their ends (defaults to SCROLL)
|
|
70
|
+
*/
|
|
71
|
+
timeWindowBehavior?: TimeWindowBehavior;
|
|
72
|
+
/**
|
|
73
|
+
* When true, the x- and y-axes of the hovered series are highlighted (in the series' own
|
|
74
|
+
* highlight color and width)
|
|
75
|
+
*/
|
|
76
|
+
highlightAxesOnMouseOver: boolean;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* The time (x-) axes of a streaming time plot (the scatter, raster, and outlier plots): keeps each
|
|
80
|
+
* x-axis's range in step with the data, and with the user's panning and zooming, and reports the
|
|
81
|
+
* ranges.
|
|
82
|
+
*
|
|
83
|
+
* - **The ranges.** One map of the x-axes' ranges, built once and mutated in place: the zoom and
|
|
84
|
+
* pan handlers, and the view driver, all work on the same map, so that neither undoes the
|
|
85
|
+
* other (the view driver hands its map back through `updateTimingAndPlot`, which re-points the
|
|
86
|
+
* map at it).
|
|
87
|
+
* - **The view driver.** While the data source runs, a view driver (see `timeAxisViewDriverFor`)
|
|
88
|
+
* advances the ranges as the data arrives (or with cadence), records each axis's current time,
|
|
89
|
+
* and redraws the plot. It belongs to this plot alone, and is torn down with it.
|
|
90
|
+
* - **Panning and zooming.** While running, the zoom pivots on each axis's current time ("now");
|
|
91
|
+
* while paused, on the mouse. A zoom reset restores the axes' original ranges (as captured when
|
|
92
|
+
* the data source was handed to the plot).
|
|
93
|
+
* - **Reporting.** The axes' intervals are reported to the chart's `onUpdateAxesBounds` (at most
|
|
94
|
+
* once per animation frame, since zooming and panning fire many events).
|
|
95
|
+
* - **A new data source** (new initial data) resets the plot's data, the axes' ranges (starting at
|
|
96
|
+
* the data's first time), and the original ranges a zoom reset restores.
|
|
97
|
+
* - **Highlighting.** Optionally, highlights the hovered series' axes.
|
|
98
|
+
* @param options The plot's canvas, data, handlers, and settings
|
|
99
|
+
* @template CD The type of the chart data
|
|
100
|
+
* @template D The type of the series' datum
|
|
101
|
+
*/
|
|
102
|
+
export declare function useStreamingTimeAxes<CD extends ChartData, D>(options: StreamingTimeAxesOptions<CD, D>): void;
|
|
103
|
+
//# sourceMappingURL=useStreamingTimeAxes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStreamingTimeAxes.d.ts","sourceRoot":"","sources":["../../../../src/app/charts/plots/useStreamingTimeAxes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,SAAS,EAA0D,MAAM,OAAO,CAAC;AAc9F,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,oCAAoC,CAAC;AAK5E,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAC,KAAK,YAAY,EAAyB,kBAAkB,EAAC,MAAM,8BAA8B,CAAC;AAE1G,OAAO,EAAC,KAAK,cAAc,EAAuB,MAAM,QAAQ,CAAC;AAGjE;;;;GAIG;AACH,MAAM,WAAW,wBAAwB,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IAC7D;;OAEG;IACH,aAAa,EAAE,aAAa,GAAG,IAAI,CAAA;IACnC;;OAEG;IACH,UAAU,EAAE,mBAAmB,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,SAAS,CAAA;IAClD,OAAO,EAAE,OAAO,CAAA;IAChB;;OAEG;IACH,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;IACjC;;OAEG;IACH,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAA;IAC5B;;;OAGG;IACH,YAAY,EAAE,YAAY,CAAC,EAAE,CAAC,CAAA;IAC9B;;OAEG;IACH,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IAC5C;;OAEG;IACH,UAAU,EAAE,CAAC,aAAa,EAAE,aAAa,KAAK,IAAI,CAAA;IAClD;;;OAGG;IACH,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB;;;OAGG;IACH,eAAe,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAA;IACpC;;OAEG;IACH,UAAU,EAAE,OAAO,CAAA;IACnB,WAAW,EAAE,OAAO,CAAA;IACpB,wBAAwB,EAAE,OAAO,CAAA;IACjC;;OAEG;IACH,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,IAAI,KAAK,IAAI,CAAA;IAC7C;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;IACvC;;;OAGG;IACH,wBAAwB,EAAE,OAAO,CAAA;CACpC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,wBAAwB,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAqQ5G"}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { useCallback, useEffect, useEffectEvent, useMemo, useRef } from "react";
|
|
2
|
+
import { Optional } from "result-fn";
|
|
3
|
+
import { axesForSeriesGen, continuousAxisIntervals, continuousAxisRanges, continuousAxisZoomHandler, defaultLineStyle, panHandler, } from "../axes/axes";
|
|
4
|
+
import { AxisInterval } from "../axes/AxisInterval";
|
|
5
|
+
import { ContinuousAxisRange } from "../axes/ContinuousAxisRange";
|
|
6
|
+
import { useChart } from "../hooks/useChart";
|
|
7
|
+
import { useHoveredSeries } from "../hooks/useHoveredSeries";
|
|
8
|
+
import { usePlotDimensions } from "../hooks/usePlotDimensions";
|
|
9
|
+
import { useStreamingSettings } from "../hooks/useDataSource";
|
|
10
|
+
import { timeAxisViewDriverFor, TimeWindowBehavior } from "../subscriptions/viewDrivers";
|
|
11
|
+
import { noop } from "../utils";
|
|
12
|
+
import { currentIntervalsFrom } from "./plot";
|
|
13
|
+
import { useCanvasZoomPan } from "./useCanvasZoomPan";
|
|
14
|
+
/**
|
|
15
|
+
* The time (x-) axes of a streaming time plot (the scatter, raster, and outlier plots): keeps each
|
|
16
|
+
* x-axis's range in step with the data, and with the user's panning and zooming, and reports the
|
|
17
|
+
* ranges.
|
|
18
|
+
*
|
|
19
|
+
* - **The ranges.** One map of the x-axes' ranges, built once and mutated in place: the zoom and
|
|
20
|
+
* pan handlers, and the view driver, all work on the same map, so that neither undoes the
|
|
21
|
+
* other (the view driver hands its map back through `updateTimingAndPlot`, which re-points the
|
|
22
|
+
* map at it).
|
|
23
|
+
* - **The view driver.** While the data source runs, a view driver (see `timeAxisViewDriverFor`)
|
|
24
|
+
* advances the ranges as the data arrives (or with cadence), records each axis's current time,
|
|
25
|
+
* and redraws the plot. It belongs to this plot alone, and is torn down with it.
|
|
26
|
+
* - **Panning and zooming.** While running, the zoom pivots on each axis's current time ("now");
|
|
27
|
+
* while paused, on the mouse. A zoom reset restores the axes' original ranges (as captured when
|
|
28
|
+
* the data source was handed to the plot).
|
|
29
|
+
* - **Reporting.** The axes' intervals are reported to the chart's `onUpdateAxesBounds` (at most
|
|
30
|
+
* once per animation frame, since zooming and panning fire many events).
|
|
31
|
+
* - **A new data source** (new initial data) resets the plot's data, the axes' ranges (starting at
|
|
32
|
+
* the data's first time), and the original ranges a zoom reset restores.
|
|
33
|
+
* - **Highlighting.** Optionally, highlights the hovered series' axes.
|
|
34
|
+
* @param options The plot's canvas, data, handlers, and settings
|
|
35
|
+
* @template CD The type of the chart data
|
|
36
|
+
* @template D The type of the series' datum
|
|
37
|
+
*/
|
|
38
|
+
export function useStreamingTimeAxes(options) {
|
|
39
|
+
const { canvasContext, dataSource, running, initialData, timeOf, axisTimesFor, axisAssignments, updatePlot, onDataReset, allowTooltipRef, panEnabled, zoomEnabled, zoomKeyModifiersRequired, onZoomReset, withCadenceOf, timeWindowBehavior = TimeWindowBehavior.SCROLL, highlightAxesOnMouseOver, } = options;
|
|
40
|
+
const { chartId, color, axes, seriesStyles } = useChart();
|
|
41
|
+
const { xAxesState, yAxesState, setAxisIntervalFor, updateAxisRanges = noop, onUpdateAxesInterval } = axes;
|
|
42
|
+
const { plotDimensions, margin } = usePlotDimensions();
|
|
43
|
+
const { windowingTime, dataUpdatePeriod } = useStreamingSettings();
|
|
44
|
+
const { hoveredSeriesName } = useHoveredSeries();
|
|
45
|
+
// the x-axes' ranges: built once, and mutated in place by the zoom and pan handlers (and
|
|
46
|
+
// re-pointed at the view driver's map by `updateTimingAndPlot`)
|
|
47
|
+
const timeRangesRef = useRef(new Map());
|
|
48
|
+
// map(axis_id -> current_time), recorded by the view driver; the zoom pivots on it while
|
|
49
|
+
// running. Empty (rather than 0 per axis) until the driver records a time, so that the zoom
|
|
50
|
+
// pivot falls back to the axis' own domain
|
|
51
|
+
const currentTimeRef = useRef(new Map());
|
|
52
|
+
// the axes' true original (un-zoomed) bounds, which a zoom reset restores, and each axis' pinned
|
|
53
|
+
// start time for SQUEEZE -- captured when the data source is handed to the plot (see
|
|
54
|
+
// `resetForNewData`), rather than via a `useMemo` on the axes context, which re-samples the
|
|
55
|
+
// ranges' `.original` as auto-scroll moves it
|
|
56
|
+
const initialAxisIntervalsRef = useRef(new Map());
|
|
57
|
+
const initialTimesRef = useRef(new Map());
|
|
58
|
+
// the latest draw and axis-range-update functions (called from the view driver, and the zoom
|
|
59
|
+
// and pan handlers)
|
|
60
|
+
const updatePlotRef = useRef(updatePlot);
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
updatePlotRef.current = updatePlot;
|
|
63
|
+
}, [updatePlot]);
|
|
64
|
+
const updateAxisRangesRef = useRef(updateAxisRanges);
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
updateAxisRangesRef.current = updateAxisRanges;
|
|
67
|
+
}, [updateAxisRanges]);
|
|
68
|
+
// reports the axes' intervals to the chart's `onUpdateAxesBounds`, at most once per animation
|
|
69
|
+
// frame (zooming and panning fire many events per gesture, and the callback generally updates
|
|
70
|
+
// the application's state). Coalescing loses nothing: the deferred notification reports the
|
|
71
|
+
// *latest* ranges (`pendingRangesRef`), not those of the call that scheduled it -- the ranges
|
|
72
|
+
// map is sometimes replaced (e.g. on a reset), and reporting a stale map would write stale
|
|
73
|
+
// intervals into the application's state.
|
|
74
|
+
const notifyIntervalsRef = useRef(noop);
|
|
75
|
+
const notifyFrameRef = useRef(0);
|
|
76
|
+
const pendingRangesRef = useRef(new Map());
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
notifyIntervalsRef.current = onUpdateAxesInterval === undefined ?
|
|
79
|
+
noop :
|
|
80
|
+
ranges => {
|
|
81
|
+
pendingRangesRef.current = ranges;
|
|
82
|
+
if (notifyFrameRef.current !== 0)
|
|
83
|
+
return;
|
|
84
|
+
notifyFrameRef.current = requestAnimationFrame(() => {
|
|
85
|
+
notifyFrameRef.current = 0;
|
|
86
|
+
onUpdateAxesInterval(currentIntervalsFrom(pendingRangesRef.current));
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
}, [onUpdateAxesInterval]);
|
|
90
|
+
// don't leave a scheduled notification pointing at an unmounted plot
|
|
91
|
+
useEffect(() => () => {
|
|
92
|
+
if (notifyFrameRef.current !== 0) {
|
|
93
|
+
cancelAnimationFrame(notifyFrameRef.current);
|
|
94
|
+
notifyFrameRef.current = 0;
|
|
95
|
+
}
|
|
96
|
+
}, []);
|
|
97
|
+
// new x-axes: forget the current times (see `currentTimeRef`)
|
|
98
|
+
useEffect(() => {
|
|
99
|
+
currentTimeRef.current = new Map();
|
|
100
|
+
}, [xAxesState]);
|
|
101
|
+
// highlights the hovered series' x- and y-axes, and un-highlights them (in the effect's
|
|
102
|
+
// cleanup) when the hover moves to a different series, or ends
|
|
103
|
+
useEffect(() => {
|
|
104
|
+
if (!highlightAxesOnMouseOver || hoveredSeriesName === null)
|
|
105
|
+
return;
|
|
106
|
+
const assignment = axisAssignments.get(hoveredSeriesName);
|
|
107
|
+
const xAxis = xAxesState.axisFor((assignment === null || assignment === void 0 ? void 0 : assignment.xAxis) || "").getOrUndefined();
|
|
108
|
+
const yAxis = yAxesState.axisFor((assignment === null || assignment === void 0 ? void 0 : assignment.yAxis) || "").getOrUndefined();
|
|
109
|
+
const { highlightColor, highlightWidth } = seriesStyles.get(hoveredSeriesName) || defaultLineStyle();
|
|
110
|
+
xAxis === null || xAxis === void 0 ? void 0 : xAxis.setHighlighted(true, highlightColor, highlightWidth);
|
|
111
|
+
yAxis === null || yAxis === void 0 ? void 0 : yAxis.setHighlighted(true, highlightColor, highlightWidth);
|
|
112
|
+
return () => {
|
|
113
|
+
xAxis === null || xAxis === void 0 ? void 0 : xAxis.setHighlighted(false);
|
|
114
|
+
yAxis === null || yAxis === void 0 ? void 0 : yAxis.setHighlighted(false);
|
|
115
|
+
};
|
|
116
|
+
}, [highlightAxesOnMouseOver, hoveredSeriesName, axisAssignments, xAxesState, yAxesState, seriesStyles]);
|
|
117
|
+
// the distinct x-axes that the series use
|
|
118
|
+
const axesForSeries = useMemo(() => axesForSeriesGen(initialData, axisAssignments, xAxesState), [initialData, axisAssignments, xAxesState]);
|
|
119
|
+
// hands new ranges to the axes, makes them the plot's ranges (see `timeRangesRef`), redraws the
|
|
120
|
+
// plot, and reports the axes' intervals
|
|
121
|
+
const updateTimingAndPlot = useCallback((ranges) => {
|
|
122
|
+
if (canvasContext === null)
|
|
123
|
+
return;
|
|
124
|
+
updateAxisRangesRef.current(ranges);
|
|
125
|
+
timeRangesRef.current = ranges;
|
|
126
|
+
updatePlotRef.current(canvasContext);
|
|
127
|
+
notifyIntervalsRef.current(ranges);
|
|
128
|
+
}, [canvasContext]);
|
|
129
|
+
// a new data source (new initial data): resets the plot's data, the current times, and the
|
|
130
|
+
// original bounds (for a zoom reset), and starts each axis at the data's first time. (An effect
|
|
131
|
+
// event, so that it runs only when the initial data changes, with the latest everything else.)
|
|
132
|
+
const resetForNewData = useEffectEvent(() => {
|
|
133
|
+
onDataReset();
|
|
134
|
+
currentTimeRef.current = new Map();
|
|
135
|
+
const freshRanges = continuousAxisRanges(xAxesState.axes);
|
|
136
|
+
initialAxisIntervalsRef.current = new Map(Array.from(freshRanges.entries()).map(([id, range]) => [id, range.original.asTuple()]));
|
|
137
|
+
initialTimesRef.current = new Map(Array.from(freshRanges.entries()).map(([id, range]) => [id, range.original.start]));
|
|
138
|
+
updateTimingAndPlot(new Map(Array.from(freshRanges.entries()).map(([id, range]) => {
|
|
139
|
+
const [start, end] = range.original.asTuple();
|
|
140
|
+
const firstTime = initialData
|
|
141
|
+
.filter(series => { var _a; return ((_a = axisAssignments.get(series.name)) === null || _a === void 0 ? void 0 : _a.xAxis) === id; })
|
|
142
|
+
.reduce((tMin, series) => Math.min(tMin, !series.isEmpty() ? timeOf(series.data[0]) : tMin), Infinity);
|
|
143
|
+
const startTime = firstTime === Infinity ? 0 : firstTime;
|
|
144
|
+
return [id, ContinuousAxisRange.from(startTime, startTime + end - start)];
|
|
145
|
+
})));
|
|
146
|
+
});
|
|
147
|
+
useEffect(() => {
|
|
148
|
+
resetForNewData();
|
|
149
|
+
}, [initialData]);
|
|
150
|
+
// pans the axes (in place) by the dragged amount
|
|
151
|
+
const onPan = useCallback((x, ranges) => panHandler(axesForSeries, margin, setAxisIntervalFor, xAxesState)(x, plotDimensions, ranges), [axesForSeries, margin, setAxisIntervalFor, xAxesState, plotDimensions]);
|
|
152
|
+
// zooms the axes (in place) by the incremental zoom factor, around each axis's pivot
|
|
153
|
+
const onZoom = useCallback((zoomFactor, pivotFor, ranges) => continuousAxisZoomHandler(axesForSeries, margin, setAxisIntervalFor, xAxesState)(zoomFactor, pivotFor, plotDimensions, ranges), [axesForSeries, margin, setAxisIntervalFor, xAxesState, plotDimensions]);
|
|
154
|
+
// what the zoom pivots on: while running, each axis's "now" (so the newest data stays put,
|
|
155
|
+
// whether or not the axis has started scrolling yet -- falling back to the axis' right edge
|
|
156
|
+
// until the view driver records a time); while paused, the mouse
|
|
157
|
+
const zoomPivotFor = useCallback((offsetX) => running ?
|
|
158
|
+
(axisId, axis) => { var _a; return (_a = currentTimeRef.current.get(axisId)) !== null && _a !== void 0 ? _a : axis.scale.domain()[1]; } :
|
|
159
|
+
(_axisId, axis) => axis.scale.invert(offsetX - margin.left), [running, margin]);
|
|
160
|
+
useCanvasZoomPan(canvasContext, {
|
|
161
|
+
panEnabled,
|
|
162
|
+
zoomEnabled,
|
|
163
|
+
keyModifiersRequired: zoomKeyModifiersRequired,
|
|
164
|
+
scaleExtent: [0, 10],
|
|
165
|
+
translateExtent: [[margin.left, margin.top], [plotDimensions.width, plotDimensions.height]],
|
|
166
|
+
// (tooltips are suppressed while panning, so that one isn't left behind)
|
|
167
|
+
onPanStart: () => {
|
|
168
|
+
if (allowTooltipRef !== undefined)
|
|
169
|
+
allowTooltipRef.current = false;
|
|
170
|
+
},
|
|
171
|
+
onPan: dx => {
|
|
172
|
+
if (canvasContext === null)
|
|
173
|
+
return;
|
|
174
|
+
onPan(dx, timeRangesRef.current);
|
|
175
|
+
updatePlotRef.current(canvasContext);
|
|
176
|
+
// the pan updated the axes' ranges in place, so report the new intervals
|
|
177
|
+
notifyIntervalsRef.current(timeRangesRef.current);
|
|
178
|
+
},
|
|
179
|
+
onPanEnd: () => {
|
|
180
|
+
var _a;
|
|
181
|
+
if (allowTooltipRef !== undefined)
|
|
182
|
+
allowTooltipRef.current = !((_a = dataSource === null || dataSource === void 0 ? void 0 : dataSource.running) !== null && _a !== void 0 ? _a : false);
|
|
183
|
+
},
|
|
184
|
+
onZoom: ({ factor, x }) => {
|
|
185
|
+
if (canvasContext === null)
|
|
186
|
+
return;
|
|
187
|
+
onZoom(factor, zoomPivotFor(x), timeRangesRef.current);
|
|
188
|
+
updatePlotRef.current(canvasContext);
|
|
189
|
+
// the zoom updated the axes' ranges in place, so report the new intervals
|
|
190
|
+
notifyIntervalsRef.current(timeRangesRef.current);
|
|
191
|
+
},
|
|
192
|
+
onZoomReset,
|
|
193
|
+
// restores each axis to its true original bounds (see `initialAxisIntervalsRef`), and does
|
|
194
|
+
// a full sync (through `updateTimingAndPlot`), so that the AxesProvider's own ranges pick up
|
|
195
|
+
// the reset `.original` too -- otherwise a reset while paused (with no ticks left to resync
|
|
196
|
+
// them) would leave them at the zoomed bounds, which a store-backed domain then reads back
|
|
197
|
+
resetView: () => {
|
|
198
|
+
initialAxisIntervalsRef.current.forEach(([start, end], axisId) => {
|
|
199
|
+
timeRangesRef.current.set(axisId, ContinuousAxisRange.from(start, end));
|
|
200
|
+
xAxesState.axisFor(axisId).ifPresent(axis => axis.update(AxisInterval.from(start, end), plotDimensions, margin));
|
|
201
|
+
});
|
|
202
|
+
updateTimingAndPlot(timeRangesRef.current);
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
// keeps the ranges in step with the axes when the canvas, the axes, or the plot's dimensions
|
|
206
|
+
// change (creating them the first time, and afterward updating them in place, so that their
|
|
207
|
+
// `.original` -- and the map's identity -- survive), and redraws
|
|
208
|
+
useEffect(() => {
|
|
209
|
+
if (canvasContext === null)
|
|
210
|
+
return;
|
|
211
|
+
if (timeRangesRef.current.size === 0) {
|
|
212
|
+
continuousAxisRanges(xAxesState.axes).forEach((range, id) => timeRangesRef.current.set(id, range));
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
const intervals = continuousAxisIntervals(xAxesState.axes);
|
|
216
|
+
timeRangesRef.current.forEach((range, id, rangesMap) => {
|
|
217
|
+
const [start, end] = Optional.ofNullable(intervals.get(id))
|
|
218
|
+
.map(interval => interval.asTuple())
|
|
219
|
+
.getOrThrow(() => new Error(`Unable to retrieve interval for axis; axis_id: ${id}`));
|
|
220
|
+
if (!isNaN(start) && !isNaN(end)) {
|
|
221
|
+
rangesMap.set(id, range.update(start, end));
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
updatePlot(canvasContext);
|
|
226
|
+
}, [chartId, color, canvasContext, plotDimensions, updatePlot, xAxesState]);
|
|
227
|
+
// the latest `updateTimingAndPlot`, for the view driver (created once per run) to call
|
|
228
|
+
const updateTimingAndPlotRef = useRef(updateTimingAndPlot);
|
|
229
|
+
useEffect(() => {
|
|
230
|
+
updateTimingAndPlotRef.current = updateTimingAndPlot;
|
|
231
|
+
}, [updateTimingAndPlot]);
|
|
232
|
+
// creates the view driver, with the current settings (an effect event, so that the driver is
|
|
233
|
+
// created only when the run starts, with the settings as they are then)
|
|
234
|
+
const createViewDriver = useEffectEvent((source) => timeAxisViewDriverFor(source, xAxesState, axisTimesFor, ranges => updateTimingAndPlotRef.current(ranges), (axisId, end) => currentTimeRef.current.set(axisId, end), {
|
|
235
|
+
windowingTime,
|
|
236
|
+
dataUpdatePeriod,
|
|
237
|
+
cadencePeriod: withCadenceOf,
|
|
238
|
+
timeWindowBehavior,
|
|
239
|
+
initialTimes: initialTimesRef.current,
|
|
240
|
+
}));
|
|
241
|
+
// while the data source runs (and the plot has a canvas and x-axes), drives the view from the
|
|
242
|
+
// data source's updates. The driver belongs to this plot alone, and is always torn down with it.
|
|
243
|
+
const hasXAxes = xAxesState.axes.size > 0;
|
|
244
|
+
useEffect(() => {
|
|
245
|
+
if (dataSource === undefined || !running || canvasContext === null || !hasXAxes)
|
|
246
|
+
return;
|
|
247
|
+
if (allowTooltipRef !== undefined)
|
|
248
|
+
allowTooltipRef.current = false;
|
|
249
|
+
const driver = createViewDriver(dataSource);
|
|
250
|
+
return () => {
|
|
251
|
+
driver.unsubscribe();
|
|
252
|
+
if (allowTooltipRef !== undefined)
|
|
253
|
+
allowTooltipRef.current = true;
|
|
254
|
+
};
|
|
255
|
+
}, [dataSource, running, canvasContext, hasXAxes, allowTooltipRef]);
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=useStreamingTimeAxes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStreamingTimeAxes.js","sourceRoot":"","sources":["../../../../src/app/charts/plots/useStreamingTimeAxes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,38 +1,90 @@
|
|
|
1
|
-
import { Result } from "result-fn";
|
|
1
|
+
import { type Result } from "result-fn";
|
|
2
|
+
import { FastShiftArray } from "fast-shift-array";
|
|
2
3
|
/**
|
|
3
|
-
* A
|
|
4
|
-
*
|
|
4
|
+
* A named series of data, the basis of every chart's series. Its data is held in a
|
|
5
|
+
* `FastShiftArray`, so that the oldest data can be dropped from its head cheaply as new data
|
|
6
|
+
* streams in.
|
|
7
|
+
* @template D The type of the series' datum
|
|
5
8
|
*/
|
|
6
9
|
export interface BaseSeries<D> {
|
|
10
|
+
/**
|
|
11
|
+
* The name of the series (unique within a chart)
|
|
12
|
+
*/
|
|
7
13
|
readonly name: string;
|
|
8
|
-
|
|
14
|
+
/**
|
|
15
|
+
* The series' data, ordered by time
|
|
16
|
+
*/
|
|
17
|
+
data: FastShiftArray<D>;
|
|
18
|
+
/**
|
|
19
|
+
* @return The last datum, or a failure when the series is empty
|
|
20
|
+
*/
|
|
9
21
|
readonly last: () => Result<D, string>;
|
|
22
|
+
/**
|
|
23
|
+
* @return The number of data in the series
|
|
24
|
+
*/
|
|
10
25
|
readonly length: () => number;
|
|
26
|
+
/**
|
|
27
|
+
* @return `true` when the series has no data; `false` otherwise
|
|
28
|
+
*/
|
|
11
29
|
readonly isEmpty: () => boolean;
|
|
12
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Default number of shifts a series' backing `FastShiftArray` accumulates before it's compacted,
|
|
33
|
+
* used whenever a caller doesn't specify one explicitly. This is deliberately much lower than
|
|
34
|
+
* `FastShiftArray`'s own default of 100,000: compaction is a single, blocking O(n) operation (it
|
|
35
|
+
* splices out all the accumulated dead slots in one call), so with the default threshold, a
|
|
36
|
+
* long-running streaming chart hits one large, very perceptible stutter once cumulative shifts
|
|
37
|
+
* cross 100,000 -- visible as a sudden jump/lag rather than a gradual slowdown. Compacting more
|
|
38
|
+
* often, on a much smaller batch each time, trades that one large pause for many much smaller
|
|
39
|
+
* (and much less noticeable) ones spread across the session.
|
|
40
|
+
*
|
|
41
|
+
* If a particular use case genuinely prefers fewer, larger pauses (e.g. a non-interactive/batch
|
|
42
|
+
* context where per-call overhead matters more than pause smoothness), pass a larger
|
|
43
|
+
* `compactingSize` explicitly to `seriesFrom`/`emptySeries`/`emptySeriesFor`.
|
|
44
|
+
*/
|
|
45
|
+
export declare const DEFAULT_COMPACTING_SIZE = 10000;
|
|
13
46
|
/**
|
|
14
47
|
* Creates a series from the name and the optional array of `Datum`.
|
|
48
|
+
*
|
|
49
|
+
* **Ownership warning:** when `data` is a plain array (or already a {@link FastShiftArray}), it is
|
|
50
|
+
* wrapped **by reference**, not copied -- the returned series' backing storage *is* that same
|
|
51
|
+
* array/`FastShiftArray`. As the chart streams in new data and ages old data out, the library calls
|
|
52
|
+
* `shift()` on it (clearing the head slot, and periodically `splice`-ing it during compaction),
|
|
53
|
+
* mutating it in place. If you keep your own reference to the array you pass in (to reuse,
|
|
54
|
+
* snapshot, or compare later), you will see it change out from under you. If you need an
|
|
55
|
+
* independent copy, pass `data.slice()` instead -- see e.g. `StreamingBarChart.tsx`,
|
|
56
|
+
* `StreamingRasterChart.tsx`, and `StreamingPoincareChart.tsx`, which all do this when re-deriving
|
|
57
|
+
* initial series from data they still hold a reference to elsewhere.
|
|
15
58
|
* @param name The name of the series (i.e. neuron)
|
|
16
59
|
* @param data The array of datum, which could be `(t, f(t))`, or `(f[n](x), f[n+1](x))`
|
|
17
|
-
* @
|
|
60
|
+
* @param compactingSize The number of shifts the series' backing array accumulates before it's
|
|
61
|
+
* compacted (see {@link DEFAULT_COMPACTING_SIZE}). Only applies when `data` is a plain array (and
|
|
62
|
+
* so a new `FastShiftArray` is created for it) -- ignored when `data` is already a `FastShiftArray`,
|
|
63
|
+
* since compaction size is fixed at that instance's own construction time.
|
|
64
|
+
* @return A {@link BaseSeries} that can be used in {@link Chart}s
|
|
18
65
|
* @see seriesFromTuples
|
|
19
66
|
* @see emptySeries
|
|
20
67
|
*/
|
|
21
|
-
export declare function seriesFrom<D>(name: string, data?: Array<D>): BaseSeries<D>;
|
|
68
|
+
export declare function seriesFrom<D>(name: string, data?: Array<D> | FastShiftArray<D>, compactingSize?: number): BaseSeries<D>;
|
|
22
69
|
/**
|
|
23
70
|
* Returns an empty series with the specified name
|
|
24
71
|
* @param name The name of the series
|
|
72
|
+
* @param compactingSize The number of shifts the series' backing array accumulates before it's
|
|
73
|
+
* compacted (see {@link DEFAULT_COMPACTING_SIZE})
|
|
25
74
|
* @return The empty series
|
|
26
75
|
* @see seriesFrom
|
|
27
76
|
* @see seriesFromTuples
|
|
28
77
|
*/
|
|
29
|
-
export declare const emptySeries: <D>(name: string) => BaseSeries<D>;
|
|
78
|
+
export declare const emptySeries: <D>(name: string, compactingSize?: number) => BaseSeries<D>;
|
|
30
79
|
/**
|
|
31
80
|
* Creates an array of empty series, one for each specified name
|
|
32
81
|
* @param names The names for each of the empty series
|
|
82
|
+
* @param compactingSize The number of shifts each series' backing array accumulates before it's
|
|
83
|
+
* compacted (see {@link DEFAULT_COMPACTING_SIZE})
|
|
33
84
|
* @return An array of empty series with the specified names
|
|
34
85
|
* @see emptySeries
|
|
35
86
|
* @see seriesFrom
|
|
36
87
|
* @see seriesFromTuples
|
|
37
88
|
*/
|
|
38
|
-
export declare const emptySeriesFor: <D>(names: Array<string
|
|
89
|
+
export declare const emptySeriesFor: <D>(names: Array<string>, compactingSize?: number) => Array<BaseSeries<D>>;
|
|
90
|
+
//# sourceMappingURL=baseSeries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseSeries.d.ts","sourceRoot":"","sources":["../../../../src/app/charts/series/baseSeries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAgB,MAAM,WAAW,CAAC;AACpE,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC;IACzB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IACxB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACvC;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC;IAC9B;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC;CACnC;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,uBAAuB,QAAS,CAAA;AAE7C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,UAAU,CAAC,CAAC,EACxB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,KAAK,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAM,EACvC,cAAc,GAAE,MAAgC,GACjD,UAAU,CAAC,CAAC,CAAC,CAmBf;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,EAAE,MAAM,MAAM,EAAE,iBAAgB,MAAgC,KAAG,UAAU,CAAC,CAAC,CACpE,CAAC;AAEzC;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,GAAI,CAAC,EAAE,OAAO,KAAK,CAAC,MAAM,CAAC,EAAE,iBAAgB,MAAgC,KAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CACnE,CAAA"}
|