stream-charts 1.0.0 → 1.1.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/README.md +758 -345
- package/changes.md +10 -0
- package/dist/src/app/charts/Chart.d.ts +116 -87
- package/dist/src/app/charts/Chart.js +96 -101
- package/dist/src/app/charts/Chart.js.map +1 -1
- package/dist/src/app/charts/axes/AxesState.d.ts +64 -0
- package/dist/src/app/charts/axes/AxesState.js +97 -0
- package/dist/src/app/charts/axes/AxesState.js.map +1 -0
- package/dist/src/app/charts/axes/AxesState.test.js +30 -0
- package/dist/src/app/charts/axes/AxesState.test.js.map +1 -0
- package/dist/src/app/charts/axes/AxisInterval.d.ts +92 -0
- package/dist/src/app/charts/axes/AxisInterval.js +126 -0
- package/dist/src/app/charts/axes/AxisInterval.js.map +1 -0
- package/dist/src/app/charts/axes/AxisInterval.test.js +120 -0
- package/dist/src/app/charts/axes/AxisInterval.test.js.map +1 -0
- package/dist/src/app/charts/axes/BaseAxisRange.d.ts +83 -0
- package/dist/src/app/charts/axes/BaseAxisRange.js +58 -0
- package/dist/src/app/charts/axes/BaseAxisRange.js.map +1 -0
- package/dist/src/app/charts/axes/ContinuousAxis.d.ts +22 -0
- package/dist/src/app/charts/axes/ContinuousAxis.js +96 -0
- package/dist/src/app/charts/axes/ContinuousAxis.js.map +1 -0
- package/dist/src/app/charts/axes/ContinuousAxisRange.d.ts +59 -0
- package/dist/src/app/charts/axes/ContinuousAxisRange.js +84 -0
- package/dist/src/app/charts/axes/ContinuousAxisRange.js.map +1 -0
- package/dist/src/app/charts/axes/ContinuousAxisRange.test.js +47 -0
- package/dist/src/app/charts/axes/ContinuousAxisRange.test.js.map +1 -0
- package/dist/src/app/charts/axes/OrdinalAxis.d.ts +23 -0
- package/dist/src/app/charts/axes/OrdinalAxis.js +124 -0
- package/dist/src/app/charts/axes/OrdinalAxis.js.map +1 -0
- package/dist/src/app/charts/axes/OrdinalAxisRange.d.ts +69 -0
- package/dist/src/app/charts/axes/OrdinalAxisRange.js +100 -0
- package/dist/src/app/charts/axes/OrdinalAxisRange.js.map +1 -0
- package/dist/src/app/charts/axes/OrdinalAxisRange.test.js +48 -0
- package/dist/src/app/charts/axes/OrdinalAxisRange.test.js.map +1 -0
- package/dist/src/app/charts/axes/axes.d.ts +391 -0
- package/dist/src/app/charts/axes/axes.js +1046 -0
- package/dist/src/app/charts/axes/axes.js.map +1 -0
- package/dist/src/app/charts/d3types.d.ts +10 -10
- package/dist/src/app/charts/filters/regexFilter.d.ts +9 -0
- package/dist/src/app/charts/filters/regexFilter.js +18 -0
- package/dist/src/app/charts/filters/regexFilter.js.map +1 -0
- package/dist/src/app/charts/filters/regexFilter.test.d.ts +1 -0
- package/dist/src/app/charts/filters/regexFilter.test.js +11 -0
- package/dist/src/app/charts/filters/regexFilter.test.js.map +1 -0
- package/dist/src/app/charts/hooks/useAxes.d.ts +144 -0
- package/dist/src/app/charts/hooks/useAxes.js +187 -0
- package/dist/src/app/charts/hooks/useAxes.js.map +1 -0
- package/dist/src/app/charts/hooks/useChart.d.ts +30 -201
- package/dist/src/app/charts/hooks/useChart.js +33 -134
- package/dist/src/app/charts/hooks/useChart.js.map +1 -1
- package/dist/src/app/charts/hooks/useDataObservable.d.ts +74 -0
- package/dist/src/app/charts/hooks/useDataObservable.js +76 -0
- package/dist/src/app/charts/hooks/useDataObservable.js.map +1 -0
- package/dist/src/app/charts/hooks/useInitialData.d.ts +38 -0
- package/dist/src/app/charts/hooks/useInitialData.js +29 -0
- package/dist/src/app/charts/hooks/useInitialData.js.map +1 -0
- package/dist/src/app/charts/hooks/useMouse.d.ts +53 -0
- package/dist/src/app/charts/hooks/useMouse.js +65 -0
- package/dist/src/app/charts/hooks/useMouse.js.map +1 -0
- package/dist/src/app/charts/hooks/usePlotDimensions.d.ts +34 -0
- package/dist/src/app/charts/hooks/usePlotDimensions.js +73 -0
- package/dist/src/app/charts/hooks/usePlotDimensions.js.map +1 -0
- package/dist/src/app/charts/hooks/useTooltip.d.ts +64 -0
- package/dist/src/app/charts/hooks/useTooltip.js +52 -0
- package/dist/src/app/charts/hooks/useTooltip.js.map +1 -0
- package/dist/src/app/charts/observables/ChartData.d.ts +23 -0
- package/dist/src/app/charts/observables/ChartData.js +20 -0
- package/dist/src/app/charts/observables/ChartData.js.map +1 -0
- package/dist/src/app/charts/observables/iterates.d.ts +52 -0
- package/dist/src/app/charts/observables/iterates.js +121 -0
- package/dist/src/app/charts/observables/iterates.js.map +1 -0
- package/dist/src/app/charts/observables/iterates.test.d.ts +1 -0
- package/dist/src/app/charts/observables/iterates.test.js +180 -0
- package/dist/src/app/charts/observables/iterates.test.js.map +1 -0
- package/dist/src/app/charts/observables/ordinals.d.ts +75 -0
- package/dist/src/app/charts/observables/ordinals.js +141 -0
- package/dist/src/app/charts/observables/ordinals.js.map +1 -0
- package/dist/src/app/charts/observables/ordinals.test.d.ts +1 -0
- package/dist/src/app/charts/observables/ordinals.test.js +102 -0
- package/dist/src/app/charts/observables/ordinals.test.js.map +1 -0
- package/dist/src/app/charts/plots/BarPlot.d.ts +81 -0
- package/dist/src/app/charts/plots/BarPlot.js +557 -0
- package/dist/src/app/charts/plots/BarPlot.js.map +1 -0
- package/dist/src/app/charts/plots/PoincarePlot.d.ts +78 -0
- package/dist/src/app/charts/plots/PoincarePlot.js +504 -0
- package/dist/src/app/charts/plots/PoincarePlot.js.map +1 -0
- package/dist/src/app/charts/{RasterPlot.d.ts → plots/RasterPlot.d.ts} +1 -1
- package/dist/src/app/charts/{RasterPlot.js → plots/RasterPlot.js} +152 -133
- package/dist/src/app/charts/plots/RasterPlot.js.map +1 -0
- package/dist/src/app/charts/{ScatterPlot.d.ts → plots/ScatterPlot.d.ts} +10 -8
- package/dist/src/app/charts/plots/ScatterPlot.js +379 -0
- package/dist/src/app/charts/plots/ScatterPlot.js.map +1 -0
- package/dist/src/app/charts/{plot.d.ts → plots/plot.d.ts} +12 -14
- package/dist/src/app/charts/{plot.js → plots/plot.js} +19 -17
- package/dist/src/app/charts/plots/plot.js.map +1 -0
- package/dist/src/app/charts/series/baseSeries.d.ts +38 -0
- package/dist/src/app/charts/series/baseSeries.js +36 -0
- package/dist/src/app/charts/series/baseSeries.js.map +1 -0
- package/dist/src/app/charts/series/datumSeries.test.d.ts +1 -0
- package/dist/src/app/charts/series/datumSeries.test.js +50 -0
- package/dist/src/app/charts/series/datumSeries.test.js.map +1 -0
- package/dist/src/app/charts/series/iterateSeries.d.ts +42 -0
- package/dist/src/app/charts/series/iterateSeries.js +34 -0
- package/dist/src/app/charts/series/iterateSeries.js.map +1 -0
- package/dist/src/app/charts/series/ordinalSeries.d.ts +54 -0
- package/dist/src/app/charts/series/ordinalSeries.js +98 -0
- package/dist/src/app/charts/series/ordinalSeries.js.map +1 -0
- package/dist/src/app/charts/series/timeSeries.d.ts +30 -0
- package/dist/src/app/charts/series/timeSeries.js +19 -0
- package/dist/src/app/charts/series/timeSeries.js.map +1 -0
- package/dist/src/app/charts/{chartData.d.ts → series/timeSeriesChartData.d.ts} +11 -6
- package/dist/src/app/charts/series/timeSeriesChartData.js +32 -0
- package/dist/src/app/charts/series/timeSeriesChartData.js.map +1 -0
- package/dist/src/app/charts/styling/barPlotStyle.d.ts +41 -0
- package/dist/src/app/charts/styling/barPlotStyle.js +84 -0
- package/dist/src/app/charts/styling/barPlotStyle.js.map +1 -0
- package/dist/src/app/charts/{margins.d.ts → styling/margins.d.ts} +7 -5
- package/dist/src/app/charts/{margins.js → styling/margins.js} +19 -9
- package/dist/src/app/charts/styling/margins.js.map +1 -0
- package/dist/src/app/charts/styling/margins.test.d.ts +1 -0
- package/dist/src/app/charts/styling/margins.test.js +19 -0
- package/dist/src/app/charts/styling/margins.test.js.map +1 -0
- package/dist/src/app/charts/styling/svgStyle.d.ts +76 -0
- package/dist/src/app/charts/styling/svgStyle.js +84 -0
- package/dist/src/app/charts/styling/svgStyle.js.map +1 -0
- package/dist/src/app/charts/subscriptions/subscription.test.d.ts +1 -0
- package/dist/src/app/charts/subscriptions/subscription.test.js +395 -0
- package/dist/src/app/charts/subscriptions/subscription.test.js.map +1 -0
- package/dist/src/app/charts/subscriptions/subscriptions.d.ts +100 -0
- package/dist/src/app/charts/subscriptions/subscriptions.js +449 -0
- package/dist/src/app/charts/subscriptions/subscriptions.js.map +1 -0
- package/dist/src/app/charts/tooltips/BarPlotTooltipContent.d.ts +90 -0
- package/dist/src/app/charts/tooltips/BarPlotTooltipContent.js +302 -0
- package/dist/src/app/charts/tooltips/BarPlotTooltipContent.js.map +1 -0
- package/dist/src/app/charts/tooltips/PoincarePlotTooltipContent.d.ts +100 -0
- package/dist/src/app/charts/tooltips/PoincarePlotTooltipContent.js +190 -0
- package/dist/src/app/charts/tooltips/PoincarePlotTooltipContent.js.map +1 -0
- package/dist/src/app/charts/{RasterPlotTooltipContent.js → tooltips/RasterPlotTooltipContent.js} +40 -44
- package/dist/src/app/charts/tooltips/RasterPlotTooltipContent.js.map +1 -0
- package/dist/src/app/charts/tooltips/ScatterPlotTooltipContent.js +154 -0
- package/dist/src/app/charts/tooltips/ScatterPlotTooltipContent.js.map +1 -0
- package/dist/src/app/charts/{Tooltip.d.ts → tooltips/Tooltip.d.ts} +4 -2
- package/dist/src/app/charts/{Tooltip.js → tooltips/Tooltip.js} +23 -28
- package/dist/src/app/charts/tooltips/Tooltip.js.map +1 -0
- package/dist/src/app/charts/{tooltipUtils.d.ts → tooltips/tooltipUtils.d.ts} +17 -11
- package/dist/src/app/charts/{tooltipUtils.js → tooltips/tooltipUtils.js} +52 -25
- package/dist/src/app/charts/tooltips/tooltipUtils.js.map +1 -0
- package/dist/src/app/charts/{Tracker.d.ts → trackers/Tracker.d.ts} +6 -5
- package/dist/src/app/charts/trackers/Tracker.js +60 -0
- package/dist/src/app/charts/trackers/Tracker.js.map +1 -0
- package/dist/src/app/charts/{trackerUtils.d.ts → trackers/trackerUtils.d.ts} +13 -8
- package/dist/src/app/charts/trackers/trackerUtils.js +359 -0
- package/dist/src/app/charts/trackers/trackerUtils.js.map +1 -0
- package/dist/src/app/charts/utils.d.ts +22 -32
- package/dist/src/app/charts/utils.js +36 -37
- package/dist/src/app/charts/utils.js.map +1 -1
- package/dist/src/index.d.ts +48 -15
- package/dist/src/index.js +71 -15
- package/dist/src/index.js.map +1 -1
- package/package.json +30 -20
- package/src/app/charts/Chart.tsx +334 -0
- package/src/app/charts/axes/AxesState.test.ts +34 -0
- package/src/app/charts/axes/AxesState.ts +112 -0
- package/src/app/charts/axes/AxisInterval.test.ts +143 -0
- package/src/app/charts/axes/AxisInterval.ts +139 -0
- package/src/app/charts/axes/BaseAxisRange.ts +113 -0
- package/src/app/charts/axes/ContinuousAxis.tsx +192 -0
- package/src/app/charts/axes/ContinuousAxisRange.test.ts +55 -0
- package/src/app/charts/axes/ContinuousAxisRange.ts +96 -0
- package/src/app/charts/axes/OrdinalAxis.tsx +223 -0
- package/src/app/charts/axes/OrdinalAxisRange.test.ts +55 -0
- package/src/app/charts/axes/OrdinalAxisRange.ts +112 -0
- package/src/app/charts/axes/axes.ts +1569 -0
- package/src/app/charts/d3types.ts +16 -0
- package/src/app/charts/filters/regexFilter.test.ts +13 -0
- package/src/app/charts/filters/regexFilter.ts +17 -0
- package/src/app/charts/hooks/useAxes.tsx +341 -0
- package/src/app/charts/hooks/useChart.tsx +159 -0
- package/src/app/charts/hooks/useDataObservable.tsx +175 -0
- package/src/app/charts/hooks/useInitialData.tsx +65 -0
- package/src/app/charts/hooks/useMouse.tsx +125 -0
- package/src/app/charts/hooks/usePlotDimensions.tsx +120 -0
- package/src/app/charts/hooks/useTooltip.tsx +112 -0
- package/src/app/charts/observables/ChartData.ts +31 -0
- package/src/app/charts/observables/iterates.test.ts +201 -0
- package/src/app/charts/observables/iterates.ts +203 -0
- package/src/app/charts/observables/ordinals.test.ts +135 -0
- package/src/app/charts/observables/ordinals.ts +248 -0
- package/src/app/charts/plots/BarPlot.tsx +1088 -0
- package/src/app/charts/plots/PoincarePlot.tsx +832 -0
- package/src/app/charts/plots/RasterPlot.tsx +676 -0
- package/src/app/charts/plots/ScatterPlot.tsx +653 -0
- package/src/app/charts/plots/plot.ts +75 -0
- package/src/app/charts/series/baseSeries.ts +52 -0
- package/src/app/charts/series/datumSeries.test.ts +60 -0
- package/src/app/charts/series/iterateSeries.ts +56 -0
- package/src/app/charts/series/ordinalSeries.ts +164 -0
- package/src/app/charts/series/timeSeries.ts +40 -0
- package/src/app/charts/series/timeSeriesChartData.ts +68 -0
- package/src/app/charts/styling/barPlotStyle.ts +126 -0
- package/src/app/charts/styling/margins.test.ts +22 -0
- package/src/app/charts/styling/margins.ts +58 -0
- package/src/app/charts/styling/svgStyle.ts +118 -0
- package/src/app/charts/subscriptions/subscription.test.ts +499 -0
- package/src/app/charts/subscriptions/subscriptions.ts +635 -0
- package/src/app/charts/tooltips/BarPlotTooltipContent.tsx +440 -0
- package/src/app/charts/tooltips/PoincarePlotTooltipContent.tsx +352 -0
- package/src/app/charts/tooltips/RasterPlotTooltipContent.tsx +274 -0
- package/src/app/charts/tooltips/ScatterPlotTooltipContent.tsx +319 -0
- package/src/app/charts/tooltips/Tooltip.tsx +148 -0
- package/src/app/charts/tooltips/tooltipUtils.ts +216 -0
- package/src/app/charts/trackers/Tracker.tsx +129 -0
- package/src/app/charts/trackers/trackerUtils.ts +494 -0
- package/src/app/charts/utils.ts +109 -0
- package/dist/src/app/charts/CategoryAxis.d.ts +0 -20
- package/dist/src/app/charts/CategoryAxis.js +0 -112
- package/dist/src/app/charts/CategoryAxis.js.map +0 -1
- package/dist/src/app/charts/ContinuousAxis.d.ts +0 -16
- package/dist/src/app/charts/ContinuousAxis.js +0 -186
- package/dist/src/app/charts/ContinuousAxis.js.map +0 -1
- package/dist/src/app/charts/RasterPlot.js.map +0 -1
- package/dist/src/app/charts/RasterPlotTooltipContent.js.map +0 -1
- package/dist/src/app/charts/ScatterPlot.js +0 -351
- package/dist/src/app/charts/ScatterPlot.js.map +0 -1
- package/dist/src/app/charts/ScatterPlotTooltipContent.js +0 -163
- package/dist/src/app/charts/ScatterPlotTooltipContent.js.map +0 -1
- package/dist/src/app/charts/Tooltip.js.map +0 -1
- package/dist/src/app/charts/Tracker.js +0 -65
- package/dist/src/app/charts/Tracker.js.map +0 -1
- package/dist/src/app/charts/axes.d.ts +0 -132
- package/dist/src/app/charts/axes.js +0 -265
- package/dist/src/app/charts/axes.js.map +0 -1
- package/dist/src/app/charts/chartData.js +0 -32
- package/dist/src/app/charts/chartData.js.map +0 -1
- package/dist/src/app/charts/continuousAxisRangeFor.d.ts +0 -20
- package/dist/src/app/charts/continuousAxisRangeFor.js +0 -68
- package/dist/src/app/charts/continuousAxisRangeFor.js.map +0 -1
- package/dist/src/app/charts/datumSeries.d.ts +0 -59
- package/dist/src/app/charts/datumSeries.js +0 -55
- package/dist/src/app/charts/datumSeries.js.map +0 -1
- package/dist/src/app/charts/datumSeries.test.js +0 -50
- package/dist/src/app/charts/datumSeries.test.js.map +0 -1
- package/dist/src/app/charts/hooks/AxesState.d.ts +0 -37
- package/dist/src/app/charts/hooks/AxesState.js +0 -44
- package/dist/src/app/charts/hooks/AxesState.js.map +0 -1
- package/dist/src/app/charts/margins.js.map +0 -1
- package/dist/src/app/charts/margins.test.js +0 -14
- package/dist/src/app/charts/margins.test.js.map +0 -1
- package/dist/src/app/charts/plot.js.map +0 -1
- package/dist/src/app/charts/regexFilter.d.ts +0 -9
- package/dist/src/app/charts/regexFilter.js +0 -17
- package/dist/src/app/charts/regexFilter.js.map +0 -1
- package/dist/src/app/charts/regexFilter.test.js +0 -11
- package/dist/src/app/charts/regexFilter.test.js.map +0 -1
- package/dist/src/app/charts/subscriptions.d.ts +0 -43
- package/dist/src/app/charts/subscriptions.js +0 -213
- package/dist/src/app/charts/subscriptions.js.map +0 -1
- package/dist/src/app/charts/svgStyle.d.ts +0 -27
- package/dist/src/app/charts/svgStyle.js +0 -32
- package/dist/src/app/charts/svgStyle.js.map +0 -1
- package/dist/src/app/charts/timeRange.test.js +0 -54
- package/dist/src/app/charts/timeRange.test.js.map +0 -1
- package/dist/src/app/charts/tooltipUtils.js.map +0 -1
- package/dist/src/app/charts/trackerUtils.js +0 -130
- package/dist/src/app/charts/trackerUtils.js.map +0 -1
- /package/dist/src/app/charts/{datumSeries.test.d.ts → axes/AxesState.test.d.ts} +0 -0
- /package/dist/src/app/charts/{margins.test.d.ts → axes/AxisInterval.test.d.ts} +0 -0
- /package/dist/src/app/charts/{regexFilter.test.d.ts → axes/ContinuousAxisRange.test.d.ts} +0 -0
- /package/dist/src/app/charts/{timeRange.test.d.ts → axes/OrdinalAxisRange.test.d.ts} +0 -0
- /package/dist/src/app/charts/{RasterPlotTooltipContent.d.ts → tooltips/RasterPlotTooltipContent.d.ts} +0 -0
- /package/dist/src/app/charts/{ScatterPlotTooltipContent.d.ts → tooltips/ScatterPlotTooltipContent.d.ts} +0 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts an observable of {@link TimeSeriesChartData} into an observable of {@link OrdinalChartData} for
|
|
3
|
+
* plotting categorical data.
|
|
4
|
+
* 1. Convert series to chart data observable in the usual way
|
|
5
|
+
* 2. Accepts that chart-data observable and converts that observable to an ordinal-chart-data observable
|
|
6
|
+
*/
|
|
7
|
+
import {Observable} from "rxjs";
|
|
8
|
+
import {TimeSeriesChartData} from "../series/timeSeriesChartData";
|
|
9
|
+
import {map, scan} from "rxjs/operators";
|
|
10
|
+
import {Datum} from "../series/timeSeries";
|
|
11
|
+
import {copyOrdinalDatum, nonEmptyOrdinalDatum, OrdinalDatum, ordinalDatumOf} from "../series/ordinalSeries";
|
|
12
|
+
import {ChartData, copyChartData, defaultChartData} from "./ChartData";
|
|
13
|
+
|
|
14
|
+
export interface OrdinalChartData extends ChartData {
|
|
15
|
+
/**
|
|
16
|
+
* Statistics for the chart. Holds the overall minimum and maximum (across all
|
|
17
|
+
* the series), and statistics for each individual series.
|
|
18
|
+
*/
|
|
19
|
+
stats: OrdinalStats
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Map holding the name of the series (the time-series identifier) and the associated
|
|
23
|
+
* data points for that time-series (`map(series_name -> array(datum))`)
|
|
24
|
+
*/
|
|
25
|
+
newPoints: Map<string, Array<OrdinalDatum>>
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Statistics for the chart. Holds the overall minimum and maximum (across all
|
|
30
|
+
* the series), and statistics for each individual series.
|
|
31
|
+
*/
|
|
32
|
+
export interface OrdinalStats {
|
|
33
|
+
/**
|
|
34
|
+
* The min values for (time, value) for the data in the newPoints map
|
|
35
|
+
*/
|
|
36
|
+
minDatum: OrdinalDatumExtremum
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The max values for (time, iterate n, and iterate n+1) for the data in the newPoints map
|
|
40
|
+
*/
|
|
41
|
+
maxDatum: OrdinalDatumExtremum
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* A map associating each series to stats about that series (e.g. map(series_name -> stats))
|
|
45
|
+
*/
|
|
46
|
+
valueStatsForSeries: Map<string, OrdinalValueStats>
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export type OrdinalValueStats = {
|
|
50
|
+
min: OrdinalDatum
|
|
51
|
+
max: OrdinalDatum
|
|
52
|
+
count: number
|
|
53
|
+
sum: number
|
|
54
|
+
sumSquared: number
|
|
55
|
+
mean: number
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export type OrdinalDatumExtremum = {
|
|
59
|
+
// holds the ordinal datum with the minimum or maximum time
|
|
60
|
+
time: OrdinalDatum
|
|
61
|
+
// holds the ordinal datum with the minimum or maximum value
|
|
62
|
+
value: OrdinalDatum
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export const initialMinValueDatum = (): OrdinalDatum => ordinalDatumOf(NaN, "", Infinity)
|
|
66
|
+
export const initialMaxValueDatum = (): OrdinalDatum => ordinalDatumOf(NaN, "", -Infinity)
|
|
67
|
+
|
|
68
|
+
export const initialMinTimeDatum = (): OrdinalDatum => ordinalDatumOf(Infinity, "", NaN)
|
|
69
|
+
export const initialMaxTimeDatum = (): OrdinalDatum => ordinalDatumOf(-Infinity, "", NaN)
|
|
70
|
+
|
|
71
|
+
export function valueStatusDatumOfDefault(datum: OrdinalDatum | undefined): OrdinalDatum {
|
|
72
|
+
return (datum === undefined) ? ordinalDatumOf(NaN, "", NaN) : datum
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function isDefaultValueStatsDatum(datum: OrdinalDatum): boolean {
|
|
76
|
+
return isNaN(datum.time) && datum.ordinal === "" && isNaN(datum.value)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const initialMinOrdinalDatum = (): OrdinalDatumExtremum => ({
|
|
80
|
+
time: ordinalDatumOf(Infinity, "", NaN),
|
|
81
|
+
value: initialMinValueDatum()
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
const initialMaxOrdinalDatum = (): OrdinalDatumExtremum => ({
|
|
85
|
+
time: ordinalDatumOf(-Infinity, "", NaN),
|
|
86
|
+
value: initialMaxValueDatum()
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
export function copyOrdinalDatumExtremum(datum: OrdinalDatumExtremum): OrdinalDatumExtremum {
|
|
90
|
+
return {
|
|
91
|
+
time: copyOrdinalDatum(datum.time),
|
|
92
|
+
value: copyOrdinalDatum(datum.value)
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export const defaultOrdinalStats = (): OrdinalStats => ({
|
|
97
|
+
minDatum: initialMinOrdinalDatum(),
|
|
98
|
+
maxDatum: initialMaxOrdinalDatum(),
|
|
99
|
+
valueStatsForSeries: new Map<string, OrdinalValueStats>()
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
export const defaultOrdinalValueStats = (): OrdinalValueStats => ({
|
|
103
|
+
min: initialMinValueDatum(),
|
|
104
|
+
max: initialMaxValueDatum(),
|
|
105
|
+
count: 0,
|
|
106
|
+
sum: 0,
|
|
107
|
+
mean: NaN,
|
|
108
|
+
sumSquared: 0,
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
export function copyOrdinalValueStats(data: OrdinalValueStats): OrdinalValueStats {
|
|
112
|
+
return {
|
|
113
|
+
...data,
|
|
114
|
+
min: copyOrdinalDatum(data.min),
|
|
115
|
+
max: copyOrdinalDatum(data.max),
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export function copyValueStatsForSeries(valueStats: Map<string, OrdinalValueStats>): Map<string, OrdinalValueStats> {
|
|
120
|
+
return new Map<string, OrdinalValueStats>(Array.from(valueStats.entries())
|
|
121
|
+
.map(([seriesName, valueStats]) => [seriesName, copyOrdinalValueStats(valueStats)])
|
|
122
|
+
)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export const copyOrdinalStats = (data: OrdinalStats): OrdinalStats => ({
|
|
126
|
+
minDatum: copyOrdinalDatumExtremum(data.minDatum),
|
|
127
|
+
maxDatum: copyOrdinalDatumExtremum(data.maxDatum),
|
|
128
|
+
valueStatsForSeries: copyValueStatsForSeries(data.valueStatsForSeries),
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
const emptyOrdinalData = (): OrdinalChartData => ({
|
|
132
|
+
...defaultChartData(),
|
|
133
|
+
stats: defaultOrdinalStats(),
|
|
134
|
+
newPoints: new Map<string, Array<OrdinalDatum>>()
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Makes a deep copy of the ordinal chart data
|
|
139
|
+
* @param data The ordinal chart data to copy
|
|
140
|
+
*/
|
|
141
|
+
export const copyOrdinalDataFrom = (data: OrdinalChartData): OrdinalChartData => ({
|
|
142
|
+
...copyChartData(data),
|
|
143
|
+
stats: copyOrdinalStats(data.stats),
|
|
144
|
+
newPoints: new Map<string, Array<OrdinalDatum>>(Array.from(data.newPoints.entries()).map(([name, points]) => [name, points.slice()])),
|
|
145
|
+
})
|
|
146
|
+
|
|
147
|
+
type Accumulator = {
|
|
148
|
+
previous: Map<string, Array<Datum>>
|
|
149
|
+
accumulated: OrdinalChartData
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const initialAccumulate = (): Accumulator => ({previous: new Map(), accumulated: emptyOrdinalData()})
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Accepts a {@link TimeSeriesChartData} observable and converts it to an observable of {@link OrdinalChartData}.
|
|
156
|
+
* @param dataObservable The observable over {@link TimeSeriesChartData}
|
|
157
|
+
* @return An observable of {@link OrdinalChartData} holding the series for the incoming chart data
|
|
158
|
+
*/
|
|
159
|
+
export function ordinalsObservable(dataObservable: Observable<TimeSeriesChartData>): Observable<OrdinalChartData> {
|
|
160
|
+
return dataObservable
|
|
161
|
+
.pipe(
|
|
162
|
+
// calculate the iterates for each series in the chart data
|
|
163
|
+
scan(({previous, accumulated}: Accumulator, current: TimeSeriesChartData) => {
|
|
164
|
+
// make a deep copy of the accumulated data (because the accumulated data object
|
|
165
|
+
// holds references to maps)
|
|
166
|
+
const accum = copyOrdinalDataFrom(accumulated)
|
|
167
|
+
|
|
168
|
+
// for each series, add the new points to the accumulated data
|
|
169
|
+
Array
|
|
170
|
+
.from(current.newPoints.entries())
|
|
171
|
+
.forEach(([name, series]) => {
|
|
172
|
+
// grab the points from the previous incoming data and add the new
|
|
173
|
+
// data to the end of the previous data (when the updated data
|
|
174
|
+
// didn't yet exist, add it to the map holding the previous series)
|
|
175
|
+
const updated = (previous.get(name) || [])
|
|
176
|
+
if (updated.length === 0) {
|
|
177
|
+
previous.set(name, updated)
|
|
178
|
+
}
|
|
179
|
+
updated.push(...series)
|
|
180
|
+
|
|
181
|
+
// add the series name to the list of all
|
|
182
|
+
accum.seriesNames.add(name)
|
|
183
|
+
|
|
184
|
+
// calculate the max-time, min-time, max-value, and min-value for
|
|
185
|
+
// all the data series
|
|
186
|
+
series.forEach(({time, value}: Datum, ) => {
|
|
187
|
+
// calculate the min and max times over all series
|
|
188
|
+
if (time < accum.stats.minDatum.time.time) {
|
|
189
|
+
accum.stats.minDatum.time = ordinalDatumOf(time, name, value)
|
|
190
|
+
} else if (time > accum.stats.maxDatum.time.time) {
|
|
191
|
+
accum.stats.maxDatum.time = ordinalDatumOf(time, name, value)
|
|
192
|
+
}
|
|
193
|
+
// calculate the min and max values over all series
|
|
194
|
+
if (value < accum.stats.minDatum.value.value) {
|
|
195
|
+
accum.stats.minDatum.value = ordinalDatumOf(time, name, value)
|
|
196
|
+
} else if (value > accum.stats.maxDatum.value.value) {
|
|
197
|
+
accum.stats.maxDatum.value = ordinalDatumOf(time, name, value)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// calculate the min, max of the time and value for each series
|
|
201
|
+
let valueStats: OrdinalValueStats = accum.stats.valueStatsForSeries.get(name) || defaultOrdinalValueStats()
|
|
202
|
+
|
|
203
|
+
const minValue = (value < valueStats.min.value) ?
|
|
204
|
+
ordinalDatumOf(time, name, value) :
|
|
205
|
+
copyOrdinalDatum(valueStats.min)
|
|
206
|
+
const maxValue = (value > valueStats.max.value) ?
|
|
207
|
+
ordinalDatumOf(time, name, value) :
|
|
208
|
+
copyOrdinalDatum(valueStats.max)
|
|
209
|
+
const count = valueStats.count + 1
|
|
210
|
+
const sum = valueStats.sum + value
|
|
211
|
+
valueStats = {
|
|
212
|
+
min: minValue,
|
|
213
|
+
max: maxValue,
|
|
214
|
+
count,
|
|
215
|
+
sum,
|
|
216
|
+
sumSquared: isNaN(valueStats.sumSquared) ? value * value : valueStats.sumSquared + value * value,
|
|
217
|
+
mean: sum / count
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
accum.stats.valueStatsForSeries.set(name, valueStats)
|
|
221
|
+
})
|
|
222
|
+
|
|
223
|
+
// convert the new points to ordinal datum
|
|
224
|
+
accum.newPoints.set(name, series.map(({time, value}: Datum) => ordinalDatumOf(time, name, value)))
|
|
225
|
+
})
|
|
226
|
+
return {previous, accumulated: accum}
|
|
227
|
+
}, initialAccumulate()),
|
|
228
|
+
|
|
229
|
+
// remove new points from the map that are empty
|
|
230
|
+
map(accum => removeEmptyNewPoints(accum)),
|
|
231
|
+
map(accum => accum.accumulated === undefined ? emptyOrdinalData() : accum.accumulated)
|
|
232
|
+
)
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
function removeEmptyNewPoints(accum: Accumulator): Accumulator {
|
|
236
|
+
const newPoints = new Map(
|
|
237
|
+
Array
|
|
238
|
+
.from(accum.accumulated.newPoints.entries())
|
|
239
|
+
.map(([name, points]) => [name, points.filter(point => nonEmptyOrdinalDatum(point))])
|
|
240
|
+
)
|
|
241
|
+
return {
|
|
242
|
+
previous: accum.previous,
|
|
243
|
+
accumulated: {
|
|
244
|
+
...accum.accumulated,
|
|
245
|
+
newPoints
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|