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 @@
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,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