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 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { plotDimensionsFrom, containerDimensionsFrom } from "./margins";
|
|
2
|
+
describe('adjusted dimension should correct for margins', () => {
|
|
3
|
+
const margins = { top: 11, bottom: 12, left: 13, right: 14 };
|
|
4
|
+
const width = 100;
|
|
5
|
+
const height = 200;
|
|
6
|
+
const dimensions = plotDimensionsFrom(width, height, margins);
|
|
7
|
+
test('adjusted width should have the left and right margins removed', () => {
|
|
8
|
+
expect(dimensions.width).toBe(width - margins.right - margins.left);
|
|
9
|
+
});
|
|
10
|
+
test('adjusted height should have the top and bottom margins removed', () => {
|
|
11
|
+
expect(dimensions.height).toBe(height - margins.top - margins.bottom);
|
|
12
|
+
});
|
|
13
|
+
test('should be able to get back the container dimensions after calculate the plot dimensions', () => {
|
|
14
|
+
const { width: containerWidth, height: containerHeight } = containerDimensionsFrom(plotDimensionsFrom(width, height, margins), margins);
|
|
15
|
+
expect(containerWidth).toBe(width);
|
|
16
|
+
expect(containerHeight).toBe(height);
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=margins.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"margins.test.js","sourceRoot":"","sources":["../../../../../src/app/charts/styling/margins.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,kBAAkB,EAAU,uBAAuB,EAAC,MAAM,WAAW,CAAC;AAE9E,QAAQ,CAAC,+CAA+C,EAAE,GAAG,EAAE;IAC3D,MAAM,OAAO,GAAW,EAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAC,CAAC;IACnE,MAAM,KAAK,GAAG,GAAG,CAAC;IAClB,MAAM,MAAM,GAAG,GAAG,CAAC;IACnB,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAE9D,IAAI,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yFAAyF,EAAE,GAAG,EAAE;QACjG,MAAM,EAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe,EAAC,GAAG,uBAAuB,CAAC,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;QACtI,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import * as d3 from "d3";
|
|
2
|
+
import { BaseType } from "d3";
|
|
3
|
+
export interface SvgStyle {
|
|
4
|
+
height?: string | number;
|
|
5
|
+
width?: string | number;
|
|
6
|
+
outline?: string;
|
|
7
|
+
[propName: string]: any;
|
|
8
|
+
}
|
|
9
|
+
export declare const initialSvgStyle: SvgStyle;
|
|
10
|
+
/**
|
|
11
|
+
* Grabs the client-width of the svg element, or 1 if the svg element hasn't yet
|
|
12
|
+
* been initialized. The client-width is a read-only property returns the width of
|
|
13
|
+
* the html element, including horizontal padding and borders, as an integer. The reason
|
|
14
|
+
* that we return 1 when the svg element hasn't yet been initialized, is so that the
|
|
15
|
+
* aspect (width / height) is 1.
|
|
16
|
+
* @param {SVGElement | null} svg The svg element
|
|
17
|
+
* @return {number} The client width of the svg
|
|
18
|
+
*/
|
|
19
|
+
export declare function grabWidth(svg: SVGElement | null): number;
|
|
20
|
+
/**
|
|
21
|
+
* Grabs the client-height of the svg element, or 1 if the svg element hasn't yet
|
|
22
|
+
* been initialized. The client-height is a read-only property returns the height of
|
|
23
|
+
* the html element, including vertical padding and borders, as an integer. The reason
|
|
24
|
+
* that we return 1 when the svg element hasn't yet been initialized, is so that the
|
|
25
|
+
* aspect (width / height) is 1.
|
|
26
|
+
* @param {SVGElement | null} svg The svg element
|
|
27
|
+
* @return {number} The client height of the svg
|
|
28
|
+
*/
|
|
29
|
+
export declare function grabHeight(svg: SVGElement | null): number;
|
|
30
|
+
export declare const STROKE_COLOR: string;
|
|
31
|
+
export declare const STROKE_WIDTH: string;
|
|
32
|
+
export declare const STROKE_OPACITY: string;
|
|
33
|
+
export interface SvgStrokeStyle {
|
|
34
|
+
readonly color: string;
|
|
35
|
+
readonly width: number;
|
|
36
|
+
readonly opacity: number;
|
|
37
|
+
}
|
|
38
|
+
export declare function updateSvgStrokeColor(current: SvgStrokeStyle, color: string): {
|
|
39
|
+
color: string;
|
|
40
|
+
width: number;
|
|
41
|
+
opacity: number;
|
|
42
|
+
};
|
|
43
|
+
export declare function updateSvgStrokeWidth(current: SvgStrokeStyle, width: number): {
|
|
44
|
+
width: number;
|
|
45
|
+
color: string;
|
|
46
|
+
opacity: number;
|
|
47
|
+
};
|
|
48
|
+
export declare function updateSvgStrokeOpacity(current: SvgStrokeStyle, opacity: number): {
|
|
49
|
+
opacity: number;
|
|
50
|
+
color: string;
|
|
51
|
+
width: number;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
*
|
|
55
|
+
* @param style
|
|
56
|
+
* @param selection
|
|
57
|
+
* @template E The SVG element (e.g. SVGRectElement, SVGLineElement, etc)
|
|
58
|
+
* @template D The datum type
|
|
59
|
+
* @template The SVG G element
|
|
60
|
+
*/
|
|
61
|
+
export declare function applyStrokeStylesTo<E extends BaseType, D, G extends BaseType = SVGGElement>(selection: d3.Selection<E, D, G, any>, style: Partial<SvgStrokeStyle>): d3.Selection<E, D, G, any>;
|
|
62
|
+
export interface SvgFillStyle {
|
|
63
|
+
readonly color: string;
|
|
64
|
+
readonly opacity: number;
|
|
65
|
+
}
|
|
66
|
+
export declare function updateSvgFillColor(current: SvgFillStyle, color: string): SvgFillStyle;
|
|
67
|
+
export declare function updateSvgFillOpacity(current: SvgFillStyle, opacity: number): SvgFillStyle;
|
|
68
|
+
/**
|
|
69
|
+
*
|
|
70
|
+
* @param style
|
|
71
|
+
* @param selection
|
|
72
|
+
* @template E The SVG element (e.g. SVGRectElement, SVGLineElement, etc)
|
|
73
|
+
* @template D The datum type
|
|
74
|
+
* @template The SVG G element
|
|
75
|
+
*/
|
|
76
|
+
export declare function applyFillStylesTo<E extends BaseType, D, G extends BaseType = SVGGElement>(selection: d3.Selection<E, D, G, any>, style: Partial<SvgFillStyle>): d3.Selection<E, D, G, any>;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
export const initialSvgStyle = {
|
|
2
|
+
width: '100%',
|
|
3
|
+
// display: "inline-block",
|
|
4
|
+
// position: "floating",
|
|
5
|
+
top: 0,
|
|
6
|
+
left: 0
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Grabs the client-width of the svg element, or 1 if the svg element hasn't yet
|
|
10
|
+
* been initialized. The client-width is a read-only property returns the width of
|
|
11
|
+
* the html element, including horizontal padding and borders, as an integer. The reason
|
|
12
|
+
* that we return 1 when the svg element hasn't yet been initialized, is so that the
|
|
13
|
+
* aspect (width / height) is 1.
|
|
14
|
+
* @param {SVGElement | null} svg The svg element
|
|
15
|
+
* @return {number} The client width of the svg
|
|
16
|
+
*/
|
|
17
|
+
export function grabWidth(svg) {
|
|
18
|
+
return svg !== null ? svg.clientWidth : 1;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Grabs the client-height of the svg element, or 1 if the svg element hasn't yet
|
|
22
|
+
* been initialized. The client-height is a read-only property returns the height of
|
|
23
|
+
* the html element, including vertical padding and borders, as an integer. The reason
|
|
24
|
+
* that we return 1 when the svg element hasn't yet been initialized, is so that the
|
|
25
|
+
* aspect (width / height) is 1.
|
|
26
|
+
* @param {SVGElement | null} svg The svg element
|
|
27
|
+
* @return {number} The client height of the svg
|
|
28
|
+
*/
|
|
29
|
+
export function grabHeight(svg) {
|
|
30
|
+
return svg !== null ? svg.clientHeight : 1;
|
|
31
|
+
}
|
|
32
|
+
export const STROKE_COLOR = "stroke";
|
|
33
|
+
export const STROKE_WIDTH = "stroke-width";
|
|
34
|
+
export const STROKE_OPACITY = "stroke-opacity";
|
|
35
|
+
export function updateSvgStrokeColor(current, color) {
|
|
36
|
+
return Object.assign(Object.assign({}, current), { color });
|
|
37
|
+
}
|
|
38
|
+
export function updateSvgStrokeWidth(current, width) {
|
|
39
|
+
return Object.assign(Object.assign({}, current), { width });
|
|
40
|
+
}
|
|
41
|
+
export function updateSvgStrokeOpacity(current, opacity) {
|
|
42
|
+
return Object.assign(Object.assign({}, current), { opacity });
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
*
|
|
46
|
+
* @param style
|
|
47
|
+
* @param selection
|
|
48
|
+
* @template E The SVG element (e.g. SVGRectElement, SVGLineElement, etc)
|
|
49
|
+
* @template D The datum type
|
|
50
|
+
* @template The SVG G element
|
|
51
|
+
*/
|
|
52
|
+
export function applyStrokeStylesTo(selection, style) {
|
|
53
|
+
if (style.color !== undefined)
|
|
54
|
+
selection.style(STROKE_COLOR, style.color);
|
|
55
|
+
if (style.width !== undefined)
|
|
56
|
+
selection.style(STROKE_WIDTH, style.width);
|
|
57
|
+
if (style.opacity !== undefined)
|
|
58
|
+
selection.style(STROKE_OPACITY, style.opacity);
|
|
59
|
+
return selection;
|
|
60
|
+
}
|
|
61
|
+
const FILL_COLOR = "fill";
|
|
62
|
+
const FILL_OPACITY = "fill-opacity";
|
|
63
|
+
export function updateSvgFillColor(current, color) {
|
|
64
|
+
return Object.assign(Object.assign({}, current), { color });
|
|
65
|
+
}
|
|
66
|
+
export function updateSvgFillOpacity(current, opacity) {
|
|
67
|
+
return Object.assign(Object.assign({}, current), { opacity });
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
*
|
|
71
|
+
* @param style
|
|
72
|
+
* @param selection
|
|
73
|
+
* @template E The SVG element (e.g. SVGRectElement, SVGLineElement, etc)
|
|
74
|
+
* @template D The datum type
|
|
75
|
+
* @template The SVG G element
|
|
76
|
+
*/
|
|
77
|
+
export function applyFillStylesTo(selection, style) {
|
|
78
|
+
if (style.color !== undefined)
|
|
79
|
+
selection.style(FILL_COLOR, style.color);
|
|
80
|
+
if (style.opacity !== undefined)
|
|
81
|
+
selection.style(FILL_OPACITY, style.opacity);
|
|
82
|
+
return selection;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=svgStyle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svgStyle.js","sourceRoot":"","sources":["../../../../../src/app/charts/styling/svgStyle.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,eAAe,GAAa;IACrC,KAAK,EAAE,MAAM;IACb,2BAA2B;IAC3B,wBAAwB;IACxB,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;CACV,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,UAAU,SAAS,CAAC,GAAsB;IAC5C,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CAAC,GAAsB;IAC7C,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC;AAGD,MAAM,CAAC,MAAM,YAAY,GAAW,QAAQ,CAAA;AAC5C,MAAM,CAAC,MAAM,YAAY,GAAW,cAAc,CAAA;AAClD,MAAM,CAAC,MAAM,cAAc,GAAW,gBAAgB,CAAA;AAQtD,MAAM,UAAU,oBAAoB,CAAC,OAAuB,EAAE,KAAa;IACvE,uCAAW,OAAO,KAAE,KAAK,IAAE;AAC/B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAuB,EAAE,KAAa;IACvE,uCAAW,OAAO,KAAE,KAAK,IAAE;AAC/B,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAuB,EAAE,OAAe;IAC3E,uCAAW,OAAO,KAAE,OAAO,IAAE;AACjC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAC/B,SAAqC,EACrC,KAA8B;IAE9B,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;IACzE,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;IACzE,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;QAAE,SAAS,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IAC/E,OAAO,SAAS,CAAA;AACpB,CAAC;AAED,MAAM,UAAU,GAAW,MAAM,CAAA;AACjC,MAAM,YAAY,GAAW,cAAc,CAAA;AAO3C,MAAM,UAAU,kBAAkB,CAAC,OAAqB,EAAE,KAAa;IACnE,uCAAW,OAAO,KAAE,KAAK,IAAC;AAC9B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAqB,EAAE,OAAe;IACvE,uCAAW,OAAO,KAAE,OAAO,IAAC;AAChC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC7B,SAAqC,EACrC,KAA4B;IAE5B,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;IACvE,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;QAAE,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IAC7E,OAAO,SAAS,CAAA;AACpB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
import { filter, map, scan } from 'rxjs/operators';
|
|
2
|
+
import { range } from 'rxjs';
|
|
3
|
+
import { iteratesObservable as iterateObservable } from '../observables/iterates';
|
|
4
|
+
import { datumOf } from "../series/timeSeries";
|
|
5
|
+
const pointFrom = (x, y) => ({ x, y });
|
|
6
|
+
const emptyPoint = () => ({ x: NaN, y: NaN });
|
|
7
|
+
const isEmptyPoint = (point) => point === undefined || (isNaN(point.x) && isNaN(point.y));
|
|
8
|
+
const nonEmptyPoint = (point) => !isEmptyPoint(point);
|
|
9
|
+
const initialAccumulate = (n = 1) => ({ n, previous: [] });
|
|
10
|
+
/**
|
|
11
|
+
* Source for {@link Point} data that generates `x`-values from a range of 1 to `numPoints` and
|
|
12
|
+
* creates the `y`-values by applying the `valueFn` to those `x`-values.
|
|
13
|
+
* @param numPoints The number of points to generate
|
|
14
|
+
* @param valueFn The function that maps `x` to `y` (i.e. the value function is `f(x)` in `y = f(x)`)
|
|
15
|
+
* @return an observable of {@link Point}
|
|
16
|
+
*/
|
|
17
|
+
function pointsObservable(numPoints = 10, valueFn) {
|
|
18
|
+
return range(1, numPoints).pipe(map(value => pointFrom(value, valueFn(value))));
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
*
|
|
22
|
+
* @param n The number of points back from which to calculate the `n-difference`
|
|
23
|
+
* @param dataObservable Observable that is the source of the underlying data
|
|
24
|
+
* @param useStartX Whether to use the x-value from the beginning of the interval as the x-value
|
|
25
|
+
* for the difference (default), or whether to use the last x-value in the interval.
|
|
26
|
+
*/
|
|
27
|
+
function successiveDiffsObservable(n = 1, dataObservable, useStartX = true) {
|
|
28
|
+
return dataObservable
|
|
29
|
+
.pipe(scan(({ n, previous, }, current) => {
|
|
30
|
+
// when we have accumulated enough previous values to cover the "n-difference",
|
|
31
|
+
// we can calculate an actual difference
|
|
32
|
+
if (previous.length >= n) {
|
|
33
|
+
// add the new point, and take the first point from the beginning
|
|
34
|
+
previous.push(current);
|
|
35
|
+
const first = previous.shift() || emptyPoint();
|
|
36
|
+
// calculate the n-difference, using the x-value of the initial point (default)
|
|
37
|
+
// or the current point (end of current time-range
|
|
38
|
+
const difference = pointFrom(useStartX ? first.x : current.x, current.y - first.y);
|
|
39
|
+
return { n, previous, difference };
|
|
40
|
+
}
|
|
41
|
+
// not enough points yet, so just accumulate the current point
|
|
42
|
+
previous.push(current);
|
|
43
|
+
return { n, previous };
|
|
44
|
+
}, initialAccumulate(n)), filter(accum => nonEmptyPoint(accum.difference)), map(accum => accum.difference === undefined ? emptyPoint() : accum.difference));
|
|
45
|
+
}
|
|
46
|
+
describe('should be able to calculate successive differences', () => {
|
|
47
|
+
test('should be able to calc successive-diffs for x^2 where x is in 1..10', done => {
|
|
48
|
+
let results = [];
|
|
49
|
+
successiveDiffsObservable(1, pointsObservable(10, x => x * x), true).subscribe(point => results.push(point));
|
|
50
|
+
done();
|
|
51
|
+
expect(results).toHaveLength(9);
|
|
52
|
+
expect(results).toEqual([
|
|
53
|
+
{ x: 1, y: 3 },
|
|
54
|
+
{ x: 2, y: 5 },
|
|
55
|
+
{ x: 3, y: 7 },
|
|
56
|
+
{ x: 4, y: 9 },
|
|
57
|
+
{ x: 5, y: 11 },
|
|
58
|
+
{ x: 6, y: 13 },
|
|
59
|
+
{ x: 7, y: 15 },
|
|
60
|
+
{ x: 8, y: 17 },
|
|
61
|
+
{ x: 9, y: 19 },
|
|
62
|
+
]);
|
|
63
|
+
});
|
|
64
|
+
test('should be able to calc successive-diffs for x^2 where x is in 1..10 using interval end', done => {
|
|
65
|
+
let results = [];
|
|
66
|
+
successiveDiffsObservable(1, pointsObservable(10, x => x * x), false).subscribe(point => results.push(point));
|
|
67
|
+
done();
|
|
68
|
+
expect(results).toHaveLength(9);
|
|
69
|
+
expect(results).toEqual([
|
|
70
|
+
{ x: 2, y: 3 },
|
|
71
|
+
{ x: 3, y: 5 },
|
|
72
|
+
{ x: 4, y: 7 },
|
|
73
|
+
{ x: 5, y: 9 },
|
|
74
|
+
{ x: 6, y: 11 },
|
|
75
|
+
{ x: 7, y: 13 },
|
|
76
|
+
{ x: 8, y: 15 },
|
|
77
|
+
{ x: 9, y: 17 },
|
|
78
|
+
{ x: 10, y: 19 },
|
|
79
|
+
]);
|
|
80
|
+
});
|
|
81
|
+
test('should be able to calc 3-diffs for x^2 where x is in 1..10', done => {
|
|
82
|
+
let results = [];
|
|
83
|
+
successiveDiffsObservable(3, pointsObservable(10, x => x * x), true).subscribe(point => results.push(point));
|
|
84
|
+
done();
|
|
85
|
+
expect(results).toHaveLength(7);
|
|
86
|
+
expect(results).toEqual([
|
|
87
|
+
{ x: 1, y: 15 },
|
|
88
|
+
{ x: 2, y: 21 },
|
|
89
|
+
{ x: 3, y: 27 },
|
|
90
|
+
{ x: 4, y: 33 },
|
|
91
|
+
{ x: 5, y: 39 },
|
|
92
|
+
{ x: 6, y: 45 },
|
|
93
|
+
{ x: 7, y: 51 },
|
|
94
|
+
]);
|
|
95
|
+
});
|
|
96
|
+
test('should be able to calc 3-diffs for x^2 where x is in 1..10 using interval end', done => {
|
|
97
|
+
let results = [];
|
|
98
|
+
successiveDiffsObservable(3, pointsObservable(10, x => x * x), false).subscribe(point => results.push(point));
|
|
99
|
+
done();
|
|
100
|
+
expect(results).toHaveLength(7);
|
|
101
|
+
expect(results).toEqual([
|
|
102
|
+
{ x: 4, y: 15 },
|
|
103
|
+
{ x: 5, y: 21 },
|
|
104
|
+
{ x: 6, y: 27 },
|
|
105
|
+
{ x: 7, y: 33 },
|
|
106
|
+
{ x: 8, y: 39 },
|
|
107
|
+
{ x: 9, y: 45 },
|
|
108
|
+
{ x: 10, y: 51 },
|
|
109
|
+
]);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
/**
|
|
113
|
+
* Observable that converts data points into iterates for poincare plots where one plots x(j+n) vs x(j)
|
|
114
|
+
* @param n The n-th iterate for plotting x(j+n) vs x(j)
|
|
115
|
+
* @param dataObservable The observable with the point data
|
|
116
|
+
* @return an observable of a stream of {@link Point}s
|
|
117
|
+
*/
|
|
118
|
+
function iteratesObservable(n = 1, dataObservable) {
|
|
119
|
+
return dataObservable
|
|
120
|
+
.pipe(scan(({ n, previous, }, current) => {
|
|
121
|
+
// when we have accumulated enough previous values to cover the "n-iterate",
|
|
122
|
+
// we can grab the y-value from the n-th point back
|
|
123
|
+
if (previous.length >= n) {
|
|
124
|
+
// add the new point, and take the first point from the beginning
|
|
125
|
+
previous.push(pointFrom(previous[previous.length - 1].y, current.y));
|
|
126
|
+
const first = previous.shift() || emptyPoint();
|
|
127
|
+
// calculate the n-difference, using the x-value of the initial point (default)
|
|
128
|
+
// or the current point (end of current time-range
|
|
129
|
+
const iterate = pointFrom(first.y, current.y);
|
|
130
|
+
return { n, previous, difference: iterate };
|
|
131
|
+
}
|
|
132
|
+
// not enough points yet, so just accumulate the current point
|
|
133
|
+
previous.push(current);
|
|
134
|
+
return { n, previous };
|
|
135
|
+
}, initialAccumulate(n)), filter(accum => nonEmptyPoint(accum.difference)), map(accum => accum.difference === undefined ? emptyPoint() : accum.difference));
|
|
136
|
+
}
|
|
137
|
+
function tentFn(x, mu = 1) {
|
|
138
|
+
return x < 0.5 ? mu * x : mu * (1 - x);
|
|
139
|
+
}
|
|
140
|
+
describe('should be able to calculate iterates', () => {
|
|
141
|
+
test('should be able to calc 1-iterates for x^2 where x is in 1..10', done => {
|
|
142
|
+
let results = [];
|
|
143
|
+
iteratesObservable(1, pointsObservable(10, x => 2 * x)).subscribe(point => results.push(point));
|
|
144
|
+
done();
|
|
145
|
+
expect(results).toHaveLength(9);
|
|
146
|
+
expect(results).toEqual([
|
|
147
|
+
{ x: 2, y: 4 },
|
|
148
|
+
{ x: 4, y: 6 },
|
|
149
|
+
{ x: 6, y: 8 },
|
|
150
|
+
{ x: 8, y: 10 },
|
|
151
|
+
{ x: 10, y: 12 },
|
|
152
|
+
{ x: 12, y: 14 },
|
|
153
|
+
{ x: 14, y: 16 },
|
|
154
|
+
{ x: 16, y: 18 },
|
|
155
|
+
{ x: 18, y: 20 }
|
|
156
|
+
]);
|
|
157
|
+
});
|
|
158
|
+
test('should be able to calc 3-iterates for x^2 where x is in 1..10', done => {
|
|
159
|
+
let results = [];
|
|
160
|
+
iteratesObservable(3, pointsObservable(10, x => 2 * x)).subscribe(point => results.push(point));
|
|
161
|
+
done();
|
|
162
|
+
expect(results).toHaveLength(7);
|
|
163
|
+
expect(results).toEqual([
|
|
164
|
+
{ x: 2, y: 8 },
|
|
165
|
+
{ x: 4, y: 10 },
|
|
166
|
+
{ x: 6, y: 12 },
|
|
167
|
+
{ x: 8, y: 14 },
|
|
168
|
+
{ x: 10, y: 16 },
|
|
169
|
+
{ x: 12, y: 18 },
|
|
170
|
+
{ x: 14, y: 20 }
|
|
171
|
+
]);
|
|
172
|
+
});
|
|
173
|
+
test('tent map should converge to (0, 0) for mu < 1', done => {
|
|
174
|
+
const numPoints = 100000;
|
|
175
|
+
let lastPoint = emptyPoint();
|
|
176
|
+
iteratesObservable(1, range(0, numPoints).pipe(map(x => pointFrom(x, tentFn(x / numPoints, 0.15)))))
|
|
177
|
+
.subscribe(point => lastPoint = point);
|
|
178
|
+
done();
|
|
179
|
+
expect(lastPoint.y).toBeLessThan(1e-5);
|
|
180
|
+
expect(lastPoint.x).toBeLessThan(1e-5);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
describe('when calculating tent-map iterates with one new data point for each event', () => {
|
|
184
|
+
test('should be able to calc 1-iterates for tent-map chart data, when 1 point is added at a time', done => {
|
|
185
|
+
const numPoints = 10;
|
|
186
|
+
let results = [];
|
|
187
|
+
iterateObservable(range(0, numPoints).pipe(map(x => ({
|
|
188
|
+
maxTime: x,
|
|
189
|
+
maxTimes: new Map([['test1', x]]),
|
|
190
|
+
newPoints: new Map([['test1', [datumOf(x, tentFn(x / numPoints, 0.15))]]])
|
|
191
|
+
})))).subscribe(point => results.push(point));
|
|
192
|
+
done();
|
|
193
|
+
expect(results).toHaveLength(9);
|
|
194
|
+
//
|
|
195
|
+
// check the first iterate datum
|
|
196
|
+
expect(results[0].minIterate.iterateN).toEqual(0);
|
|
197
|
+
expect(results[0].minIterate.iterateN_1).toEqual(0.015);
|
|
198
|
+
expect(results[0].maxIterate.iterateN).toEqual(0);
|
|
199
|
+
expect(results[0].maxIterate.iterateN_1).toEqual(0.015);
|
|
200
|
+
expect(results[0].minIterates.has("test1")).toBe(true);
|
|
201
|
+
expect(results[0].minIterates.size).toEqual(1);
|
|
202
|
+
expect(results[0].minIterates.get("test1").time).toEqual(0);
|
|
203
|
+
expect(results[0].minIterates.get("test1").iterateN).toEqual(0);
|
|
204
|
+
expect(results[0].minIterates.get("test1").iterateN_1).toEqual(0.015);
|
|
205
|
+
expect(results[0].maxIterates.has("test1")).toBe(true);
|
|
206
|
+
expect(results[0].maxIterates.size).toEqual(1);
|
|
207
|
+
expect(results[0].maxIterates.get("test1").time).toEqual(0);
|
|
208
|
+
expect(results[0].maxIterates.get("test1").iterateN).toBeCloseTo(0, 4);
|
|
209
|
+
expect(results[0].maxIterates.get("test1").iterateN_1).toBeCloseTo(0.015, 4);
|
|
210
|
+
// check that the accumulator "newPoints" holds the previous "newPoints" for the iterate
|
|
211
|
+
expect(results[0].newPoints.has("test1")).toBe(true);
|
|
212
|
+
expect(results[0].newPoints.get("test1")).toHaveLength(1);
|
|
213
|
+
expect(results[0].newPoints.get("test1")[0].time).toEqual(0);
|
|
214
|
+
expect(results[0].newPoints.get("test1")[0].iterateN).toEqual(0);
|
|
215
|
+
expect(results[0].newPoints.get("test1")[0].iterateN_1).toBeCloseTo(0.015, 4);
|
|
216
|
+
//
|
|
217
|
+
// check the last iterate datum
|
|
218
|
+
expect(results[8].minIterate.time).toEqual(8);
|
|
219
|
+
expect(results[8].minIterate.iterateN).toEqual(0);
|
|
220
|
+
expect(results[8].minIterate.iterateN_1).toBeCloseTo(0.015, 4);
|
|
221
|
+
expect(results[8].maxIterate.time).toEqual(5);
|
|
222
|
+
expect(results[8].maxIterate.iterateN).toBeCloseTo(0.075, 4);
|
|
223
|
+
expect(results[8].maxIterate.iterateN_1).toBeCloseTo(0.075, 4);
|
|
224
|
+
expect(results[8].minIterates.has("test1")).toBe(true);
|
|
225
|
+
expect(results[8].minIterates.size).toEqual(1);
|
|
226
|
+
expect(results[8].minIterates.get("test1").time).toEqual(8);
|
|
227
|
+
expect(results[8].minIterates.get("test1").iterateN).toEqual(0);
|
|
228
|
+
expect(results[8].minIterates.get("test1").iterateN_1).toBeCloseTo(0.015, 4);
|
|
229
|
+
expect(results[8].maxIterates.has("test1")).toBe(true);
|
|
230
|
+
expect(results[8].maxIterates.size).toEqual(1);
|
|
231
|
+
expect(results[8].maxIterates.get("test1").time).toEqual(5);
|
|
232
|
+
expect(results[8].maxIterates.get("test1").iterateN).toBeCloseTo(0.075, 4);
|
|
233
|
+
expect(results[8].maxIterates.get("test1").iterateN_1).toBeCloseTo(0.075, 4);
|
|
234
|
+
// check that the accumulator "newPoints" holds the previous "newPoints" for the iterate
|
|
235
|
+
expect(results[8].newPoints.has("test1")).toBe(true);
|
|
236
|
+
expect(results[8].newPoints.get("test1")).toHaveLength(1);
|
|
237
|
+
expect(results[8].newPoints.get("test1")[0].time).toEqual(8);
|
|
238
|
+
expect(results[8].newPoints.get("test1")[0].iterateN).toBeCloseTo(0.03, 4);
|
|
239
|
+
expect(results[8].newPoints.get("test1")[0].iterateN_1).toBeCloseTo(0.015, 4);
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
describe('when calculating tent-map 1-iterates with two new data points for each event', () => {
|
|
243
|
+
test('should be able to calc iterates for tent-map chart data, when 2 points are added at a time', done => {
|
|
244
|
+
const numPoints = 5;
|
|
245
|
+
let results = [];
|
|
246
|
+
iterateObservable(range(0, numPoints)
|
|
247
|
+
.pipe(map(x => ({
|
|
248
|
+
maxTime: 2 * x,
|
|
249
|
+
maxTimes: new Map([['test1', 2 * x]]),
|
|
250
|
+
newPoints: new Map([
|
|
251
|
+
['test1', [datumOf(2 * x, tentFn(2 * x / (2 * numPoints), 0.15)), datumOf(2 * x + 1, tentFn((2 * x + 1) / (2 * numPoints), 0.15))]],
|
|
252
|
+
])
|
|
253
|
+
}))))
|
|
254
|
+
.subscribe(result => results.push(result));
|
|
255
|
+
done();
|
|
256
|
+
expect(results).toHaveLength(5);
|
|
257
|
+
expect(results.reduce((count, result) => result.newPoints.get("test1").length + count, 0)).toEqual(9);
|
|
258
|
+
//
|
|
259
|
+
// check the first iterate datum
|
|
260
|
+
expect(results[0].minIterate.iterateN).toBeCloseTo(0, 4);
|
|
261
|
+
expect(results[0].minIterate.iterateN_1).toBeCloseTo(0.015, 4);
|
|
262
|
+
expect(results[0].maxIterate.iterateN).toBeCloseTo(0, 4);
|
|
263
|
+
expect(results[0].maxIterate.iterateN_1).toBeCloseTo(0.015, 4);
|
|
264
|
+
expect(results[0].minIterates.has("test1")).toBe(true);
|
|
265
|
+
expect(results[0].minIterates.size).toEqual(1);
|
|
266
|
+
expect(results[0].minIterates.get("test1").time).toBeCloseTo(0, 4);
|
|
267
|
+
expect(results[0].minIterates.get("test1").iterateN).toBeCloseTo(0, 4);
|
|
268
|
+
expect(results[0].minIterates.get("test1").iterateN_1).toBeCloseTo(0.015, 4);
|
|
269
|
+
expect(results[0].maxIterates.has("test1")).toBe(true);
|
|
270
|
+
expect(results[0].maxIterates.size).toEqual(1);
|
|
271
|
+
expect(results[0].maxIterates.get("test1").time).toEqual(0);
|
|
272
|
+
expect(results[0].maxIterates.get("test1").iterateN).toBeCloseTo(0, 4);
|
|
273
|
+
expect(results[0].maxIterates.get("test1").iterateN_1).toBeCloseTo(0.015, 4);
|
|
274
|
+
// check that the accumulator "newPoints" holds the previous "newPoints" for the iterate
|
|
275
|
+
expect(results[0].newPoints.has("test1")).toBe(true);
|
|
276
|
+
expect(results[0].newPoints.get("test1")).toHaveLength(1);
|
|
277
|
+
expect(results[0].newPoints.get("test1")[0].time).toEqual(0);
|
|
278
|
+
expect(results[0].newPoints.get("test1")[0].iterateN).toEqual(0);
|
|
279
|
+
expect(results[0].newPoints.get("test1")[0].iterateN_1).toBeCloseTo(0.015, 4);
|
|
280
|
+
//
|
|
281
|
+
// check the last iterate datum
|
|
282
|
+
expect(results[4].minIterate.time).toEqual(8);
|
|
283
|
+
expect(results[4].minIterate.iterateN).toEqual(0);
|
|
284
|
+
expect(results[4].minIterate.iterateN_1).toBeCloseTo(0.015, 4);
|
|
285
|
+
expect(results[4].maxIterate.time).toEqual(5);
|
|
286
|
+
expect(results[4].maxIterate.iterateN).toBeCloseTo(0.075, 4);
|
|
287
|
+
expect(results[4].maxIterate.iterateN_1).toBeCloseTo(0.075, 4);
|
|
288
|
+
expect(results[4].minIterates.size).toEqual(1);
|
|
289
|
+
expect(results[4].minIterates.has("test1")).toBe(true);
|
|
290
|
+
expect(results[4].minIterates.get("test1").time).toEqual(8);
|
|
291
|
+
expect(results[4].minIterates.get("test1").iterateN).toEqual(0);
|
|
292
|
+
expect(results[4].minIterates.get("test1").iterateN_1).toBeCloseTo(0.015, 4);
|
|
293
|
+
expect(results[4].maxIterates.size).toEqual(1);
|
|
294
|
+
expect(results[4].maxIterates.has("test1")).toBe(true);
|
|
295
|
+
expect(results[4].maxIterates.get("test1").time).toEqual(5);
|
|
296
|
+
expect(results[4].maxIterates.get("test1").iterateN).toBeCloseTo(0.075, 4);
|
|
297
|
+
expect(results[4].maxIterates.get("test1").iterateN_1).toBeCloseTo(0.075, 4);
|
|
298
|
+
// check that the accumulator "newPoints" holds the previous "newPoints" for the iterate
|
|
299
|
+
expect(results[4].newPoints.has("test1")).toBe(true);
|
|
300
|
+
expect(results[4].newPoints.get("test1")).toHaveLength(2);
|
|
301
|
+
expect(results[4].newPoints.get("test1")[1].time).toEqual(8);
|
|
302
|
+
expect(results[4].newPoints.get("test1")[1].iterateN).toBeCloseTo(0.03, 4);
|
|
303
|
+
expect(results[4].newPoints.get("test1")[1].iterateN_1).toBeCloseTo(0.015, 4);
|
|
304
|
+
});
|
|
305
|
+
test('should be able to calc iterates for tent-map chart data, when 2 points are added at a time, with 2 series', done => {
|
|
306
|
+
const numPoints = 5;
|
|
307
|
+
let results = [];
|
|
308
|
+
iterateObservable(range(0, numPoints)
|
|
309
|
+
.pipe(map(x => ({
|
|
310
|
+
maxTime: 2 * x,
|
|
311
|
+
maxTimes: new Map([['test1', 2 * x]]),
|
|
312
|
+
newPoints: new Map([
|
|
313
|
+
['test1', [datumOf(2 * x, tentFn(2 * x / (2 * numPoints), 0.15)), datumOf(2 * x + 1, tentFn((2 * x + 1) / (2 * numPoints), 0.15))]],
|
|
314
|
+
['test2', [datumOf(2 * x, tentFn(2 * x / (2 * numPoints), 0.35)), datumOf(2 * x + 1, tentFn((2 * x + 1) / (2 * numPoints), 0.35))]],
|
|
315
|
+
])
|
|
316
|
+
}))))
|
|
317
|
+
.subscribe(result => results.push(result));
|
|
318
|
+
done();
|
|
319
|
+
expect(results).toHaveLength(5);
|
|
320
|
+
expect(results.reduce((count, result) => result.newPoints.get("test1").length + count, 0)).toEqual(9);
|
|
321
|
+
//
|
|
322
|
+
// check the first iterate datum
|
|
323
|
+
expect(results[0].minIterate.iterateN).toBeCloseTo(0, 4);
|
|
324
|
+
expect(results[0].minIterate.iterateN_1).toBeCloseTo(0.015, 4);
|
|
325
|
+
expect(results[0].maxIterate.iterateN).toBeCloseTo(0, 4);
|
|
326
|
+
expect(results[0].maxIterate.iterateN_1).toBeCloseTo(0.035, 4);
|
|
327
|
+
expect(results[0].minIterates.size).toEqual(2);
|
|
328
|
+
expect(results[0].minIterates.has("test1")).toBe(true);
|
|
329
|
+
expect(results[0].minIterates.get("test1").time).toBeCloseTo(0, 4);
|
|
330
|
+
expect(results[0].minIterates.get("test1").iterateN).toBeCloseTo(0, 4);
|
|
331
|
+
expect(results[0].minIterates.get("test1").iterateN_1).toBeCloseTo(0.015, 4);
|
|
332
|
+
expect(results[0].minIterates.has("test2")).toBe(true);
|
|
333
|
+
expect(results[0].minIterates.get("test2").time).toBeCloseTo(0, 4);
|
|
334
|
+
expect(results[0].minIterates.get("test2").iterateN).toBeCloseTo(0, 4);
|
|
335
|
+
expect(results[0].minIterates.get("test2").iterateN_1).toBeCloseTo(0.035, 4);
|
|
336
|
+
expect(results[0].maxIterates.size).toEqual(2);
|
|
337
|
+
expect(results[0].maxIterates.has("test1")).toBe(true);
|
|
338
|
+
expect(results[0].maxIterates.get("test1").time).toEqual(0);
|
|
339
|
+
expect(results[0].maxIterates.get("test1").iterateN).toBeCloseTo(0, 4);
|
|
340
|
+
expect(results[0].maxIterates.get("test1").iterateN_1).toBeCloseTo(0.015, 4);
|
|
341
|
+
expect(results[0].maxIterates.has("test2")).toBe(true);
|
|
342
|
+
expect(results[0].maxIterates.get("test2").time).toEqual(0);
|
|
343
|
+
expect(results[0].maxIterates.get("test2").iterateN).toBeCloseTo(0, 4);
|
|
344
|
+
expect(results[0].maxIterates.get("test2").iterateN_1).toBeCloseTo(0.035, 4);
|
|
345
|
+
// check that the accumulator "newPoints" holds the previous "newPoints" for the iterate
|
|
346
|
+
expect(results[0].newPoints.has("test1")).toBe(true);
|
|
347
|
+
expect(results[0].newPoints.get("test1")).toHaveLength(1);
|
|
348
|
+
expect(results[0].newPoints.get("test1")[0].time).toEqual(0);
|
|
349
|
+
expect(results[0].newPoints.get("test1")[0].iterateN).toEqual(0);
|
|
350
|
+
expect(results[0].newPoints.get("test1")[0].iterateN_1).toBeCloseTo(0.015, 4);
|
|
351
|
+
expect(results[0].newPoints.has("test2")).toBe(true);
|
|
352
|
+
expect(results[0].newPoints.get("test2")).toHaveLength(1);
|
|
353
|
+
expect(results[0].newPoints.get("test2")[0].time).toEqual(0);
|
|
354
|
+
expect(results[0].newPoints.get("test2")[0].iterateN).toEqual(0);
|
|
355
|
+
expect(results[0].newPoints.get("test2")[0].iterateN_1).toBeCloseTo(0.035, 4);
|
|
356
|
+
//
|
|
357
|
+
// check the last iterate datum
|
|
358
|
+
expect(results[4].minIterate.time).toEqual(8);
|
|
359
|
+
expect(results[4].minIterate.iterateN).toEqual(0);
|
|
360
|
+
expect(results[4].minIterate.iterateN_1).toBeCloseTo(0.015, 4);
|
|
361
|
+
expect(results[4].maxIterate.time).toEqual(5);
|
|
362
|
+
expect(results[4].maxIterate.iterateN).toBeCloseTo(0.175, 4);
|
|
363
|
+
expect(results[4].maxIterate.iterateN_1).toBeCloseTo(0.175, 4);
|
|
364
|
+
expect(results[4].minIterates.size).toEqual(2);
|
|
365
|
+
expect(results[4].minIterates.has("test1")).toBe(true);
|
|
366
|
+
expect(results[4].minIterates.get("test1").time).toEqual(8);
|
|
367
|
+
expect(results[4].minIterates.get("test1").iterateN).toEqual(0);
|
|
368
|
+
expect(results[4].minIterates.get("test1").iterateN_1).toBeCloseTo(0.015, 4);
|
|
369
|
+
expect(results[4].minIterates.has("test2")).toBe(true);
|
|
370
|
+
expect(results[4].minIterates.get("test2").time).toEqual(8);
|
|
371
|
+
expect(results[4].minIterates.get("test2").iterateN).toEqual(0);
|
|
372
|
+
expect(results[4].minIterates.get("test2").iterateN_1).toBeCloseTo(0.035, 4);
|
|
373
|
+
expect(results[4].maxIterates.size).toEqual(2);
|
|
374
|
+
expect(results[4].maxIterates.has("test1")).toBe(true);
|
|
375
|
+
expect(results[4].maxIterates.get("test1").time).toEqual(5);
|
|
376
|
+
expect(results[4].maxIterates.get("test1").iterateN).toBeCloseTo(0.075, 4);
|
|
377
|
+
expect(results[4].maxIterates.get("test1").iterateN_1).toBeCloseTo(0.075, 4);
|
|
378
|
+
expect(results[4].maxIterates.has("test2")).toBe(true);
|
|
379
|
+
expect(results[4].maxIterates.get("test2").time).toEqual(5);
|
|
380
|
+
expect(results[4].maxIterates.get("test2").iterateN).toBeCloseTo(0.175, 4);
|
|
381
|
+
expect(results[4].maxIterates.get("test2").iterateN_1).toBeCloseTo(0.175, 4);
|
|
382
|
+
// check that the accumulator "newPoints" holds the previous "newPoints" for the iterate
|
|
383
|
+
expect(results[4].newPoints.has("test1")).toBe(true);
|
|
384
|
+
expect(results[4].newPoints.get("test1")).toHaveLength(2);
|
|
385
|
+
expect(results[4].newPoints.get("test1")[1].time).toEqual(8);
|
|
386
|
+
expect(results[4].newPoints.get("test1")[1].iterateN).toBeCloseTo(0.03, 4);
|
|
387
|
+
expect(results[4].newPoints.get("test1")[1].iterateN_1).toBeCloseTo(0.015, 4);
|
|
388
|
+
expect(results[4].newPoints.has("test2")).toBe(true);
|
|
389
|
+
expect(results[4].newPoints.get("test2")).toHaveLength(2);
|
|
390
|
+
expect(results[4].newPoints.get("test2")[1].time).toEqual(8);
|
|
391
|
+
expect(results[4].newPoints.get("test2")[1].iterateN).toBeCloseTo(0.07, 4);
|
|
392
|
+
expect(results[4].newPoints.get("test2")[1].iterateN_1).toBeCloseTo(0.035, 4);
|
|
393
|
+
});
|
|
394
|
+
});
|
|
395
|
+
//# sourceMappingURL=subscription.test.js.map
|