stream-charts 1.0.1 → 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.
Files changed (271) hide show
  1. package/README.md +756 -343
  2. package/changes.md +7 -0
  3. package/dist/src/app/charts/Chart.d.ts +116 -87
  4. package/dist/src/app/charts/Chart.js +96 -101
  5. package/dist/src/app/charts/Chart.js.map +1 -1
  6. package/dist/src/app/charts/axes/AxesState.d.ts +64 -0
  7. package/dist/src/app/charts/axes/AxesState.js +97 -0
  8. package/dist/src/app/charts/axes/AxesState.js.map +1 -0
  9. package/dist/src/app/charts/axes/AxesState.test.js +30 -0
  10. package/dist/src/app/charts/axes/AxesState.test.js.map +1 -0
  11. package/dist/src/app/charts/axes/AxisInterval.d.ts +92 -0
  12. package/dist/src/app/charts/axes/AxisInterval.js +126 -0
  13. package/dist/src/app/charts/axes/AxisInterval.js.map +1 -0
  14. package/dist/src/app/charts/axes/AxisInterval.test.js +120 -0
  15. package/dist/src/app/charts/axes/AxisInterval.test.js.map +1 -0
  16. package/dist/src/app/charts/axes/BaseAxisRange.d.ts +83 -0
  17. package/dist/src/app/charts/axes/BaseAxisRange.js +58 -0
  18. package/dist/src/app/charts/axes/BaseAxisRange.js.map +1 -0
  19. package/dist/src/app/charts/axes/ContinuousAxis.d.ts +22 -0
  20. package/dist/src/app/charts/axes/ContinuousAxis.js +96 -0
  21. package/dist/src/app/charts/axes/ContinuousAxis.js.map +1 -0
  22. package/dist/src/app/charts/axes/ContinuousAxisRange.d.ts +59 -0
  23. package/dist/src/app/charts/axes/ContinuousAxisRange.js +84 -0
  24. package/dist/src/app/charts/axes/ContinuousAxisRange.js.map +1 -0
  25. package/dist/src/app/charts/axes/ContinuousAxisRange.test.js +47 -0
  26. package/dist/src/app/charts/axes/ContinuousAxisRange.test.js.map +1 -0
  27. package/dist/src/app/charts/axes/OrdinalAxis.d.ts +23 -0
  28. package/dist/src/app/charts/axes/OrdinalAxis.js +124 -0
  29. package/dist/src/app/charts/axes/OrdinalAxis.js.map +1 -0
  30. package/dist/src/app/charts/axes/OrdinalAxisRange.d.ts +69 -0
  31. package/dist/src/app/charts/axes/OrdinalAxisRange.js +100 -0
  32. package/dist/src/app/charts/axes/OrdinalAxisRange.js.map +1 -0
  33. package/dist/src/app/charts/axes/OrdinalAxisRange.test.js +48 -0
  34. package/dist/src/app/charts/axes/OrdinalAxisRange.test.js.map +1 -0
  35. package/dist/src/app/charts/axes/axes.d.ts +391 -0
  36. package/dist/src/app/charts/axes/axes.js +1046 -0
  37. package/dist/src/app/charts/axes/axes.js.map +1 -0
  38. package/dist/src/app/charts/d3types.d.ts +10 -10
  39. package/dist/src/app/charts/filters/regexFilter.d.ts +9 -0
  40. package/dist/src/app/charts/filters/regexFilter.js +18 -0
  41. package/dist/src/app/charts/filters/regexFilter.js.map +1 -0
  42. package/dist/src/app/charts/filters/regexFilter.test.d.ts +1 -0
  43. package/dist/src/app/charts/filters/regexFilter.test.js +11 -0
  44. package/dist/src/app/charts/filters/regexFilter.test.js.map +1 -0
  45. package/dist/src/app/charts/hooks/useAxes.d.ts +144 -0
  46. package/dist/src/app/charts/hooks/useAxes.js +187 -0
  47. package/dist/src/app/charts/hooks/useAxes.js.map +1 -0
  48. package/dist/src/app/charts/hooks/useChart.d.ts +30 -201
  49. package/dist/src/app/charts/hooks/useChart.js +33 -134
  50. package/dist/src/app/charts/hooks/useChart.js.map +1 -1
  51. package/dist/src/app/charts/hooks/useDataObservable.d.ts +74 -0
  52. package/dist/src/app/charts/hooks/useDataObservable.js +76 -0
  53. package/dist/src/app/charts/hooks/useDataObservable.js.map +1 -0
  54. package/dist/src/app/charts/hooks/useInitialData.d.ts +38 -0
  55. package/dist/src/app/charts/hooks/useInitialData.js +29 -0
  56. package/dist/src/app/charts/hooks/useInitialData.js.map +1 -0
  57. package/dist/src/app/charts/hooks/useMouse.d.ts +53 -0
  58. package/dist/src/app/charts/hooks/useMouse.js +65 -0
  59. package/dist/src/app/charts/hooks/useMouse.js.map +1 -0
  60. package/dist/src/app/charts/hooks/usePlotDimensions.d.ts +34 -0
  61. package/dist/src/app/charts/hooks/usePlotDimensions.js +73 -0
  62. package/dist/src/app/charts/hooks/usePlotDimensions.js.map +1 -0
  63. package/dist/src/app/charts/hooks/useTooltip.d.ts +64 -0
  64. package/dist/src/app/charts/hooks/useTooltip.js +52 -0
  65. package/dist/src/app/charts/hooks/useTooltip.js.map +1 -0
  66. package/dist/src/app/charts/observables/ChartData.d.ts +23 -0
  67. package/dist/src/app/charts/observables/ChartData.js +20 -0
  68. package/dist/src/app/charts/observables/ChartData.js.map +1 -0
  69. package/dist/src/app/charts/observables/iterates.d.ts +52 -0
  70. package/dist/src/app/charts/observables/iterates.js +121 -0
  71. package/dist/src/app/charts/observables/iterates.js.map +1 -0
  72. package/dist/src/app/charts/observables/iterates.test.d.ts +1 -0
  73. package/dist/src/app/charts/observables/iterates.test.js +180 -0
  74. package/dist/src/app/charts/observables/iterates.test.js.map +1 -0
  75. package/dist/src/app/charts/observables/ordinals.d.ts +75 -0
  76. package/dist/src/app/charts/observables/ordinals.js +141 -0
  77. package/dist/src/app/charts/observables/ordinals.js.map +1 -0
  78. package/dist/src/app/charts/observables/ordinals.test.d.ts +1 -0
  79. package/dist/src/app/charts/observables/ordinals.test.js +102 -0
  80. package/dist/src/app/charts/observables/ordinals.test.js.map +1 -0
  81. package/dist/src/app/charts/plots/BarPlot.d.ts +81 -0
  82. package/dist/src/app/charts/plots/BarPlot.js +557 -0
  83. package/dist/src/app/charts/plots/BarPlot.js.map +1 -0
  84. package/dist/src/app/charts/plots/PoincarePlot.d.ts +78 -0
  85. package/dist/src/app/charts/plots/PoincarePlot.js +504 -0
  86. package/dist/src/app/charts/plots/PoincarePlot.js.map +1 -0
  87. package/dist/src/app/charts/{RasterPlot.d.ts → plots/RasterPlot.d.ts} +1 -1
  88. package/dist/src/app/charts/{RasterPlot.js → plots/RasterPlot.js} +152 -133
  89. package/dist/src/app/charts/plots/RasterPlot.js.map +1 -0
  90. package/dist/src/app/charts/{ScatterPlot.d.ts → plots/ScatterPlot.d.ts} +10 -8
  91. package/dist/src/app/charts/plots/ScatterPlot.js +379 -0
  92. package/dist/src/app/charts/plots/ScatterPlot.js.map +1 -0
  93. package/dist/src/app/charts/{plot.d.ts → plots/plot.d.ts} +12 -14
  94. package/dist/src/app/charts/{plot.js → plots/plot.js} +19 -17
  95. package/dist/src/app/charts/plots/plot.js.map +1 -0
  96. package/dist/src/app/charts/series/baseSeries.d.ts +38 -0
  97. package/dist/src/app/charts/series/baseSeries.js +36 -0
  98. package/dist/src/app/charts/series/baseSeries.js.map +1 -0
  99. package/dist/src/app/charts/series/datumSeries.test.d.ts +1 -0
  100. package/dist/src/app/charts/series/datumSeries.test.js +50 -0
  101. package/dist/src/app/charts/series/datumSeries.test.js.map +1 -0
  102. package/dist/src/app/charts/series/iterateSeries.d.ts +42 -0
  103. package/dist/src/app/charts/series/iterateSeries.js +34 -0
  104. package/dist/src/app/charts/series/iterateSeries.js.map +1 -0
  105. package/dist/src/app/charts/series/ordinalSeries.d.ts +54 -0
  106. package/dist/src/app/charts/series/ordinalSeries.js +98 -0
  107. package/dist/src/app/charts/series/ordinalSeries.js.map +1 -0
  108. package/dist/src/app/charts/series/timeSeries.d.ts +30 -0
  109. package/dist/src/app/charts/series/timeSeries.js +19 -0
  110. package/dist/src/app/charts/series/timeSeries.js.map +1 -0
  111. package/dist/src/app/charts/{chartData.d.ts → series/timeSeriesChartData.d.ts} +11 -6
  112. package/dist/src/app/charts/series/timeSeriesChartData.js +32 -0
  113. package/dist/src/app/charts/series/timeSeriesChartData.js.map +1 -0
  114. package/dist/src/app/charts/styling/barPlotStyle.d.ts +41 -0
  115. package/dist/src/app/charts/styling/barPlotStyle.js +84 -0
  116. package/dist/src/app/charts/styling/barPlotStyle.js.map +1 -0
  117. package/dist/src/app/charts/{margins.d.ts → styling/margins.d.ts} +7 -5
  118. package/dist/src/app/charts/{margins.js → styling/margins.js} +19 -9
  119. package/dist/src/app/charts/styling/margins.js.map +1 -0
  120. package/dist/src/app/charts/styling/margins.test.d.ts +1 -0
  121. package/dist/src/app/charts/styling/margins.test.js +19 -0
  122. package/dist/src/app/charts/styling/margins.test.js.map +1 -0
  123. package/dist/src/app/charts/styling/svgStyle.d.ts +76 -0
  124. package/dist/src/app/charts/styling/svgStyle.js +84 -0
  125. package/dist/src/app/charts/styling/svgStyle.js.map +1 -0
  126. package/dist/src/app/charts/subscriptions/subscription.test.d.ts +1 -0
  127. package/dist/src/app/charts/subscriptions/subscription.test.js +395 -0
  128. package/dist/src/app/charts/subscriptions/subscription.test.js.map +1 -0
  129. package/dist/src/app/charts/subscriptions/subscriptions.d.ts +100 -0
  130. package/dist/src/app/charts/subscriptions/subscriptions.js +449 -0
  131. package/dist/src/app/charts/subscriptions/subscriptions.js.map +1 -0
  132. package/dist/src/app/charts/tooltips/BarPlotTooltipContent.d.ts +90 -0
  133. package/dist/src/app/charts/tooltips/BarPlotTooltipContent.js +302 -0
  134. package/dist/src/app/charts/tooltips/BarPlotTooltipContent.js.map +1 -0
  135. package/dist/src/app/charts/tooltips/PoincarePlotTooltipContent.d.ts +100 -0
  136. package/dist/src/app/charts/tooltips/PoincarePlotTooltipContent.js +190 -0
  137. package/dist/src/app/charts/tooltips/PoincarePlotTooltipContent.js.map +1 -0
  138. package/dist/src/app/charts/{RasterPlotTooltipContent.js → tooltips/RasterPlotTooltipContent.js} +40 -44
  139. package/dist/src/app/charts/tooltips/RasterPlotTooltipContent.js.map +1 -0
  140. package/dist/src/app/charts/tooltips/ScatterPlotTooltipContent.js +154 -0
  141. package/dist/src/app/charts/tooltips/ScatterPlotTooltipContent.js.map +1 -0
  142. package/dist/src/app/charts/{Tooltip.d.ts → tooltips/Tooltip.d.ts} +4 -2
  143. package/dist/src/app/charts/{Tooltip.js → tooltips/Tooltip.js} +23 -28
  144. package/dist/src/app/charts/tooltips/Tooltip.js.map +1 -0
  145. package/dist/src/app/charts/{tooltipUtils.d.ts → tooltips/tooltipUtils.d.ts} +11 -6
  146. package/dist/src/app/charts/{tooltipUtils.js → tooltips/tooltipUtils.js} +33 -17
  147. package/dist/src/app/charts/tooltips/tooltipUtils.js.map +1 -0
  148. package/dist/src/app/charts/{Tracker.d.ts → trackers/Tracker.d.ts} +6 -5
  149. package/dist/src/app/charts/trackers/Tracker.js +60 -0
  150. package/dist/src/app/charts/trackers/Tracker.js.map +1 -0
  151. package/dist/src/app/charts/{trackerUtils.d.ts → trackers/trackerUtils.d.ts} +13 -8
  152. package/dist/src/app/charts/trackers/trackerUtils.js +359 -0
  153. package/dist/src/app/charts/trackers/trackerUtils.js.map +1 -0
  154. package/dist/src/app/charts/utils.d.ts +22 -32
  155. package/dist/src/app/charts/utils.js +36 -37
  156. package/dist/src/app/charts/utils.js.map +1 -1
  157. package/dist/src/index.d.ts +48 -15
  158. package/dist/src/index.js +71 -15
  159. package/dist/src/index.js.map +1 -1
  160. package/package.json +30 -20
  161. package/src/app/charts/Chart.tsx +334 -0
  162. package/src/app/charts/axes/AxesState.test.ts +34 -0
  163. package/src/app/charts/axes/AxesState.ts +112 -0
  164. package/src/app/charts/axes/AxisInterval.test.ts +143 -0
  165. package/src/app/charts/axes/AxisInterval.ts +139 -0
  166. package/src/app/charts/axes/BaseAxisRange.ts +113 -0
  167. package/src/app/charts/axes/ContinuousAxis.tsx +192 -0
  168. package/src/app/charts/axes/ContinuousAxisRange.test.ts +55 -0
  169. package/src/app/charts/axes/ContinuousAxisRange.ts +96 -0
  170. package/src/app/charts/axes/OrdinalAxis.tsx +223 -0
  171. package/src/app/charts/axes/OrdinalAxisRange.test.ts +55 -0
  172. package/src/app/charts/axes/OrdinalAxisRange.ts +112 -0
  173. package/src/app/charts/axes/axes.ts +1569 -0
  174. package/src/app/charts/d3types.ts +16 -0
  175. package/src/app/charts/filters/regexFilter.test.ts +13 -0
  176. package/src/app/charts/filters/regexFilter.ts +17 -0
  177. package/src/app/charts/hooks/useAxes.tsx +341 -0
  178. package/src/app/charts/hooks/useChart.tsx +159 -0
  179. package/src/app/charts/hooks/useDataObservable.tsx +175 -0
  180. package/src/app/charts/hooks/useInitialData.tsx +65 -0
  181. package/src/app/charts/hooks/useMouse.tsx +125 -0
  182. package/src/app/charts/hooks/usePlotDimensions.tsx +120 -0
  183. package/src/app/charts/hooks/useTooltip.tsx +112 -0
  184. package/src/app/charts/observables/ChartData.ts +31 -0
  185. package/src/app/charts/observables/iterates.test.ts +201 -0
  186. package/src/app/charts/observables/iterates.ts +203 -0
  187. package/src/app/charts/observables/ordinals.test.ts +135 -0
  188. package/src/app/charts/observables/ordinals.ts +248 -0
  189. package/src/app/charts/plots/BarPlot.tsx +1088 -0
  190. package/src/app/charts/plots/PoincarePlot.tsx +832 -0
  191. package/src/app/charts/plots/RasterPlot.tsx +676 -0
  192. package/src/app/charts/plots/ScatterPlot.tsx +653 -0
  193. package/src/app/charts/plots/plot.ts +75 -0
  194. package/src/app/charts/series/baseSeries.ts +52 -0
  195. package/src/app/charts/series/datumSeries.test.ts +60 -0
  196. package/src/app/charts/series/iterateSeries.ts +56 -0
  197. package/src/app/charts/series/ordinalSeries.ts +164 -0
  198. package/src/app/charts/series/timeSeries.ts +40 -0
  199. package/src/app/charts/series/timeSeriesChartData.ts +68 -0
  200. package/src/app/charts/styling/barPlotStyle.ts +126 -0
  201. package/src/app/charts/styling/margins.test.ts +22 -0
  202. package/src/app/charts/styling/margins.ts +58 -0
  203. package/src/app/charts/styling/svgStyle.ts +118 -0
  204. package/src/app/charts/subscriptions/subscription.test.ts +499 -0
  205. package/src/app/charts/subscriptions/subscriptions.ts +635 -0
  206. package/src/app/charts/tooltips/BarPlotTooltipContent.tsx +440 -0
  207. package/src/app/charts/tooltips/PoincarePlotTooltipContent.tsx +352 -0
  208. package/src/app/charts/tooltips/RasterPlotTooltipContent.tsx +274 -0
  209. package/src/app/charts/tooltips/ScatterPlotTooltipContent.tsx +319 -0
  210. package/src/app/charts/tooltips/Tooltip.tsx +148 -0
  211. package/src/app/charts/tooltips/tooltipUtils.ts +216 -0
  212. package/src/app/charts/trackers/Tracker.tsx +129 -0
  213. package/src/app/charts/trackers/trackerUtils.ts +494 -0
  214. package/src/app/charts/utils.ts +109 -0
  215. package/dist/src/app/charts/CategoryAxis.d.ts +0 -20
  216. package/dist/src/app/charts/CategoryAxis.js +0 -112
  217. package/dist/src/app/charts/CategoryAxis.js.map +0 -1
  218. package/dist/src/app/charts/ContinuousAxis.d.ts +0 -16
  219. package/dist/src/app/charts/ContinuousAxis.js +0 -186
  220. package/dist/src/app/charts/ContinuousAxis.js.map +0 -1
  221. package/dist/src/app/charts/RasterPlot.js.map +0 -1
  222. package/dist/src/app/charts/RasterPlotTooltipContent.js.map +0 -1
  223. package/dist/src/app/charts/ScatterPlot.js +0 -351
  224. package/dist/src/app/charts/ScatterPlot.js.map +0 -1
  225. package/dist/src/app/charts/ScatterPlotTooltipContent.js +0 -163
  226. package/dist/src/app/charts/ScatterPlotTooltipContent.js.map +0 -1
  227. package/dist/src/app/charts/Tooltip.js.map +0 -1
  228. package/dist/src/app/charts/Tracker.js +0 -65
  229. package/dist/src/app/charts/Tracker.js.map +0 -1
  230. package/dist/src/app/charts/axes.d.ts +0 -132
  231. package/dist/src/app/charts/axes.js +0 -265
  232. package/dist/src/app/charts/axes.js.map +0 -1
  233. package/dist/src/app/charts/chartData.js +0 -32
  234. package/dist/src/app/charts/chartData.js.map +0 -1
  235. package/dist/src/app/charts/continuousAxisRangeFor.d.ts +0 -20
  236. package/dist/src/app/charts/continuousAxisRangeFor.js +0 -68
  237. package/dist/src/app/charts/continuousAxisRangeFor.js.map +0 -1
  238. package/dist/src/app/charts/datumSeries.d.ts +0 -59
  239. package/dist/src/app/charts/datumSeries.js +0 -55
  240. package/dist/src/app/charts/datumSeries.js.map +0 -1
  241. package/dist/src/app/charts/datumSeries.test.js +0 -50
  242. package/dist/src/app/charts/datumSeries.test.js.map +0 -1
  243. package/dist/src/app/charts/hooks/AxesState.d.ts +0 -37
  244. package/dist/src/app/charts/hooks/AxesState.js +0 -44
  245. package/dist/src/app/charts/hooks/AxesState.js.map +0 -1
  246. package/dist/src/app/charts/margins.js.map +0 -1
  247. package/dist/src/app/charts/margins.test.js +0 -14
  248. package/dist/src/app/charts/margins.test.js.map +0 -1
  249. package/dist/src/app/charts/plot.js.map +0 -1
  250. package/dist/src/app/charts/regexFilter.d.ts +0 -9
  251. package/dist/src/app/charts/regexFilter.js +0 -17
  252. package/dist/src/app/charts/regexFilter.js.map +0 -1
  253. package/dist/src/app/charts/regexFilter.test.js +0 -11
  254. package/dist/src/app/charts/regexFilter.test.js.map +0 -1
  255. package/dist/src/app/charts/subscriptions.d.ts +0 -43
  256. package/dist/src/app/charts/subscriptions.js +0 -213
  257. package/dist/src/app/charts/subscriptions.js.map +0 -1
  258. package/dist/src/app/charts/svgStyle.d.ts +0 -27
  259. package/dist/src/app/charts/svgStyle.js +0 -32
  260. package/dist/src/app/charts/svgStyle.js.map +0 -1
  261. package/dist/src/app/charts/timeRange.test.js +0 -54
  262. package/dist/src/app/charts/timeRange.test.js.map +0 -1
  263. package/dist/src/app/charts/tooltipUtils.js.map +0 -1
  264. package/dist/src/app/charts/trackerUtils.js +0 -130
  265. package/dist/src/app/charts/trackerUtils.js.map +0 -1
  266. /package/dist/src/app/charts/{datumSeries.test.d.ts → axes/AxesState.test.d.ts} +0 -0
  267. /package/dist/src/app/charts/{margins.test.d.ts → axes/AxisInterval.test.d.ts} +0 -0
  268. /package/dist/src/app/charts/{regexFilter.test.d.ts → axes/ContinuousAxisRange.test.d.ts} +0 -0
  269. /package/dist/src/app/charts/{timeRange.test.d.ts → axes/OrdinalAxisRange.test.d.ts} +0 -0
  270. /package/dist/src/app/charts/{RasterPlotTooltipContent.d.ts → tooltips/RasterPlotTooltipContent.d.ts} +0 -0
  271. /package/dist/src/app/charts/{ScatterPlotTooltipContent.d.ts → tooltips/ScatterPlotTooltipContent.d.ts} +0 -0
@@ -0,0 +1,121 @@
1
+ import { filter, map, scan } from "rxjs/operators";
2
+ import { emptyDatum } from "../series/timeSeries";
3
+ import { emptyIterateDatum, iterateDatumOf, nonEmptyIterateDatum } from "../series/iterateSeries";
4
+ import { copyChartData, defaultChartData } from "./ChartData";
5
+ const emptyIterateData = () => (Object.assign(Object.assign({}, defaultChartData()), { minIterate: emptyIterateDatum, maxIterate: emptyIterateDatum, minIterates: new Map(), maxIterates: new Map(), newPoints: new Map() }));
6
+ /**
7
+ * Makes a deep copy of the iterate chart data
8
+ * @param data The iterate chart data to copy
9
+ */
10
+ export const copyIterateDataFrom = (data) => (Object.assign(Object.assign({}, copyChartData(data)), { minIterate: data.minIterate, maxIterate: data.maxIterate, minIterates: new Map(data.minIterates), maxIterates: new Map(data.maxIterates), newPoints: new Map(Array.from(data.newPoints.entries()).map(([name, points]) => [name, points.slice()])) }));
11
+ const initialAccumulate = (n) => ({ n, previous: new Map(), accumulated: emptyIterateData() });
12
+ /**
13
+ * Accepts a {@link TimeSeriesChartData} observable and converts it to an observable of {@link IterateChartData}
14
+ * for the specified n-iterate. suppose that `f[0](x) = x`, `f[1](x) = f(x)`, `f[2](x) = f(f(x))`,
15
+ * `f[3](x) = f(f(f(x)))`, and `f[m](x) = f(f(f....(x)))`, where the function is applied `m` times. Given this,
16
+ * then an iterate (Poincare) plot shows points `(f[m](x), f[m+1](x))`, which is a 1-iterate. Plots of
17
+ * points `(f[m](x), f[m+n](x))` are n-iterates.
18
+ * @param dataObservable The observable over {@link TimeSeriesChartData}
19
+ * @param [n=1] The iterate distance
20
+ * @return An over {@link IterateChartData} holding the n-iterate for the incoming chart data
21
+ */
22
+ export function iteratesObservable(dataObservable, n = 1) {
23
+ return dataObservable
24
+ .pipe(
25
+ // calculate the iterates for each series in the chart data
26
+ scan(({ n, previous, accumulated }, current) => {
27
+ // make a deep copy of the accumulated data (because the accumulated data object
28
+ // holds references to maps)
29
+ const accum = copyIterateDataFrom(accumulated);
30
+ // for each series, add the new points to the accumulated data
31
+ Array
32
+ .from(current.newPoints.entries())
33
+ .forEach(([name, series]) => {
34
+ // grab the points from the previous incoming data and add the new
35
+ // data to its end (when the updated data didn't yet exist, add it
36
+ // to the map holding the previous series)
37
+ const updated = (previous.get(name) || []);
38
+ if (updated.length === 0) {
39
+ previous.set(name, updated);
40
+ }
41
+ updated.push(...series);
42
+ // we may have multiple new data points for this series, so we may need to
43
+ // calculate multiple iterates
44
+ while (updated.length > n) {
45
+ // grab the start and end of the n-iterate interval
46
+ const last = updated[n];
47
+ const first = updated.shift() || emptyDatum();
48
+ // set the updated new points for the series for the next
49
+ // iteration of the while-loop
50
+ previous.set(name, updated);
51
+ // create the new iterate
52
+ const iterate = iterateDatumOf(first.time, first.value, last.value);
53
+ // update the min, max values for all the series
54
+ accum.minIterate = minIterateFor(iterate, accum.minIterate);
55
+ accum.maxIterate = maxIterateFor(iterate, accum.maxIterate);
56
+ // update the min, max values for the current series
57
+ accum.minIterates.set(name, minIterateFor(iterate, accum.minIterates.get(name)));
58
+ accum.maxIterates.set(name, maxIterateFor(iterate, accum.maxIterates.get(name)));
59
+ // add the newly calculated iterate, and then trim from the
60
+ // head of the array to a size n. For the iterates, we only need
61
+ // to keep enough to create points (x(j), x(j+n))
62
+ const updatedPoints = accum.newPoints.get(name) || [];
63
+ if (updatedPoints.length === 0) {
64
+ accum.newPoints.set(name, updatedPoints);
65
+ }
66
+ updatedPoints.push(iterate);
67
+ if (updatedPoints.length > series.length) {
68
+ updatedPoints.shift();
69
+ }
70
+ }
71
+ });
72
+ return { n, previous, accumulated: accum };
73
+ }, initialAccumulate(n)),
74
+ // remove new points from the map that are empty
75
+ filter(accum => !isNaN(accum.accumulated.minIterate.iterateN) && !isNaN(accum.accumulated.minIterate.iterateN_1)), map(accum => removeEmptyNewPoints(accum)), map(accum => accum.accumulated === undefined ? emptyIterateData() : accum.accumulated));
76
+ }
77
+ /**
78
+ * Calculates and returns the minimum values for the specified iterate and the current minimum
79
+ * @param iterate The iterate to compare against the minimum
80
+ * @param minIterate The minimum values for the iterate. Generally, this will be the accumulated
81
+ * values
82
+ * @return the minimum values for the specified iterate and the current minimum
83
+ */
84
+ function minIterateFor(iterate, minIterate = emptyIterateDatum) {
85
+ const minN = isNaN(minIterate.iterateN) ? iterate.iterateN : Math.min(iterate.iterateN, minIterate.iterateN);
86
+ const minN_1 = isNaN(minIterate.iterateN_1) ? iterate.iterateN_1 : Math.min(iterate.iterateN_1, minIterate.iterateN_1);
87
+ const minTime = (iterate.iterateN <= minN || iterate.iterateN_1 <= minN_1) ? iterate.time : minIterate.time;
88
+ return {
89
+ time: minTime,
90
+ iterateN: minN,
91
+ iterateN_1: minN_1
92
+ };
93
+ }
94
+ /**
95
+ * Calculates and returns the maximum values for the specified iterate and the current maximum
96
+ * @param iterate The iterate to compare against the maximum
97
+ * @param maxIterate The maximum values for the iterate. Generally, this will be the accumulated
98
+ * values
99
+ * @return the maximum values for the specified iterate and the current maximum
100
+ */
101
+ function maxIterateFor(iterate, maxIterate = emptyIterateDatum) {
102
+ const maxN = isNaN(maxIterate.iterateN) ? iterate.iterateN : Math.max(iterate.iterateN, maxIterate.iterateN);
103
+ const maxN_1 = isNaN(maxIterate.iterateN_1) ? iterate.iterateN_1 : Math.max(iterate.iterateN_1, maxIterate.iterateN_1);
104
+ const maxTime = (iterate.iterateN >= maxN || iterate.iterateN_1 >= maxN_1) ? iterate.time : maxIterate.time;
105
+ return {
106
+ time: maxTime,
107
+ iterateN: maxN,
108
+ iterateN_1: maxN_1
109
+ };
110
+ }
111
+ function removeEmptyNewPoints(accum) {
112
+ const newPoints = new Map(Array
113
+ .from(accum.accumulated.newPoints.entries())
114
+ .map(([name, points]) => [name, points.filter(point => nonEmptyIterateDatum(point))]));
115
+ return {
116
+ n: accum.n,
117
+ previous: accum.previous,
118
+ accumulated: Object.assign(Object.assign({}, accum.accumulated), { newPoints })
119
+ };
120
+ }
121
+ //# sourceMappingURL=iterates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iterates.js","sourceRoot":"","sources":["../../../../../src/app/charts/observables/iterates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,180 @@
1
+ import { scan } from 'rxjs/operators';
2
+ import { range } from 'rxjs';
3
+ import { initialTimeSeriesChartData } from "../series/timeSeriesChartData";
4
+ import { datumOf } from "../series/timeSeries";
5
+ import { seriesFrom } from "../series/baseSeries";
6
+ /**
7
+ * Higher-order function that forms a closure on the tent-map parameter, mu,
8
+ * and returns a tent-map function that accepts time and an iterate value. The
9
+ * time is only used for chart information, and not in the calculation of the
10
+ * next iterate.
11
+ * <pre>f[n+1](x) = mu * min(f[n](x), 1 - f[n](x))</pre>
12
+ * @param mu The "slope" of the tent function
13
+ * @return A datum, (t, f[n+1](x)) holding the informational time, and the
14
+ * value of the next iterate
15
+ */
16
+ function tentMapFn(mu) {
17
+ const cleanMu = Math.max(0, Math.min(mu, 2));
18
+ // the time is just the data collection time and does not factor int
19
+ // the tent map calculation.
20
+ return (time, xn) => {
21
+ const xn1 = cleanMu * Math.min(xn, 1 - xn);
22
+ return datumOf(time, xn1);
23
+ };
24
+ }
25
+ /**
26
+ * Higher-order function that forms a closure on the update-period of the incoming data.
27
+ * This function returns an accumulator function that uses the previous iterate (time-series
28
+ * chart-data) to calculate the next iterate (time-series chart-data).
29
+ * @param updatePeriod The update period, in milliseconds, forming the processing
30
+ * windows of the graph
31
+ * @return A function returns an accumulator function that uses the previous iterate (time-series
32
+ * chart-data) to calculate the next iterate (time-series chart-data).
33
+ */
34
+ function accumulateTentDataAt(updatePeriod) {
35
+ /**
36
+ * Calculates the next iterate, given the previous iterate, by applying the
37
+ * specified `tentMap` function
38
+ * @param previous The previous iterate
39
+ * @param iterateNum The iterate
40
+ * @param tentMap The function to calculate the tent-map
41
+ * @return The next iterate
42
+ */
43
+ return (previous, iterateNum, tentMap) => {
44
+ // make a copy of the current max times, which we'll update with new points
45
+ const maxTimes = new Map(previous.maxTimes.entries());
46
+ previous.newPoints.forEach((datum, name) => {
47
+ maxTimes.set(name, (datum[datum.length - 1].time + updatePeriod));
48
+ });
49
+ // deep copy of the previous data points, and calculate the next point
50
+ const newPoints = new Map(Array.from(previous.newPoints.entries())
51
+ .map(([name, data]) => [name, data.slice()]));
52
+ newPoints.forEach((data, _) => {
53
+ const lastDatum = data[data.length - 1];
54
+ const newDatum = tentMap(lastDatum.time + updatePeriod, lastDatum.value);
55
+ data.shift();
56
+ data.push(newDatum);
57
+ });
58
+ return {
59
+ seriesNames: new Set(previous.newPoints.keys()),
60
+ maxTime: previous.maxTime + updatePeriod,
61
+ maxTimes,
62
+ newPoints,
63
+ currentTime: (previous.currentTime || 0) + updatePeriod
64
+ };
65
+ };
66
+ }
67
+ /**
68
+ * Calculates and returns a time-series of iterates of the tent-map function.
69
+ * @param numPoints The number of iterates to calculate
70
+ * @param mu The slope of the tent-map function
71
+ * @param series The initial series
72
+ * @param updatePeriod The update period (chart-window processing)
73
+ * @return An observable of time-series chart-data holding the iterates
74
+ */
75
+ function tentMapTimeSeriesObservable(numPoints = 10, mu, series, updatePeriod = 25) {
76
+ const maxTime = series
77
+ .map(srs => srs.last().map(datum => datum.time).getOrElse(0))
78
+ .reduce((tMax, tCurr) => (tCurr > tMax) ? tCurr : tMax, -Infinity);
79
+ const initialData = initialTimeSeriesChartData(series, maxTime);
80
+ const tentMap = tentMapFn(mu);
81
+ const accumulateFn = accumulateTentDataAt(updatePeriod);
82
+ return range(series.length, numPoints).pipe(scan((prev, sequence) => accumulateFn(prev, sequence + 1, tentMap), initialData));
83
+ }
84
+ describe('when calculating tent-map iterates', () => {
85
+ const expected = [
86
+ {
87
+ seriesNames: new Set(["test1"]),
88
+ maxTime: 26,
89
+ maxTimes: new Map([["test1", 26]]),
90
+ newPoints: new Map([["test1", [datumOf(26, 0.578)]]]),
91
+ currentTime: 26
92
+ },
93
+ {
94
+ seriesNames: new Set(["test1"]),
95
+ maxTime: 51,
96
+ maxTimes: new Map([["test1", 51]]),
97
+ newPoints: new Map([["test1", [datumOf(51, 0.7174)]]]),
98
+ currentTime: 51
99
+ },
100
+ {
101
+ seriesNames: new Set(["test1"]),
102
+ maxTime: 76,
103
+ maxTimes: new Map([["test1", 76]]),
104
+ newPoints: new Map([["test1", [datumOf(76, 0.48042)]]]),
105
+ currentTime: 76
106
+ },
107
+ {
108
+ seriesNames: new Set(["test1"]),
109
+ maxTime: 101,
110
+ maxTimes: new Map([["test1", 101]]),
111
+ newPoints: new Map([["test1", [datumOf(101, 0.816714)]]]),
112
+ currentTime: 101
113
+ },
114
+ {
115
+ seriesNames: new Set(["test1"]),
116
+ maxTime: 126,
117
+ maxTimes: new Map([["test1", 126]]),
118
+ newPoints: new Map([["test1", [datumOf(126, 0.3115862)]]]),
119
+ currentTime: 126
120
+ },
121
+ {
122
+ seriesNames: new Set(["test1"]),
123
+ maxTime: 151,
124
+ maxTimes: new Map([["test1", 151]]),
125
+ newPoints: new Map([["test1", [datumOf(151, 0.52969654)]]]),
126
+ currentTime: 151
127
+ },
128
+ {
129
+ seriesNames: new Set(["test1"]),
130
+ maxTime: 176,
131
+ maxTimes: new Map([["test1", 176]]),
132
+ newPoints: new Map([["test1", [datumOf(176, 0.799515882)]]]),
133
+ currentTime: 176
134
+ },
135
+ {
136
+ seriesNames: new Set(["test1"]),
137
+ maxTime: 201,
138
+ maxTimes: new Map([["test1", 201]]),
139
+ newPoints: new Map([["test1", [datumOf(201, 0.3408230006)]]]),
140
+ currentTime: 201
141
+ },
142
+ {
143
+ seriesNames: new Set(["test1"]),
144
+ maxTime: 226,
145
+ maxTimes: new Map([["test1", 226]]),
146
+ newPoints: new Map([["test1", [datumOf(226, 0.5793991)]]]),
147
+ currentTime: 226
148
+ },
149
+ {
150
+ seriesNames: new Set(["test1"]),
151
+ maxTime: 251,
152
+ maxTimes: new Map([["test1", 251]]),
153
+ newPoints: new Map([["test1", [datumOf(251, 0.7150215282659962)]]]),
154
+ currentTime: 251
155
+ },
156
+ ];
157
+ function assertChartDataEqual(expected, actual) {
158
+ expect(actual.maxTime).toEqual(expected.maxTime);
159
+ expect(actual.maxTimes).toEqual(expected.maxTimes);
160
+ Array.from(actual.newPoints.entries())
161
+ .forEach(([name, data], index) => {
162
+ data.forEach(actualDatum => {
163
+ const expectedDatum = expected.newPoints.get(name)[index];
164
+ expect(actualDatum.time).toEqual(expectedDatum.time);
165
+ expect(actualDatum.value).toBeCloseTo(expectedDatum.value, 6);
166
+ });
167
+ });
168
+ }
169
+ test('should be able to calculate the tent-map iterates', done => {
170
+ let results = [];
171
+ const initialData = [seriesFrom("test1", [datumOf(1, 0.66)])];
172
+ tentMapTimeSeriesObservable(10, 1.7, initialData).subscribe(chartData => results.push(chartData));
173
+ done();
174
+ expect(results).toHaveLength(10);
175
+ results.forEach((result, index) => {
176
+ assertChartDataEqual(expected[index], result);
177
+ });
178
+ });
179
+ });
180
+ //# sourceMappingURL=iterates.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iterates.test.js","sourceRoot":"","sources":["../../../../../src/app/charts/observables/iterates.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
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 { OrdinalDatum } from "../series/ordinalSeries";
10
+ import { ChartData } from "./ChartData";
11
+ export interface OrdinalChartData extends ChartData {
12
+ /**
13
+ * Statistics for the chart. Holds the overall minimum and maximum (across all
14
+ * the series), and statistics for each individual series.
15
+ */
16
+ stats: OrdinalStats;
17
+ /**
18
+ * Map holding the name of the series (the time-series identifier) and the associated
19
+ * data points for that time-series (`map(series_name -> array(datum))`)
20
+ */
21
+ newPoints: Map<string, Array<OrdinalDatum>>;
22
+ }
23
+ /**
24
+ * Statistics for the chart. Holds the overall minimum and maximum (across all
25
+ * the series), and statistics for each individual series.
26
+ */
27
+ export interface OrdinalStats {
28
+ /**
29
+ * The min values for (time, value) for the data in the newPoints map
30
+ */
31
+ minDatum: OrdinalDatumExtremum;
32
+ /**
33
+ * The max values for (time, iterate n, and iterate n+1) for the data in the newPoints map
34
+ */
35
+ maxDatum: OrdinalDatumExtremum;
36
+ /**
37
+ * A map associating each series to stats about that series (e.g. map(series_name -> stats))
38
+ */
39
+ valueStatsForSeries: Map<string, OrdinalValueStats>;
40
+ }
41
+ export type OrdinalValueStats = {
42
+ min: OrdinalDatum;
43
+ max: OrdinalDatum;
44
+ count: number;
45
+ sum: number;
46
+ sumSquared: number;
47
+ mean: number;
48
+ };
49
+ export type OrdinalDatumExtremum = {
50
+ time: OrdinalDatum;
51
+ value: OrdinalDatum;
52
+ };
53
+ export declare const initialMinValueDatum: () => OrdinalDatum;
54
+ export declare const initialMaxValueDatum: () => OrdinalDatum;
55
+ export declare const initialMinTimeDatum: () => OrdinalDatum;
56
+ export declare const initialMaxTimeDatum: () => OrdinalDatum;
57
+ export declare function valueStatusDatumOfDefault(datum: OrdinalDatum | undefined): OrdinalDatum;
58
+ export declare function isDefaultValueStatsDatum(datum: OrdinalDatum): boolean;
59
+ export declare function copyOrdinalDatumExtremum(datum: OrdinalDatumExtremum): OrdinalDatumExtremum;
60
+ export declare const defaultOrdinalStats: () => OrdinalStats;
61
+ export declare const defaultOrdinalValueStats: () => OrdinalValueStats;
62
+ export declare function copyOrdinalValueStats(data: OrdinalValueStats): OrdinalValueStats;
63
+ export declare function copyValueStatsForSeries(valueStats: Map<string, OrdinalValueStats>): Map<string, OrdinalValueStats>;
64
+ export declare const copyOrdinalStats: (data: OrdinalStats) => OrdinalStats;
65
+ /**
66
+ * Makes a deep copy of the ordinal chart data
67
+ * @param data The ordinal chart data to copy
68
+ */
69
+ export declare const copyOrdinalDataFrom: (data: OrdinalChartData) => OrdinalChartData;
70
+ /**
71
+ * Accepts a {@link TimeSeriesChartData} observable and converts it to an observable of {@link OrdinalChartData}.
72
+ * @param dataObservable The observable over {@link TimeSeriesChartData}
73
+ * @return An observable of {@link OrdinalChartData} holding the series for the incoming chart data
74
+ */
75
+ export declare function ordinalsObservable(dataObservable: Observable<TimeSeriesChartData>): Observable<OrdinalChartData>;
@@ -0,0 +1,141 @@
1
+ import { map, scan } from "rxjs/operators";
2
+ import { copyOrdinalDatum, nonEmptyOrdinalDatum, ordinalDatumOf } from "../series/ordinalSeries";
3
+ import { copyChartData, defaultChartData } from "./ChartData";
4
+ export const initialMinValueDatum = () => ordinalDatumOf(NaN, "", Infinity);
5
+ export const initialMaxValueDatum = () => ordinalDatumOf(NaN, "", -Infinity);
6
+ export const initialMinTimeDatum = () => ordinalDatumOf(Infinity, "", NaN);
7
+ export const initialMaxTimeDatum = () => ordinalDatumOf(-Infinity, "", NaN);
8
+ export function valueStatusDatumOfDefault(datum) {
9
+ return (datum === undefined) ? ordinalDatumOf(NaN, "", NaN) : datum;
10
+ }
11
+ export function isDefaultValueStatsDatum(datum) {
12
+ return isNaN(datum.time) && datum.ordinal === "" && isNaN(datum.value);
13
+ }
14
+ const initialMinOrdinalDatum = () => ({
15
+ time: ordinalDatumOf(Infinity, "", NaN),
16
+ value: initialMinValueDatum()
17
+ });
18
+ const initialMaxOrdinalDatum = () => ({
19
+ time: ordinalDatumOf(-Infinity, "", NaN),
20
+ value: initialMaxValueDatum()
21
+ });
22
+ export function copyOrdinalDatumExtremum(datum) {
23
+ return {
24
+ time: copyOrdinalDatum(datum.time),
25
+ value: copyOrdinalDatum(datum.value)
26
+ };
27
+ }
28
+ export const defaultOrdinalStats = () => ({
29
+ minDatum: initialMinOrdinalDatum(),
30
+ maxDatum: initialMaxOrdinalDatum(),
31
+ valueStatsForSeries: new Map()
32
+ });
33
+ export const defaultOrdinalValueStats = () => ({
34
+ min: initialMinValueDatum(),
35
+ max: initialMaxValueDatum(),
36
+ count: 0,
37
+ sum: 0,
38
+ mean: NaN,
39
+ sumSquared: 0,
40
+ });
41
+ export function copyOrdinalValueStats(data) {
42
+ return Object.assign(Object.assign({}, data), { min: copyOrdinalDatum(data.min), max: copyOrdinalDatum(data.max) });
43
+ }
44
+ export function copyValueStatsForSeries(valueStats) {
45
+ return new Map(Array.from(valueStats.entries())
46
+ .map(([seriesName, valueStats]) => [seriesName, copyOrdinalValueStats(valueStats)]));
47
+ }
48
+ export const copyOrdinalStats = (data) => ({
49
+ minDatum: copyOrdinalDatumExtremum(data.minDatum),
50
+ maxDatum: copyOrdinalDatumExtremum(data.maxDatum),
51
+ valueStatsForSeries: copyValueStatsForSeries(data.valueStatsForSeries),
52
+ });
53
+ const emptyOrdinalData = () => (Object.assign(Object.assign({}, defaultChartData()), { stats: defaultOrdinalStats(), newPoints: new Map() }));
54
+ /**
55
+ * Makes a deep copy of the ordinal chart data
56
+ * @param data The ordinal chart data to copy
57
+ */
58
+ export const copyOrdinalDataFrom = (data) => (Object.assign(Object.assign({}, copyChartData(data)), { stats: copyOrdinalStats(data.stats), newPoints: new Map(Array.from(data.newPoints.entries()).map(([name, points]) => [name, points.slice()])) }));
59
+ const initialAccumulate = () => ({ previous: new Map(), accumulated: emptyOrdinalData() });
60
+ /**
61
+ * Accepts a {@link TimeSeriesChartData} observable and converts it to an observable of {@link OrdinalChartData}.
62
+ * @param dataObservable The observable over {@link TimeSeriesChartData}
63
+ * @return An observable of {@link OrdinalChartData} holding the series for the incoming chart data
64
+ */
65
+ export function ordinalsObservable(dataObservable) {
66
+ return dataObservable
67
+ .pipe(
68
+ // calculate the iterates for each series in the chart data
69
+ scan(({ previous, accumulated }, current) => {
70
+ // make a deep copy of the accumulated data (because the accumulated data object
71
+ // holds references to maps)
72
+ const accum = copyOrdinalDataFrom(accumulated);
73
+ // for each series, add the new points to the accumulated data
74
+ Array
75
+ .from(current.newPoints.entries())
76
+ .forEach(([name, series]) => {
77
+ // grab the points from the previous incoming data and add the new
78
+ // data to the end of the previous data (when the updated data
79
+ // didn't yet exist, add it to the map holding the previous series)
80
+ const updated = (previous.get(name) || []);
81
+ if (updated.length === 0) {
82
+ previous.set(name, updated);
83
+ }
84
+ updated.push(...series);
85
+ // add the series name to the list of all
86
+ accum.seriesNames.add(name);
87
+ // calculate the max-time, min-time, max-value, and min-value for
88
+ // all the data series
89
+ series.forEach(({ time, value }) => {
90
+ // calculate the min and max times over all series
91
+ if (time < accum.stats.minDatum.time.time) {
92
+ accum.stats.minDatum.time = ordinalDatumOf(time, name, value);
93
+ }
94
+ else if (time > accum.stats.maxDatum.time.time) {
95
+ accum.stats.maxDatum.time = ordinalDatumOf(time, name, value);
96
+ }
97
+ // calculate the min and max values over all series
98
+ if (value < accum.stats.minDatum.value.value) {
99
+ accum.stats.minDatum.value = ordinalDatumOf(time, name, value);
100
+ }
101
+ else if (value > accum.stats.maxDatum.value.value) {
102
+ accum.stats.maxDatum.value = ordinalDatumOf(time, name, value);
103
+ }
104
+ // calculate the min, max of the time and value for each series
105
+ let valueStats = accum.stats.valueStatsForSeries.get(name) || defaultOrdinalValueStats();
106
+ const minValue = (value < valueStats.min.value) ?
107
+ ordinalDatumOf(time, name, value) :
108
+ copyOrdinalDatum(valueStats.min);
109
+ const maxValue = (value > valueStats.max.value) ?
110
+ ordinalDatumOf(time, name, value) :
111
+ copyOrdinalDatum(valueStats.max);
112
+ const count = valueStats.count + 1;
113
+ const sum = valueStats.sum + value;
114
+ valueStats = {
115
+ min: minValue,
116
+ max: maxValue,
117
+ count,
118
+ sum,
119
+ sumSquared: isNaN(valueStats.sumSquared) ? value * value : valueStats.sumSquared + value * value,
120
+ mean: sum / count
121
+ };
122
+ accum.stats.valueStatsForSeries.set(name, valueStats);
123
+ });
124
+ // convert the new points to ordinal datum
125
+ accum.newPoints.set(name, series.map(({ time, value }) => ordinalDatumOf(time, name, value)));
126
+ });
127
+ return { previous, accumulated: accum };
128
+ }, initialAccumulate()),
129
+ // remove new points from the map that are empty
130
+ map(accum => removeEmptyNewPoints(accum)), map(accum => accum.accumulated === undefined ? emptyOrdinalData() : accum.accumulated));
131
+ }
132
+ function removeEmptyNewPoints(accum) {
133
+ const newPoints = new Map(Array
134
+ .from(accum.accumulated.newPoints.entries())
135
+ .map(([name, points]) => [name, points.filter(point => nonEmptyOrdinalDatum(point))]));
136
+ return {
137
+ previous: accum.previous,
138
+ accumulated: Object.assign(Object.assign({}, accum.accumulated), { newPoints })
139
+ };
140
+ }
141
+ //# sourceMappingURL=ordinals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ordinals.js","sourceRoot":"","sources":["../../../../../src/app/charts/observables/ordinals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function sinFn(x: number, period: number): number;