@veritone-ce/design-system 2.9.0-next.2 → 2.9.0-next.3

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 (629) hide show
  1. package/dist/cjs/bundled_modules/d3-array/src/ascending.js +9 -0
  2. package/dist/cjs/bundled_modules/d3-array/src/bisect.js +16 -0
  3. package/dist/cjs/bundled_modules/d3-array/src/bisector.js +62 -0
  4. package/dist/cjs/bundled_modules/d3-array/src/descending.js +13 -0
  5. package/dist/cjs/bundled_modules/d3-array/src/deviation.js +12 -0
  6. package/dist/cjs/bundled_modules/d3-array/src/fsum.js +45 -0
  7. package/dist/cjs/bundled_modules/d3-array/src/intersection.js +25 -0
  8. package/dist/cjs/bundled_modules/d3-array/src/max.js +26 -0
  9. package/dist/cjs/bundled_modules/d3-array/src/mean.js +25 -0
  10. package/dist/cjs/bundled_modules/d3-array/src/median.js +11 -0
  11. package/dist/cjs/bundled_modules/d3-array/src/merge.js +15 -0
  12. package/dist/cjs/bundled_modules/d3-array/src/min.js +26 -0
  13. package/dist/cjs/bundled_modules/d3-array/src/number.js +27 -0
  14. package/dist/cjs/bundled_modules/d3-array/src/permute.js +9 -0
  15. package/dist/cjs/bundled_modules/d3-array/src/quantile.js +36 -0
  16. package/dist/cjs/bundled_modules/d3-array/src/quickselect.js +59 -0
  17. package/dist/cjs/bundled_modules/d3-array/src/range.js +19 -0
  18. package/dist/cjs/bundled_modules/d3-array/src/sort.js +20 -0
  19. package/dist/cjs/bundled_modules/d3-array/src/sum.js +17 -0
  20. package/dist/cjs/bundled_modules/d3-array/src/ticks.js +63 -0
  21. package/dist/cjs/bundled_modules/d3-array/src/union.js +17 -0
  22. package/dist/cjs/bundled_modules/d3-array/src/variance.js +31 -0
  23. package/dist/cjs/bundled_modules/d3-color/src/color.js +410 -0
  24. package/dist/cjs/bundled_modules/d3-color/src/cubehelix.js +68 -0
  25. package/dist/cjs/bundled_modules/d3-color/src/define.js +17 -0
  26. package/dist/cjs/bundled_modules/d3-color/src/lab.js +124 -0
  27. package/dist/cjs/bundled_modules/d3-color/src/math.js +7 -0
  28. package/dist/cjs/bundled_modules/d3-delaunay/src/delaunay.js +254 -0
  29. package/dist/cjs/bundled_modules/d3-delaunay/src/path.js +43 -0
  30. package/dist/cjs/bundled_modules/d3-delaunay/src/polygon.js +23 -0
  31. package/dist/cjs/bundled_modules/d3-delaunay/src/voronoi.js +338 -0
  32. package/dist/cjs/bundled_modules/d3-dispatch/src/dispatch.js +88 -0
  33. package/dist/cjs/bundled_modules/d3-dsv/src/dsv.js +170 -0
  34. package/dist/cjs/bundled_modules/d3-force/src/center.js +46 -0
  35. package/dist/cjs/bundled_modules/d3-force/src/collide.js +106 -0
  36. package/dist/cjs/bundled_modules/d3-force/src/constant.js +11 -0
  37. package/dist/cjs/bundled_modules/d3-force/src/jiggle.js +9 -0
  38. package/dist/cjs/bundled_modules/d3-force/src/lcg.js +15 -0
  39. package/dist/cjs/bundled_modules/d3-force/src/link.js +123 -0
  40. package/dist/cjs/bundled_modules/d3-force/src/manyBody.js +122 -0
  41. package/dist/cjs/bundled_modules/d3-force/src/simulation.js +164 -0
  42. package/dist/cjs/bundled_modules/d3-force/src/x.js +47 -0
  43. package/dist/cjs/bundled_modules/d3-force/src/y.js +47 -0
  44. package/dist/cjs/bundled_modules/d3-format/src/defaultLocale.js +24 -0
  45. package/dist/cjs/bundled_modules/d3-format/src/exponent.js +11 -0
  46. package/dist/cjs/bundled_modules/d3-format/src/formatDecimal.js +27 -0
  47. package/dist/cjs/bundled_modules/d3-format/src/formatGroup.js +24 -0
  48. package/dist/cjs/bundled_modules/d3-format/src/formatNumerals.js +13 -0
  49. package/dist/cjs/bundled_modules/d3-format/src/formatPrefixAuto.js +22 -0
  50. package/dist/cjs/bundled_modules/d3-format/src/formatRounded.js +17 -0
  51. package/dist/cjs/bundled_modules/d3-format/src/formatSpecifier.js +54 -0
  52. package/dist/cjs/bundled_modules/d3-format/src/formatTrim.js +17 -0
  53. package/dist/cjs/bundled_modules/d3-format/src/formatTypes.js +25 -0
  54. package/dist/cjs/bundled_modules/d3-format/src/identity.js +9 -0
  55. package/dist/cjs/bundled_modules/d3-format/src/locale.js +154 -0
  56. package/dist/cjs/bundled_modules/d3-format/src/precisionFixed.js +11 -0
  57. package/dist/cjs/bundled_modules/d3-format/src/precisionPrefix.js +11 -0
  58. package/dist/cjs/bundled_modules/d3-format/src/precisionRound.js +12 -0
  59. package/dist/cjs/bundled_modules/d3-geo/src/area.js +83 -0
  60. package/dist/cjs/bundled_modules/d3-geo/src/bounds.js +185 -0
  61. package/dist/cjs/bundled_modules/d3-geo/src/cartesian.js +43 -0
  62. package/dist/cjs/bundled_modules/d3-geo/src/centroid.js +149 -0
  63. package/dist/cjs/bundled_modules/d3-geo/src/circle.js +35 -0
  64. package/dist/cjs/bundled_modules/d3-geo/src/clip/antimeridian.js +98 -0
  65. package/dist/cjs/bundled_modules/d3-geo/src/clip/buffer.js +30 -0
  66. package/dist/cjs/bundled_modules/d3-geo/src/clip/circle.js +183 -0
  67. package/dist/cjs/bundled_modules/d3-geo/src/clip/index.js +137 -0
  68. package/dist/cjs/bundled_modules/d3-geo/src/clip/line.js +65 -0
  69. package/dist/cjs/bundled_modules/d3-geo/src/clip/rectangle.js +174 -0
  70. package/dist/cjs/bundled_modules/d3-geo/src/clip/rejoin.js +109 -0
  71. package/dist/cjs/bundled_modules/d3-geo/src/compose.js +18 -0
  72. package/dist/cjs/bundled_modules/d3-geo/src/graticule.js +107 -0
  73. package/dist/cjs/bundled_modules/d3-geo/src/identity.js +7 -0
  74. package/dist/cjs/bundled_modules/d3-geo/src/math.js +57 -0
  75. package/dist/cjs/bundled_modules/d3-geo/src/noop.js +7 -0
  76. package/dist/cjs/bundled_modules/d3-geo/src/path/area.js +54 -0
  77. package/dist/cjs/bundled_modules/d3-geo/src/path/bounds.js +32 -0
  78. package/dist/cjs/bundled_modules/d3-geo/src/path/centroid.js +104 -0
  79. package/dist/cjs/bundled_modules/d3-geo/src/path/context.js +51 -0
  80. package/dist/cjs/bundled_modules/d3-geo/src/path/index.js +82 -0
  81. package/dist/cjs/bundled_modules/d3-geo/src/path/measure.js +49 -0
  82. package/dist/cjs/bundled_modules/d3-geo/src/path/string.js +92 -0
  83. package/dist/cjs/bundled_modules/d3-geo/src/pointEqual.js +11 -0
  84. package/dist/cjs/bundled_modules/d3-geo/src/polygonContains.js +80 -0
  85. package/dist/cjs/bundled_modules/d3-geo/src/projection/albers.js +16 -0
  86. package/dist/cjs/bundled_modules/d3-geo/src/projection/albersUsa.js +117 -0
  87. package/dist/cjs/bundled_modules/d3-geo/src/projection/azimuthal.js +32 -0
  88. package/dist/cjs/bundled_modules/d3-geo/src/projection/azimuthalEqualArea.js +24 -0
  89. package/dist/cjs/bundled_modules/d3-geo/src/projection/azimuthalEquidistant.js +24 -0
  90. package/dist/cjs/bundled_modules/d3-geo/src/projection/conic.js +19 -0
  91. package/dist/cjs/bundled_modules/d3-geo/src/projection/conicConformal.js +45 -0
  92. package/dist/cjs/bundled_modules/d3-geo/src/projection/conicEqualArea.js +40 -0
  93. package/dist/cjs/bundled_modules/d3-geo/src/projection/conicEquidistant.js +39 -0
  94. package/dist/cjs/bundled_modules/d3-geo/src/projection/cylindricalEqualArea.js +19 -0
  95. package/dist/cjs/bundled_modules/d3-geo/src/projection/equalEarth.js +43 -0
  96. package/dist/cjs/bundled_modules/d3-geo/src/projection/equirectangular.js +19 -0
  97. package/dist/cjs/bundled_modules/d3-geo/src/projection/fit.js +54 -0
  98. package/dist/cjs/bundled_modules/d3-geo/src/projection/gnomonic.js +23 -0
  99. package/dist/cjs/bundled_modules/d3-geo/src/projection/identity.js +91 -0
  100. package/dist/cjs/bundled_modules/d3-geo/src/projection/index.js +184 -0
  101. package/dist/cjs/bundled_modules/d3-geo/src/projection/mercator.js +60 -0
  102. package/dist/cjs/bundled_modules/d3-geo/src/projection/naturalEarth1.js +35 -0
  103. package/dist/cjs/bundled_modules/d3-geo/src/projection/orthographic.js +22 -0
  104. package/dist/cjs/bundled_modules/d3-geo/src/projection/resample.js +108 -0
  105. package/dist/cjs/bundled_modules/d3-geo/src/projection/stereographic.js +25 -0
  106. package/dist/cjs/bundled_modules/d3-geo/src/projection/transverseMercator.js +34 -0
  107. package/dist/cjs/bundled_modules/d3-geo/src/rotation.js +86 -0
  108. package/dist/cjs/bundled_modules/d3-geo/src/stream.js +75 -0
  109. package/dist/cjs/bundled_modules/d3-geo/src/transform.js +24 -0
  110. package/dist/cjs/bundled_modules/d3-geo-projection/src/math.js +28 -0
  111. package/dist/cjs/bundled_modules/d3-geo-projection/src/mollweide.js +38 -0
  112. package/dist/cjs/bundled_modules/d3-hierarchy/src/accessors.js +13 -0
  113. package/dist/cjs/bundled_modules/d3-hierarchy/src/array.js +27 -0
  114. package/dist/cjs/bundled_modules/d3-hierarchy/src/cluster.js +90 -0
  115. package/dist/cjs/bundled_modules/d3-hierarchy/src/constant.js +16 -0
  116. package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/ancestors.js +13 -0
  117. package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/count.js +18 -0
  118. package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/descendants.js +9 -0
  119. package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/each.js +13 -0
  120. package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/eachAfter.js +21 -0
  121. package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/eachBefore.js +18 -0
  122. package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/find.js +14 -0
  123. package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/index.js +99 -0
  124. package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/iterator.js +20 -0
  125. package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/leaves.js +15 -0
  126. package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/links.js +15 -0
  127. package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/path.js +36 -0
  128. package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/sort.js +13 -0
  129. package/dist/cjs/bundled_modules/d3-hierarchy/src/hierarchy/sum.js +15 -0
  130. package/dist/cjs/bundled_modules/d3-hierarchy/src/lcg.js +15 -0
  131. package/dist/cjs/bundled_modules/d3-hierarchy/src/pack/enclose.js +122 -0
  132. package/dist/cjs/bundled_modules/d3-hierarchy/src/pack/index.js +87 -0
  133. package/dist/cjs/bundled_modules/d3-hierarchy/src/pack/siblings.js +118 -0
  134. package/dist/cjs/bundled_modules/d3-hierarchy/src/partition.js +58 -0
  135. package/dist/cjs/bundled_modules/d3-hierarchy/src/stratify.js +151 -0
  136. package/dist/cjs/bundled_modules/d3-hierarchy/src/tree.js +243 -0
  137. package/dist/cjs/bundled_modules/d3-hierarchy/src/treemap/binary.js +52 -0
  138. package/dist/cjs/bundled_modules/d3-hierarchy/src/treemap/dice.js +18 -0
  139. package/dist/cjs/bundled_modules/d3-hierarchy/src/treemap/index.js +100 -0
  140. package/dist/cjs/bundled_modules/d3-hierarchy/src/treemap/resquarify.js +42 -0
  141. package/dist/cjs/bundled_modules/d3-hierarchy/src/treemap/round.js +12 -0
  142. package/dist/cjs/bundled_modules/d3-hierarchy/src/treemap/slice.js +18 -0
  143. package/dist/cjs/bundled_modules/d3-hierarchy/src/treemap/sliceDice.js +12 -0
  144. package/dist/cjs/bundled_modules/d3-hierarchy/src/treemap/squarify.js +74 -0
  145. package/dist/cjs/bundled_modules/d3-interpolate/src/array.js +29 -0
  146. package/dist/cjs/bundled_modules/d3-interpolate/src/basis.js +26 -0
  147. package/dist/cjs/bundled_modules/d3-interpolate/src/basisClosed.js +19 -0
  148. package/dist/cjs/bundled_modules/d3-interpolate/src/color.js +37 -0
  149. package/dist/cjs/bundled_modules/d3-interpolate/src/constant.js +7 -0
  150. package/dist/cjs/bundled_modules/d3-interpolate/src/cubehelix.js +36 -0
  151. package/dist/cjs/bundled_modules/d3-interpolate/src/date.js +12 -0
  152. package/dist/cjs/bundled_modules/d3-interpolate/src/discrete.js +12 -0
  153. package/dist/cjs/bundled_modules/d3-interpolate/src/hcl.js +28 -0
  154. package/dist/cjs/bundled_modules/d3-interpolate/src/hsl.js +28 -0
  155. package/dist/cjs/bundled_modules/d3-interpolate/src/hue.js +15 -0
  156. package/dist/cjs/bundled_modules/d3-interpolate/src/index.js +53 -0
  157. package/dist/cjs/bundled_modules/d3-interpolate/src/lab.js +22 -0
  158. package/dist/cjs/bundled_modules/d3-interpolate/src/number.js +11 -0
  159. package/dist/cjs/bundled_modules/d3-interpolate/src/numberArray.js +21 -0
  160. package/dist/cjs/bundled_modules/d3-interpolate/src/object.js +29 -0
  161. package/dist/cjs/bundled_modules/d3-interpolate/src/piecewise.js +17 -0
  162. package/dist/cjs/bundled_modules/d3-interpolate/src/quantize.js +11 -0
  163. package/dist/cjs/bundled_modules/d3-interpolate/src/rgb.js +63 -0
  164. package/dist/cjs/bundled_modules/d3-interpolate/src/round.js +11 -0
  165. package/dist/cjs/bundled_modules/d3-interpolate/src/string.js +70 -0
  166. package/dist/cjs/bundled_modules/d3-interpolate/src/transform/decompose.js +33 -0
  167. package/dist/cjs/bundled_modules/d3-interpolate/src/transform/index.js +68 -0
  168. package/dist/cjs/bundled_modules/d3-interpolate/src/transform/parse.js +23 -0
  169. package/dist/cjs/bundled_modules/d3-interpolate/src/value.js +28 -0
  170. package/dist/cjs/bundled_modules/d3-interpolate/src/zoom.js +77 -0
  171. package/dist/cjs/bundled_modules/d3-path/src/path.js +157 -0
  172. package/dist/cjs/bundled_modules/d3-quadtree/src/add.js +91 -0
  173. package/dist/cjs/bundled_modules/d3-quadtree/src/cover.js +49 -0
  174. package/dist/cjs/bundled_modules/d3-quadtree/src/data.js +13 -0
  175. package/dist/cjs/bundled_modules/d3-quadtree/src/extent.js +11 -0
  176. package/dist/cjs/bundled_modules/d3-quadtree/src/find.js +76 -0
  177. package/dist/cjs/bundled_modules/d3-quadtree/src/quad.js +13 -0
  178. package/dist/cjs/bundled_modules/d3-quadtree/src/quadtree.js +79 -0
  179. package/dist/cjs/bundled_modules/d3-quadtree/src/remove.js +69 -0
  180. package/dist/cjs/bundled_modules/d3-quadtree/src/root.js +9 -0
  181. package/dist/cjs/bundled_modules/d3-quadtree/src/size.js +13 -0
  182. package/dist/cjs/bundled_modules/d3-quadtree/src/visit.js +22 -0
  183. package/dist/cjs/bundled_modules/d3-quadtree/src/visitAfter.js +27 -0
  184. package/dist/cjs/bundled_modules/d3-quadtree/src/x.js +14 -0
  185. package/dist/cjs/bundled_modules/d3-quadtree/src/y.js +14 -0
  186. package/dist/cjs/bundled_modules/d3-scale/src/constant.js +11 -0
  187. package/dist/cjs/bundled_modules/d3-scale/src/continuous.js +136 -0
  188. package/dist/cjs/bundled_modules/d3-scale/src/diverging.js +116 -0
  189. package/dist/cjs/bundled_modules/d3-scale/src/identity.js +34 -0
  190. package/dist/cjs/bundled_modules/d3-scale/src/init.js +31 -0
  191. package/dist/cjs/bundled_modules/d3-scale/src/linear.js +77 -0
  192. package/dist/cjs/bundled_modules/d3-scale/src/log.js +148 -0
  193. package/dist/cjs/bundled_modules/d3-scale/src/nice.js +24 -0
  194. package/dist/cjs/bundled_modules/d3-scale/src/number.js +9 -0
  195. package/dist/cjs/bundled_modules/d3-scale/src/ordinal.js +53 -0
  196. package/dist/cjs/bundled_modules/d3-scale/src/pow.js +58 -0
  197. package/dist/cjs/bundled_modules/d3-scale/src/quantile.js +65 -0
  198. package/dist/cjs/bundled_modules/d3-scale/src/quantize.js +62 -0
  199. package/dist/cjs/bundled_modules/d3-scale/src/sequential.js +119 -0
  200. package/dist/cjs/bundled_modules/d3-scale/src/symlog.js +42 -0
  201. package/dist/cjs/bundled_modules/d3-scale/src/threshold.js +45 -0
  202. package/dist/cjs/bundled_modules/d3-scale/src/tickFormat.js +39 -0
  203. package/dist/cjs/bundled_modules/d3-scale/src/time.js +85 -0
  204. package/dist/cjs/bundled_modules/d3-scale/src/utcTime.js +21 -0
  205. package/dist/cjs/bundled_modules/d3-scale-chromatic/src/categorical/Accent.js +9 -0
  206. package/dist/cjs/bundled_modules/d3-scale-chromatic/src/categorical/Dark2.js +9 -0
  207. package/dist/cjs/bundled_modules/d3-scale-chromatic/src/categorical/Paired.js +9 -0
  208. package/dist/cjs/bundled_modules/d3-scale-chromatic/src/categorical/Pastel1.js +9 -0
  209. package/dist/cjs/bundled_modules/d3-scale-chromatic/src/categorical/Pastel2.js +9 -0
  210. package/dist/cjs/bundled_modules/d3-scale-chromatic/src/categorical/Set1.js +9 -0
  211. package/dist/cjs/bundled_modules/d3-scale-chromatic/src/categorical/Set2.js +9 -0
  212. package/dist/cjs/bundled_modules/d3-scale-chromatic/src/categorical/Set3.js +9 -0
  213. package/dist/cjs/bundled_modules/d3-scale-chromatic/src/categorical/category10.js +9 -0
  214. package/dist/cjs/bundled_modules/d3-scale-chromatic/src/categorical/observable10.js +9 -0
  215. package/dist/cjs/bundled_modules/d3-scale-chromatic/src/colors.js +11 -0
  216. package/dist/cjs/bundled_modules/d3-shape/src/arc.js +274 -0
  217. package/dist/cjs/bundled_modules/d3-shape/src/area.js +118 -0
  218. package/dist/cjs/bundled_modules/d3-shape/src/array.js +11 -0
  219. package/dist/cjs/bundled_modules/d3-shape/src/constant.js +11 -0
  220. package/dist/cjs/bundled_modules/d3-shape/src/curve/basis.js +59 -0
  221. package/dist/cjs/bundled_modules/d3-shape/src/curve/basisClosed.js +58 -0
  222. package/dist/cjs/bundled_modules/d3-shape/src/curve/basisOpen.js +45 -0
  223. package/dist/cjs/bundled_modules/d3-shape/src/curve/bundle.js +62 -0
  224. package/dist/cjs/bundled_modules/d3-shape/src/curve/cardinal.js +69 -0
  225. package/dist/cjs/bundled_modules/d3-shape/src/curve/cardinalClosed.js +68 -0
  226. package/dist/cjs/bundled_modules/d3-shape/src/curve/cardinalOpen.js +56 -0
  227. package/dist/cjs/bundled_modules/d3-shape/src/curve/catmullRom.js +95 -0
  228. package/dist/cjs/bundled_modules/d3-shape/src/curve/catmullRomClosed.js +80 -0
  229. package/dist/cjs/bundled_modules/d3-shape/src/curve/catmullRomOpen.js +68 -0
  230. package/dist/cjs/bundled_modules/d3-shape/src/curve/linear.js +37 -0
  231. package/dist/cjs/bundled_modules/d3-shape/src/curve/linearClosed.js +31 -0
  232. package/dist/cjs/bundled_modules/d3-shape/src/curve/monotone.js +109 -0
  233. package/dist/cjs/bundled_modules/d3-shape/src/curve/natural.js +71 -0
  234. package/dist/cjs/bundled_modules/d3-shape/src/curve/step.js +61 -0
  235. package/dist/cjs/bundled_modules/d3-shape/src/line.js +64 -0
  236. package/dist/cjs/bundled_modules/d3-shape/src/math.js +36 -0
  237. package/dist/cjs/bundled_modules/d3-shape/src/noop.js +7 -0
  238. package/dist/cjs/bundled_modules/d3-shape/src/path.js +23 -0
  239. package/dist/cjs/bundled_modules/d3-shape/src/point.js +12 -0
  240. package/dist/cjs/bundled_modules/d3-shape/src/symbol/circle.js +15 -0
  241. package/dist/cjs/bundled_modules/d3-shape/src/symbol.js +38 -0
  242. package/dist/cjs/bundled_modules/d3-time/src/day.js +41 -0
  243. package/dist/cjs/bundled_modules/d3-time/src/duration.js +17 -0
  244. package/dist/cjs/bundled_modules/d3-time/src/hour.js +31 -0
  245. package/dist/cjs/bundled_modules/d3-time/src/interval.js +73 -0
  246. package/dist/cjs/bundled_modules/d3-time/src/millisecond.js +29 -0
  247. package/dist/cjs/bundled_modules/d3-time/src/minute.js +31 -0
  248. package/dist/cjs/bundled_modules/d3-time/src/month.js +32 -0
  249. package/dist/cjs/bundled_modules/d3-time/src/second.js +18 -0
  250. package/dist/cjs/bundled_modules/d3-time/src/ticks.js +64 -0
  251. package/dist/cjs/bundled_modules/d3-time/src/week.js +73 -0
  252. package/dist/cjs/bundled_modules/d3-time/src/year.js +54 -0
  253. package/dist/cjs/bundled_modules/d3-time-format/src/defaultLocale.js +33 -0
  254. package/dist/cjs/bundled_modules/d3-time-format/src/locale.js +694 -0
  255. package/dist/cjs/bundled_modules/d3-timer/src/interval.js +23 -0
  256. package/dist/cjs/bundled_modules/d3-timer/src/timer.js +117 -0
  257. package/dist/cjs/bundled_modules/delaunator/index.js +485 -0
  258. package/dist/cjs/bundled_modules/internmap/src/index.js +66 -0
  259. package/dist/cjs/bundled_modules/json-stringify-pretty-compact/index.js +104 -0
  260. package/dist/cjs/bundled_modules/robust-predicates/esm/orient2d.js +184 -0
  261. package/dist/cjs/bundled_modules/robust-predicates/esm/util.js +95 -0
  262. package/dist/cjs/bundled_modules/topojson-client/src/feature.js +77 -0
  263. package/dist/cjs/bundled_modules/topojson-client/src/identity.js +9 -0
  264. package/dist/cjs/bundled_modules/topojson-client/src/mesh.js +60 -0
  265. package/dist/cjs/bundled_modules/topojson-client/src/reverse.js +10 -0
  266. package/dist/cjs/bundled_modules/topojson-client/src/stitch.js +79 -0
  267. package/dist/cjs/bundled_modules/topojson-client/src/transform.js +25 -0
  268. package/dist/cjs/bundled_modules/vega/build/vega.module.js +272 -0
  269. package/dist/cjs/bundled_modules/vega-canvas/build/vega-canvas.browser.js +18 -0
  270. package/dist/cjs/bundled_modules/vega-crossfilter/build/vega-crossfilter.js +676 -0
  271. package/dist/cjs/bundled_modules/vega-dataflow/build/vega-dataflow.js +2102 -0
  272. package/dist/cjs/bundled_modules/vega-embed/build/embed.js +2939 -0
  273. package/dist/cjs/bundled_modules/vega-encode/build/vega-encode.js +962 -0
  274. package/dist/cjs/bundled_modules/vega-event-selector/build/vega-event-selector.js +192 -0
  275. package/dist/cjs/bundled_modules/vega-expression/build/vega-expression.js +1615 -0
  276. package/dist/cjs/bundled_modules/vega-force/build/vega-force.js +295 -0
  277. package/dist/cjs/bundled_modules/vega-format/build/vega-format.js +201 -0
  278. package/dist/cjs/bundled_modules/vega-functions/build/vega-functions.js +842 -0
  279. package/dist/cjs/bundled_modules/vega-geo/build/vega-geo.js +1333 -0
  280. package/dist/cjs/bundled_modules/vega-hierarchy/build/vega-hierarchy.js +580 -0
  281. package/dist/cjs/bundled_modules/vega-interpreter/build/vega-interpreter.js +310 -0
  282. package/dist/cjs/bundled_modules/vega-label/build/vega-label.js +876 -0
  283. package/dist/cjs/bundled_modules/vega-lite/build/index.js +20157 -0
  284. package/dist/cjs/bundled_modules/vega-loader/build/vega-loader.browser.js +337 -0
  285. package/dist/cjs/bundled_modules/vega-parser/build/vega-parser.js +3805 -0
  286. package/dist/cjs/bundled_modules/vega-projection/build/vega-projection.js +90 -0
  287. package/dist/cjs/bundled_modules/vega-regression/build/vega-regression.js +236 -0
  288. package/dist/cjs/bundled_modules/vega-runtime/build/vega-runtime.js +588 -0
  289. package/dist/cjs/bundled_modules/vega-scale/build/vega-scale.js +846 -0
  290. package/dist/cjs/bundled_modules/vega-scenegraph/build/vega-scenegraph.js +5040 -0
  291. package/dist/cjs/bundled_modules/vega-schema-url-parser/dist/parser.modern.js +7 -0
  292. package/dist/cjs/bundled_modules/vega-selections/build/vega-selection.js +342 -0
  293. package/dist/cjs/bundled_modules/vega-statistics/build/vega-statistics.js +1193 -0
  294. package/dist/cjs/bundled_modules/vega-themes/build/index.js +853 -0
  295. package/dist/cjs/bundled_modules/vega-time/build/vega-time.js +342 -0
  296. package/dist/cjs/bundled_modules/vega-tooltip/build/index.js +353 -0
  297. package/dist/cjs/bundled_modules/vega-transforms/build/vega-transforms.js +3781 -0
  298. package/dist/cjs/bundled_modules/vega-util/build/vega-util.js +824 -0
  299. package/dist/cjs/bundled_modules/vega-view/build/vega-view.js +1306 -0
  300. package/dist/cjs/bundled_modules/vega-view-transforms/build/vega-view-transforms.js +1313 -0
  301. package/dist/cjs/bundled_modules/vega-voronoi/build/vega-voronoi.js +80 -0
  302. package/dist/cjs/bundled_modules/vega-wordcloud/build/vega-wordcloud.js +540 -0
  303. package/dist/cjs/unstable/extras/chart/BarChart.js +42 -0
  304. package/dist/cjs/unstable/extras/chart/Chart.js +100 -0
  305. package/dist/cjs/unstable/extras/chart/DistributionChart.js +84 -0
  306. package/dist/cjs/unstable/extras/chart/DonutChart.js +43 -0
  307. package/dist/cjs/unstable/extras/chart/LineChart.js +45 -0
  308. package/dist/cjs/unstable/extras/chart/PieChart.js +39 -0
  309. package/dist/cjs/unstable/extras/chart/TimelineChart.js +48 -0
  310. package/dist/cjs/unstable/extras/chart/index.js +23 -0
  311. package/dist/esm/bundled_modules/d3-array/src/ascending.js +5 -0
  312. package/dist/esm/bundled_modules/d3-array/src/bisect.js +10 -0
  313. package/dist/esm/bundled_modules/d3-array/src/bisector.js +58 -0
  314. package/dist/esm/bundled_modules/d3-array/src/descending.js +9 -0
  315. package/dist/esm/bundled_modules/d3-array/src/deviation.js +8 -0
  316. package/dist/esm/bundled_modules/d3-array/src/fsum.js +43 -0
  317. package/dist/esm/bundled_modules/d3-array/src/intersection.js +21 -0
  318. package/dist/esm/bundled_modules/d3-array/src/max.js +22 -0
  319. package/dist/esm/bundled_modules/d3-array/src/mean.js +21 -0
  320. package/dist/esm/bundled_modules/d3-array/src/median.js +7 -0
  321. package/dist/esm/bundled_modules/d3-array/src/merge.js +11 -0
  322. package/dist/esm/bundled_modules/d3-array/src/min.js +22 -0
  323. package/dist/esm/bundled_modules/d3-array/src/number.js +22 -0
  324. package/dist/esm/bundled_modules/d3-array/src/permute.js +5 -0
  325. package/dist/esm/bundled_modules/d3-array/src/quantile.js +31 -0
  326. package/dist/esm/bundled_modules/d3-array/src/quickselect.js +55 -0
  327. package/dist/esm/bundled_modules/d3-array/src/range.js +15 -0
  328. package/dist/esm/bundled_modules/d3-array/src/sort.js +17 -0
  329. package/dist/esm/bundled_modules/d3-array/src/sum.js +13 -0
  330. package/dist/esm/bundled_modules/d3-array/src/ticks.js +57 -0
  331. package/dist/esm/bundled_modules/d3-array/src/union.js +13 -0
  332. package/dist/esm/bundled_modules/d3-array/src/variance.js +27 -0
  333. package/dist/esm/bundled_modules/d3-color/src/color.js +398 -0
  334. package/dist/esm/bundled_modules/d3-color/src/cubehelix.js +63 -0
  335. package/dist/esm/bundled_modules/d3-color/src/define.js +12 -0
  336. package/dist/esm/bundled_modules/d3-color/src/lab.js +117 -0
  337. package/dist/esm/bundled_modules/d3-color/src/math.js +4 -0
  338. package/dist/esm/bundled_modules/d3-delaunay/src/delaunay.js +250 -0
  339. package/dist/esm/bundled_modules/d3-delaunay/src/path.js +39 -0
  340. package/dist/esm/bundled_modules/d3-delaunay/src/polygon.js +19 -0
  341. package/dist/esm/bundled_modules/d3-delaunay/src/voronoi.js +334 -0
  342. package/dist/esm/bundled_modules/d3-dispatch/src/dispatch.js +84 -0
  343. package/dist/esm/bundled_modules/d3-dsv/src/dsv.js +166 -0
  344. package/dist/esm/bundled_modules/d3-force/src/center.js +42 -0
  345. package/dist/esm/bundled_modules/d3-force/src/collide.js +102 -0
  346. package/dist/esm/bundled_modules/d3-force/src/constant.js +7 -0
  347. package/dist/esm/bundled_modules/d3-force/src/jiggle.js +5 -0
  348. package/dist/esm/bundled_modules/d3-force/src/lcg.js +11 -0
  349. package/dist/esm/bundled_modules/d3-force/src/link.js +119 -0
  350. package/dist/esm/bundled_modules/d3-force/src/manyBody.js +118 -0
  351. package/dist/esm/bundled_modules/d3-force/src/simulation.js +158 -0
  352. package/dist/esm/bundled_modules/d3-force/src/x.js +43 -0
  353. package/dist/esm/bundled_modules/d3-force/src/y.js +43 -0
  354. package/dist/esm/bundled_modules/d3-format/src/defaultLocale.js +20 -0
  355. package/dist/esm/bundled_modules/d3-format/src/exponent.js +7 -0
  356. package/dist/esm/bundled_modules/d3-format/src/formatDecimal.js +22 -0
  357. package/dist/esm/bundled_modules/d3-format/src/formatGroup.js +20 -0
  358. package/dist/esm/bundled_modules/d3-format/src/formatNumerals.js +9 -0
  359. package/dist/esm/bundled_modules/d3-format/src/formatPrefixAuto.js +18 -0
  360. package/dist/esm/bundled_modules/d3-format/src/formatRounded.js +13 -0
  361. package/dist/esm/bundled_modules/d3-format/src/formatSpecifier.js +49 -0
  362. package/dist/esm/bundled_modules/d3-format/src/formatTrim.js +13 -0
  363. package/dist/esm/bundled_modules/d3-format/src/formatTypes.js +21 -0
  364. package/dist/esm/bundled_modules/d3-format/src/identity.js +5 -0
  365. package/dist/esm/bundled_modules/d3-format/src/locale.js +150 -0
  366. package/dist/esm/bundled_modules/d3-format/src/precisionFixed.js +7 -0
  367. package/dist/esm/bundled_modules/d3-format/src/precisionPrefix.js +7 -0
  368. package/dist/esm/bundled_modules/d3-format/src/precisionRound.js +8 -0
  369. package/dist/esm/bundled_modules/d3-geo/src/area.js +78 -0
  370. package/dist/esm/bundled_modules/d3-geo/src/bounds.js +181 -0
  371. package/dist/esm/bundled_modules/d3-geo/src/cartesian.js +35 -0
  372. package/dist/esm/bundled_modules/d3-geo/src/centroid.js +145 -0
  373. package/dist/esm/bundled_modules/d3-geo/src/circle.js +33 -0
  374. package/dist/esm/bundled_modules/d3-geo/src/clip/antimeridian.js +94 -0
  375. package/dist/esm/bundled_modules/d3-geo/src/clip/buffer.js +26 -0
  376. package/dist/esm/bundled_modules/d3-geo/src/clip/circle.js +179 -0
  377. package/dist/esm/bundled_modules/d3-geo/src/clip/index.js +133 -0
  378. package/dist/esm/bundled_modules/d3-geo/src/clip/line.js +61 -0
  379. package/dist/esm/bundled_modules/d3-geo/src/clip/rectangle.js +170 -0
  380. package/dist/esm/bundled_modules/d3-geo/src/clip/rejoin.js +105 -0
  381. package/dist/esm/bundled_modules/d3-geo/src/compose.js +14 -0
  382. package/dist/esm/bundled_modules/d3-geo/src/graticule.js +103 -0
  383. package/dist/esm/bundled_modules/d3-geo/src/identity.js +3 -0
  384. package/dist/esm/bundled_modules/d3-geo/src/math.js +33 -0
  385. package/dist/esm/bundled_modules/d3-geo/src/noop.js +3 -0
  386. package/dist/esm/bundled_modules/d3-geo/src/path/area.js +50 -0
  387. package/dist/esm/bundled_modules/d3-geo/src/path/bounds.js +28 -0
  388. package/dist/esm/bundled_modules/d3-geo/src/path/centroid.js +100 -0
  389. package/dist/esm/bundled_modules/d3-geo/src/path/context.js +47 -0
  390. package/dist/esm/bundled_modules/d3-geo/src/path/index.js +78 -0
  391. package/dist/esm/bundled_modules/d3-geo/src/path/measure.js +45 -0
  392. package/dist/esm/bundled_modules/d3-geo/src/path/string.js +88 -0
  393. package/dist/esm/bundled_modules/d3-geo/src/pointEqual.js +7 -0
  394. package/dist/esm/bundled_modules/d3-geo/src/polygonContains.js +76 -0
  395. package/dist/esm/bundled_modules/d3-geo/src/projection/albers.js +12 -0
  396. package/dist/esm/bundled_modules/d3-geo/src/projection/albersUsa.js +113 -0
  397. package/dist/esm/bundled_modules/d3-geo/src/projection/azimuthal.js +29 -0
  398. package/dist/esm/bundled_modules/d3-geo/src/projection/azimuthalEqualArea.js +19 -0
  399. package/dist/esm/bundled_modules/d3-geo/src/projection/azimuthalEquidistant.js +19 -0
  400. package/dist/esm/bundled_modules/d3-geo/src/projection/conic.js +17 -0
  401. package/dist/esm/bundled_modules/d3-geo/src/projection/conicConformal.js +40 -0
  402. package/dist/esm/bundled_modules/d3-geo/src/projection/conicEqualArea.js +35 -0
  403. package/dist/esm/bundled_modules/d3-geo/src/projection/conicEquidistant.js +34 -0
  404. package/dist/esm/bundled_modules/d3-geo/src/projection/cylindricalEqualArea.js +17 -0
  405. package/dist/esm/bundled_modules/d3-geo/src/projection/equalEarth.js +38 -0
  406. package/dist/esm/bundled_modules/d3-geo/src/projection/equirectangular.js +14 -0
  407. package/dist/esm/bundled_modules/d3-geo/src/projection/fit.js +49 -0
  408. package/dist/esm/bundled_modules/d3-geo/src/projection/gnomonic.js +18 -0
  409. package/dist/esm/bundled_modules/d3-geo/src/projection/identity.js +87 -0
  410. package/dist/esm/bundled_modules/d3-geo/src/projection/index.js +179 -0
  411. package/dist/esm/bundled_modules/d3-geo/src/projection/mercator.js +54 -0
  412. package/dist/esm/bundled_modules/d3-geo/src/projection/naturalEarth1.js +30 -0
  413. package/dist/esm/bundled_modules/d3-geo/src/projection/orthographic.js +17 -0
  414. package/dist/esm/bundled_modules/d3-geo/src/projection/resample.js +104 -0
  415. package/dist/esm/bundled_modules/d3-geo/src/projection/stereographic.js +20 -0
  416. package/dist/esm/bundled_modules/d3-geo/src/projection/transverseMercator.js +29 -0
  417. package/dist/esm/bundled_modules/d3-geo/src/rotation.js +81 -0
  418. package/dist/esm/bundled_modules/d3-geo/src/stream.js +71 -0
  419. package/dist/esm/bundled_modules/d3-geo/src/transform.js +22 -0
  420. package/dist/esm/bundled_modules/d3-geo-projection/src/math.js +18 -0
  421. package/dist/esm/bundled_modules/d3-geo-projection/src/mollweide.js +31 -0
  422. package/dist/esm/bundled_modules/d3-hierarchy/src/accessors.js +10 -0
  423. package/dist/esm/bundled_modules/d3-hierarchy/src/array.js +22 -0
  424. package/dist/esm/bundled_modules/d3-hierarchy/src/cluster.js +86 -0
  425. package/dist/esm/bundled_modules/d3-hierarchy/src/constant.js +11 -0
  426. package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/ancestors.js +9 -0
  427. package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/count.js +14 -0
  428. package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/descendants.js +5 -0
  429. package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/each.js +9 -0
  430. package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/eachAfter.js +17 -0
  431. package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/eachBefore.js +14 -0
  432. package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/find.js +10 -0
  433. package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/index.js +93 -0
  434. package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/iterator.js +16 -0
  435. package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/leaves.js +11 -0
  436. package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/links.js +11 -0
  437. package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/path.js +32 -0
  438. package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/sort.js +9 -0
  439. package/dist/esm/bundled_modules/d3-hierarchy/src/hierarchy/sum.js +11 -0
  440. package/dist/esm/bundled_modules/d3-hierarchy/src/lcg.js +11 -0
  441. package/dist/esm/bundled_modules/d3-hierarchy/src/pack/enclose.js +120 -0
  442. package/dist/esm/bundled_modules/d3-hierarchy/src/pack/index.js +83 -0
  443. package/dist/esm/bundled_modules/d3-hierarchy/src/pack/siblings.js +116 -0
  444. package/dist/esm/bundled_modules/d3-hierarchy/src/partition.js +54 -0
  445. package/dist/esm/bundled_modules/d3-hierarchy/src/stratify.js +147 -0
  446. package/dist/esm/bundled_modules/d3-hierarchy/src/tree.js +239 -0
  447. package/dist/esm/bundled_modules/d3-hierarchy/src/treemap/binary.js +48 -0
  448. package/dist/esm/bundled_modules/d3-hierarchy/src/treemap/dice.js +14 -0
  449. package/dist/esm/bundled_modules/d3-hierarchy/src/treemap/index.js +96 -0
  450. package/dist/esm/bundled_modules/d3-hierarchy/src/treemap/resquarify.js +38 -0
  451. package/dist/esm/bundled_modules/d3-hierarchy/src/treemap/round.js +8 -0
  452. package/dist/esm/bundled_modules/d3-hierarchy/src/treemap/slice.js +14 -0
  453. package/dist/esm/bundled_modules/d3-hierarchy/src/treemap/sliceDice.js +8 -0
  454. package/dist/esm/bundled_modules/d3-hierarchy/src/treemap/squarify.js +68 -0
  455. package/dist/esm/bundled_modules/d3-interpolate/src/array.js +24 -0
  456. package/dist/esm/bundled_modules/d3-interpolate/src/basis.js +21 -0
  457. package/dist/esm/bundled_modules/d3-interpolate/src/basisClosed.js +15 -0
  458. package/dist/esm/bundled_modules/d3-interpolate/src/color.js +31 -0
  459. package/dist/esm/bundled_modules/d3-interpolate/src/constant.js +3 -0
  460. package/dist/esm/bundled_modules/d3-interpolate/src/cubehelix.js +31 -0
  461. package/dist/esm/bundled_modules/d3-interpolate/src/date.js +8 -0
  462. package/dist/esm/bundled_modules/d3-interpolate/src/discrete.js +8 -0
  463. package/dist/esm/bundled_modules/d3-interpolate/src/hcl.js +23 -0
  464. package/dist/esm/bundled_modules/d3-interpolate/src/hsl.js +23 -0
  465. package/dist/esm/bundled_modules/d3-interpolate/src/hue.js +11 -0
  466. package/dist/esm/bundled_modules/d3-interpolate/src/index.js +21 -0
  467. package/dist/esm/bundled_modules/d3-interpolate/src/lab.js +18 -0
  468. package/dist/esm/bundled_modules/d3-interpolate/src/number.js +7 -0
  469. package/dist/esm/bundled_modules/d3-interpolate/src/numberArray.js +16 -0
  470. package/dist/esm/bundled_modules/d3-interpolate/src/object.js +25 -0
  471. package/dist/esm/bundled_modules/d3-interpolate/src/piecewise.js +13 -0
  472. package/dist/esm/bundled_modules/d3-interpolate/src/quantize.js +7 -0
  473. package/dist/esm/bundled_modules/d3-interpolate/src/rgb.js +57 -0
  474. package/dist/esm/bundled_modules/d3-interpolate/src/round.js +7 -0
  475. package/dist/esm/bundled_modules/d3-interpolate/src/string.js +66 -0
  476. package/dist/esm/bundled_modules/d3-interpolate/src/transform/decompose.js +28 -0
  477. package/dist/esm/bundled_modules/d3-interpolate/src/transform/index.js +65 -0
  478. package/dist/esm/bundled_modules/d3-interpolate/src/transform/parse.js +20 -0
  479. package/dist/esm/bundled_modules/d3-interpolate/src/value.js +24 -0
  480. package/dist/esm/bundled_modules/d3-interpolate/src/zoom.js +73 -0
  481. package/dist/esm/bundled_modules/d3-path/src/path.js +154 -0
  482. package/dist/esm/bundled_modules/d3-quadtree/src/add.js +86 -0
  483. package/dist/esm/bundled_modules/d3-quadtree/src/cover.js +45 -0
  484. package/dist/esm/bundled_modules/d3-quadtree/src/data.js +9 -0
  485. package/dist/esm/bundled_modules/d3-quadtree/src/extent.js +7 -0
  486. package/dist/esm/bundled_modules/d3-quadtree/src/find.js +72 -0
  487. package/dist/esm/bundled_modules/d3-quadtree/src/quad.js +9 -0
  488. package/dist/esm/bundled_modules/d3-quadtree/src/quadtree.js +75 -0
  489. package/dist/esm/bundled_modules/d3-quadtree/src/remove.js +64 -0
  490. package/dist/esm/bundled_modules/d3-quadtree/src/root.js +5 -0
  491. package/dist/esm/bundled_modules/d3-quadtree/src/size.js +9 -0
  492. package/dist/esm/bundled_modules/d3-quadtree/src/visit.js +18 -0
  493. package/dist/esm/bundled_modules/d3-quadtree/src/visitAfter.js +23 -0
  494. package/dist/esm/bundled_modules/d3-quadtree/src/x.js +9 -0
  495. package/dist/esm/bundled_modules/d3-quadtree/src/y.js +9 -0
  496. package/dist/esm/bundled_modules/d3-scale/src/constant.js +7 -0
  497. package/dist/esm/bundled_modules/d3-scale/src/continuous.js +129 -0
  498. package/dist/esm/bundled_modules/d3-scale/src/diverging.js +108 -0
  499. package/dist/esm/bundled_modules/d3-scale/src/identity.js +30 -0
  500. package/dist/esm/bundled_modules/d3-scale/src/init.js +28 -0
  501. package/dist/esm/bundled_modules/d3-scale/src/linear.js +72 -0
  502. package/dist/esm/bundled_modules/d3-scale/src/log.js +143 -0
  503. package/dist/esm/bundled_modules/d3-scale/src/nice.js +20 -0
  504. package/dist/esm/bundled_modules/d3-scale/src/number.js +5 -0
  505. package/dist/esm/bundled_modules/d3-scale/src/ordinal.js +48 -0
  506. package/dist/esm/bundled_modules/d3-scale/src/pow.js +52 -0
  507. package/dist/esm/bundled_modules/d3-scale/src/quantile.js +61 -0
  508. package/dist/esm/bundled_modules/d3-scale/src/quantize.js +58 -0
  509. package/dist/esm/bundled_modules/d3-scale/src/sequential.js +110 -0
  510. package/dist/esm/bundled_modules/d3-scale/src/symlog.js +37 -0
  511. package/dist/esm/bundled_modules/d3-scale/src/threshold.js +41 -0
  512. package/dist/esm/bundled_modules/d3-scale/src/tickFormat.js +35 -0
  513. package/dist/esm/bundled_modules/d3-scale/src/time.js +80 -0
  514. package/dist/esm/bundled_modules/d3-scale/src/utcTime.js +17 -0
  515. package/dist/esm/bundled_modules/d3-scale-chromatic/src/categorical/Accent.js +5 -0
  516. package/dist/esm/bundled_modules/d3-scale-chromatic/src/categorical/Dark2.js +5 -0
  517. package/dist/esm/bundled_modules/d3-scale-chromatic/src/categorical/Paired.js +5 -0
  518. package/dist/esm/bundled_modules/d3-scale-chromatic/src/categorical/Pastel1.js +5 -0
  519. package/dist/esm/bundled_modules/d3-scale-chromatic/src/categorical/Pastel2.js +5 -0
  520. package/dist/esm/bundled_modules/d3-scale-chromatic/src/categorical/Set1.js +5 -0
  521. package/dist/esm/bundled_modules/d3-scale-chromatic/src/categorical/Set2.js +5 -0
  522. package/dist/esm/bundled_modules/d3-scale-chromatic/src/categorical/Set3.js +5 -0
  523. package/dist/esm/bundled_modules/d3-scale-chromatic/src/categorical/category10.js +5 -0
  524. package/dist/esm/bundled_modules/d3-scale-chromatic/src/categorical/observable10.js +5 -0
  525. package/dist/esm/bundled_modules/d3-scale-chromatic/src/colors.js +7 -0
  526. package/dist/esm/bundled_modules/d3-shape/src/arc.js +270 -0
  527. package/dist/esm/bundled_modules/d3-shape/src/area.js +114 -0
  528. package/dist/esm/bundled_modules/d3-shape/src/array.js +7 -0
  529. package/dist/esm/bundled_modules/d3-shape/src/constant.js +7 -0
  530. package/dist/esm/bundled_modules/d3-shape/src/curve/basis.js +53 -0
  531. package/dist/esm/bundled_modules/d3-shape/src/curve/basisClosed.js +54 -0
  532. package/dist/esm/bundled_modules/d3-shape/src/curve/basisOpen.js +41 -0
  533. package/dist/esm/bundled_modules/d3-shape/src/curve/bundle.js +58 -0
  534. package/dist/esm/bundled_modules/d3-shape/src/curve/cardinal.js +63 -0
  535. package/dist/esm/bundled_modules/d3-shape/src/curve/cardinalClosed.js +63 -0
  536. package/dist/esm/bundled_modules/d3-shape/src/curve/cardinalOpen.js +51 -0
  537. package/dist/esm/bundled_modules/d3-shape/src/curve/catmullRom.js +90 -0
  538. package/dist/esm/bundled_modules/d3-shape/src/curve/catmullRomClosed.js +76 -0
  539. package/dist/esm/bundled_modules/d3-shape/src/curve/catmullRomOpen.js +64 -0
  540. package/dist/esm/bundled_modules/d3-shape/src/curve/linear.js +33 -0
  541. package/dist/esm/bundled_modules/d3-shape/src/curve/linearClosed.js +27 -0
  542. package/dist/esm/bundled_modules/d3-shape/src/curve/monotone.js +106 -0
  543. package/dist/esm/bundled_modules/d3-shape/src/curve/natural.js +67 -0
  544. package/dist/esm/bundled_modules/d3-shape/src/curve/step.js +55 -0
  545. package/dist/esm/bundled_modules/d3-shape/src/line.js +60 -0
  546. package/dist/esm/bundled_modules/d3-shape/src/math.js +22 -0
  547. package/dist/esm/bundled_modules/d3-shape/src/noop.js +3 -0
  548. package/dist/esm/bundled_modules/d3-shape/src/path.js +21 -0
  549. package/dist/esm/bundled_modules/d3-shape/src/point.js +9 -0
  550. package/dist/esm/bundled_modules/d3-shape/src/symbol/circle.js +11 -0
  551. package/dist/esm/bundled_modules/d3-shape/src/symbol.js +34 -0
  552. package/dist/esm/bundled_modules/d3-time/src/day.js +37 -0
  553. package/dist/esm/bundled_modules/d3-time/src/duration.js +9 -0
  554. package/dist/esm/bundled_modules/d3-time/src/hour.js +28 -0
  555. package/dist/esm/bundled_modules/d3-time/src/interval.js +71 -0
  556. package/dist/esm/bundled_modules/d3-time/src/millisecond.js +27 -0
  557. package/dist/esm/bundled_modules/d3-time/src/minute.js +28 -0
  558. package/dist/esm/bundled_modules/d3-time/src/month.js +29 -0
  559. package/dist/esm/bundled_modules/d3-time/src/second.js +16 -0
  560. package/dist/esm/bundled_modules/d3-time/src/ticks.js +59 -0
  561. package/dist/esm/bundled_modules/d3-time/src/week.js +58 -0
  562. package/dist/esm/bundled_modules/d3-time/src/year.js +51 -0
  563. package/dist/esm/bundled_modules/d3-time-format/src/defaultLocale.js +29 -0
  564. package/dist/esm/bundled_modules/d3-time-format/src/locale.js +690 -0
  565. package/dist/esm/bundled_modules/d3-timer/src/interval.js +19 -0
  566. package/dist/esm/bundled_modules/d3-timer/src/timer.js +112 -0
  567. package/dist/esm/bundled_modules/delaunator/index.js +481 -0
  568. package/dist/esm/bundled_modules/internmap/src/index.js +63 -0
  569. package/dist/esm/bundled_modules/json-stringify-pretty-compact/index.js +100 -0
  570. package/dist/esm/bundled_modules/robust-predicates/esm/orient2d.js +182 -0
  571. package/dist/esm/bundled_modules/robust-predicates/esm/util.js +88 -0
  572. package/dist/esm/bundled_modules/topojson-client/src/feature.js +72 -0
  573. package/dist/esm/bundled_modules/topojson-client/src/identity.js +5 -0
  574. package/dist/esm/bundled_modules/topojson-client/src/mesh.js +55 -0
  575. package/dist/esm/bundled_modules/topojson-client/src/reverse.js +6 -0
  576. package/dist/esm/bundled_modules/topojson-client/src/stitch.js +75 -0
  577. package/dist/esm/bundled_modules/topojson-client/src/transform.js +21 -0
  578. package/dist/esm/bundled_modules/vega/build/vega.module.js +38 -0
  579. package/dist/esm/bundled_modules/vega-canvas/build/vega-canvas.browser.js +14 -0
  580. package/dist/esm/bundled_modules/vega-crossfilter/build/vega-crossfilter.js +673 -0
  581. package/dist/esm/bundled_modules/vega-dataflow/build/vega-dataflow.js +2080 -0
  582. package/dist/esm/bundled_modules/vega-embed/build/embed.js +2932 -0
  583. package/dist/esm/bundled_modules/vega-encode/build/vega-encode.js +952 -0
  584. package/dist/esm/bundled_modules/vega-event-selector/build/vega-event-selector.js +190 -0
  585. package/dist/esm/bundled_modules/vega-expression/build/vega-expression.js +1597 -0
  586. package/dist/esm/bundled_modules/vega-force/build/vega-force.js +293 -0
  587. package/dist/esm/bundled_modules/vega-format/build/vega-format.js +191 -0
  588. package/dist/esm/bundled_modules/vega-functions/build/vega-functions.js +779 -0
  589. package/dist/esm/bundled_modules/vega-geo/build/vega-geo.js +1322 -0
  590. package/dist/esm/bundled_modules/vega-hierarchy/build/vega-hierarchy.js +572 -0
  591. package/dist/esm/bundled_modules/vega-interpreter/build/vega-interpreter.js +308 -0
  592. package/dist/esm/bundled_modules/vega-label/build/vega-label.js +874 -0
  593. package/dist/esm/bundled_modules/vega-lite/build/index.js +20110 -0
  594. package/dist/esm/bundled_modules/vega-loader/build/vega-loader.browser.js +328 -0
  595. package/dist/esm/bundled_modules/vega-parser/build/vega-parser.js +3783 -0
  596. package/dist/esm/bundled_modules/vega-projection/build/vega-projection.js +86 -0
  597. package/dist/esm/bundled_modules/vega-regression/build/vega-regression.js +233 -0
  598. package/dist/esm/bundled_modules/vega-runtime/build/vega-runtime.js +586 -0
  599. package/dist/esm/bundled_modules/vega-scale/build/vega-scale.js +799 -0
  600. package/dist/esm/bundled_modules/vega-scenegraph/build/vega-scenegraph.js +4982 -0
  601. package/dist/esm/bundled_modules/vega-schema-url-parser/dist/parser.modern.js +3 -0
  602. package/dist/esm/bundled_modules/vega-selections/build/vega-selection.js +336 -0
  603. package/dist/esm/bundled_modules/vega-statistics/build/vega-statistics.js +1157 -0
  604. package/dist/esm/bundled_modules/vega-themes/build/index.js +837 -0
  605. package/dist/esm/bundled_modules/vega-time/build/vega-time.js +314 -0
  606. package/dist/esm/bundled_modules/vega-tooltip/build/index.js +339 -0
  607. package/dist/esm/bundled_modules/vega-transforms/build/vega-transforms.js +3740 -0
  608. package/dist/esm/bundled_modules/vega-util/build/vega-util.js +753 -0
  609. package/dist/esm/bundled_modules/vega-view/build/vega-view.js +1304 -0
  610. package/dist/esm/bundled_modules/vega-view-transforms/build/vega-view-transforms.js +1306 -0
  611. package/dist/esm/bundled_modules/vega-voronoi/build/vega-voronoi.js +78 -0
  612. package/dist/esm/bundled_modules/vega-wordcloud/build/vega-wordcloud.js +538 -0
  613. package/dist/esm/unstable/extras/chart/BarChart.js +40 -0
  614. package/dist/esm/unstable/extras/chart/Chart.js +96 -0
  615. package/dist/esm/unstable/extras/chart/DistributionChart.js +82 -0
  616. package/dist/esm/unstable/extras/chart/DonutChart.js +41 -0
  617. package/dist/esm/unstable/extras/chart/LineChart.js +43 -0
  618. package/dist/esm/unstable/extras/chart/PieChart.js +37 -0
  619. package/dist/esm/unstable/extras/chart/TimelineChart.js +46 -0
  620. package/dist/esm/unstable/extras/chart/index.js +8 -0
  621. package/dist/types/unstable/extras/chart/BarChart.d.ts +16 -0
  622. package/dist/types/unstable/extras/chart/Chart.d.ts +33 -0
  623. package/dist/types/unstable/extras/chart/DistributionChart.d.ts +18 -0
  624. package/dist/types/unstable/extras/chart/DonutChart.d.ts +16 -0
  625. package/dist/types/unstable/extras/chart/LineChart.d.ts +16 -0
  626. package/dist/types/unstable/extras/chart/PieChart.d.ts +14 -0
  627. package/dist/types/unstable/extras/chart/TimelineChart.d.ts +15 -0
  628. package/dist/types/unstable/extras/chart/index.d.ts +15 -0
  629. package/package.json +1 -1
@@ -0,0 +1,3740 @@
1
+ import { inherits, extend, fastmap, compare, accessor, accessorName, accessorFields, array, field, isArray, key, error, toNumber, truthy, extent, hasOwnProperty as has, ascending, peek, constant, identity, merge, span, zero, extentIndex } from '../../vega-util/build/vega-util.js';
2
+ import { Transform, Operator, replace, ingest as ingest$1, tupleid, stableCompare, derive, rederive } from '../../vega-dataflow/build/vega-dataflow.js';
3
+ import { bin, sampleCurve, dotbin, randomKDE as kde, quantiles, random, randomUniform as uniform, randomLogNormal as lognormal, randomNormal as gaussian, randomMixture as mixture$1, quartiles, bootstrapCI } from '../../vega-statistics/build/vega-statistics.js';
4
+ import { TIME_UNITS, timeBin as bin$1, timeUnits, utcFloor, timeFloor, utcInterval, timeInterval } from '../../vega-time/build/vega-time.js';
5
+ import range from '../../d3-array/src/range.js';
6
+ import bisector from '../../d3-array/src/bisector.js';
7
+ import max from '../../d3-array/src/max.js';
8
+ import min from '../../d3-array/src/min.js';
9
+ import mean from '../../d3-array/src/mean.js';
10
+ import median from '../../d3-array/src/median.js';
11
+
12
+ function multikey(f) {
13
+ return x => {
14
+ const n = f.length;
15
+ let i = 1,
16
+ k = String(f[0](x));
17
+ for (; i < n; ++i) {
18
+ k += '|' + f[i](x);
19
+ }
20
+ return k;
21
+ };
22
+ }
23
+ function groupkey(fields) {
24
+ return !fields || !fields.length ? function () {
25
+ return '';
26
+ } : fields.length === 1 ? fields[0] : multikey(fields);
27
+ }
28
+
29
+ function measureName(op, field, as) {
30
+ return as || op + (!field ? '' : '_' + field);
31
+ }
32
+ const noop = () => {};
33
+ const base_op = {
34
+ init: noop,
35
+ add: noop,
36
+ rem: noop,
37
+ idx: 0
38
+ };
39
+ const AggregateOps = {
40
+ values: {
41
+ init: m => m.cell.store = true,
42
+ value: m => m.cell.data.values(),
43
+ idx: -1
44
+ },
45
+ count: {
46
+ value: m => m.cell.num
47
+ },
48
+ __count__: {
49
+ value: m => m.missing + m.valid
50
+ },
51
+ missing: {
52
+ value: m => m.missing
53
+ },
54
+ valid: {
55
+ value: m => m.valid
56
+ },
57
+ sum: {
58
+ init: m => m.sum = 0,
59
+ value: m => m.valid ? m.sum : undefined,
60
+ add: (m, v) => m.sum += +v,
61
+ rem: (m, v) => m.sum -= v
62
+ },
63
+ product: {
64
+ init: m => m.product = 1,
65
+ value: m => m.valid ? m.product : undefined,
66
+ add: (m, v) => m.product *= v,
67
+ rem: (m, v) => m.product /= v
68
+ },
69
+ mean: {
70
+ init: m => m.mean = 0,
71
+ value: m => m.valid ? m.mean : undefined,
72
+ add: (m, v) => (m.mean_d = v - m.mean, m.mean += m.mean_d / m.valid),
73
+ rem: (m, v) => (m.mean_d = v - m.mean, m.mean -= m.valid ? m.mean_d / m.valid : m.mean)
74
+ },
75
+ average: {
76
+ value: m => m.valid ? m.mean : undefined,
77
+ req: ['mean'],
78
+ idx: 1
79
+ },
80
+ variance: {
81
+ init: m => m.dev = 0,
82
+ value: m => m.valid > 1 ? m.dev / (m.valid - 1) : undefined,
83
+ add: (m, v) => m.dev += m.mean_d * (v - m.mean),
84
+ rem: (m, v) => m.dev -= m.mean_d * (v - m.mean),
85
+ req: ['mean'],
86
+ idx: 1
87
+ },
88
+ variancep: {
89
+ value: m => m.valid > 1 ? m.dev / m.valid : undefined,
90
+ req: ['variance'],
91
+ idx: 2
92
+ },
93
+ stdev: {
94
+ value: m => m.valid > 1 ? Math.sqrt(m.dev / (m.valid - 1)) : undefined,
95
+ req: ['variance'],
96
+ idx: 2
97
+ },
98
+ stdevp: {
99
+ value: m => m.valid > 1 ? Math.sqrt(m.dev / m.valid) : undefined,
100
+ req: ['variance'],
101
+ idx: 2
102
+ },
103
+ stderr: {
104
+ value: m => m.valid > 1 ? Math.sqrt(m.dev / (m.valid * (m.valid - 1))) : undefined,
105
+ req: ['variance'],
106
+ idx: 2
107
+ },
108
+ distinct: {
109
+ value: m => m.cell.data.distinct(m.get),
110
+ req: ['values'],
111
+ idx: 3
112
+ },
113
+ ci0: {
114
+ value: m => m.cell.data.ci0(m.get),
115
+ req: ['values'],
116
+ idx: 3
117
+ },
118
+ ci1: {
119
+ value: m => m.cell.data.ci1(m.get),
120
+ req: ['values'],
121
+ idx: 3
122
+ },
123
+ median: {
124
+ value: m => m.cell.data.q2(m.get),
125
+ req: ['values'],
126
+ idx: 3
127
+ },
128
+ q1: {
129
+ value: m => m.cell.data.q1(m.get),
130
+ req: ['values'],
131
+ idx: 3
132
+ },
133
+ q3: {
134
+ value: m => m.cell.data.q3(m.get),
135
+ req: ['values'],
136
+ idx: 3
137
+ },
138
+ min: {
139
+ init: m => m.min = undefined,
140
+ value: m => m.min = Number.isNaN(m.min) ? m.cell.data.min(m.get) : m.min,
141
+ add: (m, v) => {
142
+ if (v < m.min || m.min === undefined) m.min = v;
143
+ },
144
+ rem: (m, v) => {
145
+ if (v <= m.min) m.min = NaN;
146
+ },
147
+ req: ['values'],
148
+ idx: 4
149
+ },
150
+ max: {
151
+ init: m => m.max = undefined,
152
+ value: m => m.max = Number.isNaN(m.max) ? m.cell.data.max(m.get) : m.max,
153
+ add: (m, v) => {
154
+ if (v > m.max || m.max === undefined) m.max = v;
155
+ },
156
+ rem: (m, v) => {
157
+ if (v >= m.max) m.max = NaN;
158
+ },
159
+ req: ['values'],
160
+ idx: 4
161
+ },
162
+ argmin: {
163
+ init: m => m.argmin = undefined,
164
+ value: m => m.argmin || m.cell.data.argmin(m.get),
165
+ add: (m, v, t) => {
166
+ if (v < m.min) m.argmin = t;
167
+ },
168
+ rem: (m, v) => {
169
+ if (v <= m.min) m.argmin = undefined;
170
+ },
171
+ req: ['min', 'values'],
172
+ idx: 3
173
+ },
174
+ argmax: {
175
+ init: m => m.argmax = undefined,
176
+ value: m => m.argmax || m.cell.data.argmax(m.get),
177
+ add: (m, v, t) => {
178
+ if (v > m.max) m.argmax = t;
179
+ },
180
+ rem: (m, v) => {
181
+ if (v >= m.max) m.argmax = undefined;
182
+ },
183
+ req: ['max', 'values'],
184
+ idx: 3
185
+ },
186
+ exponential: {
187
+ init: (m, r) => {
188
+ m.exp = 0;
189
+ m.exp_r = r;
190
+ },
191
+ value: m => m.valid ? m.exp * (1 - m.exp_r) / (1 - m.exp_r ** m.valid) : undefined,
192
+ add: (m, v) => m.exp = m.exp_r * m.exp + v,
193
+ rem: (m, v) => m.exp = (m.exp - v / m.exp_r ** (m.valid - 1)) / m.exp_r
194
+ },
195
+ exponentialb: {
196
+ value: m => m.valid ? m.exp * (1 - m.exp_r) : undefined,
197
+ req: ['exponential'],
198
+ idx: 1
199
+ }
200
+ };
201
+ const ValidAggregateOps = Object.keys(AggregateOps).filter(d => d !== '__count__');
202
+ function measure(key, value) {
203
+ return (out, aggregate_param) => extend({
204
+ name: key,
205
+ aggregate_param: aggregate_param,
206
+ out: out || key
207
+ }, base_op, value);
208
+ }
209
+ [...ValidAggregateOps, '__count__'].forEach(key => {
210
+ AggregateOps[key] = measure(key, AggregateOps[key]);
211
+ });
212
+ function createMeasure(op, param, name) {
213
+ return AggregateOps[op](name, param);
214
+ }
215
+ function compareIndex(a, b) {
216
+ return a.idx - b.idx;
217
+ }
218
+ function resolve(agg) {
219
+ const map = {};
220
+ agg.forEach(a => map[a.name] = a);
221
+ const getreqs = a => {
222
+ if (!a.req) return;
223
+ a.req.forEach(key => {
224
+ if (!map[key]) getreqs(map[key] = AggregateOps[key]());
225
+ });
226
+ };
227
+ agg.forEach(getreqs);
228
+ return Object.values(map).sort(compareIndex);
229
+ }
230
+ function init() {
231
+ this.valid = 0;
232
+ this.missing = 0;
233
+ this._ops.forEach(op => op.aggregate_param == null ? op.init(this) : op.init(this, op.aggregate_param));
234
+ }
235
+ function add(v, t) {
236
+ if (v == null || v === '') {
237
+ ++this.missing;
238
+ return;
239
+ }
240
+ if (v !== v) return;
241
+ ++this.valid;
242
+ this._ops.forEach(op => op.add(this, v, t));
243
+ }
244
+ function rem(v, t) {
245
+ if (v == null || v === '') {
246
+ --this.missing;
247
+ return;
248
+ }
249
+ if (v !== v) return;
250
+ --this.valid;
251
+ this._ops.forEach(op => op.rem(this, v, t));
252
+ }
253
+ function set(t) {
254
+ this._out.forEach(op => t[op.out] = op.value(this));
255
+ return t;
256
+ }
257
+ function compileMeasures(agg, field) {
258
+ const get = field || identity,
259
+ ops = resolve(agg),
260
+ out = agg.slice().sort(compareIndex);
261
+ function ctr(cell) {
262
+ this._ops = ops;
263
+ this._out = out;
264
+ this.cell = cell;
265
+ this.init();
266
+ }
267
+ ctr.prototype.init = init;
268
+ ctr.prototype.add = add;
269
+ ctr.prototype.rem = rem;
270
+ ctr.prototype.set = set;
271
+ ctr.prototype.get = get;
272
+ ctr.fields = agg.map(op => op.out);
273
+ return ctr;
274
+ }
275
+
276
+ function TupleStore(key) {
277
+ this._key = key ? field(key) : tupleid;
278
+ this.reset();
279
+ }
280
+ const prototype$1 = TupleStore.prototype;
281
+ prototype$1.reset = function () {
282
+ this._add = [];
283
+ this._rem = [];
284
+ this._ext = null;
285
+ this._get = null;
286
+ this._q = null;
287
+ };
288
+ prototype$1.add = function (v) {
289
+ this._add.push(v);
290
+ };
291
+ prototype$1.rem = function (v) {
292
+ this._rem.push(v);
293
+ };
294
+ prototype$1.values = function () {
295
+ this._get = null;
296
+ if (this._rem.length === 0) return this._add;
297
+ const a = this._add,
298
+ r = this._rem,
299
+ k = this._key,
300
+ n = a.length,
301
+ m = r.length,
302
+ x = Array(n - m),
303
+ map = {};
304
+ let i, j, v;
305
+
306
+ // use unique key field to clear removed values
307
+ for (i = 0; i < m; ++i) {
308
+ map[k(r[i])] = 1;
309
+ }
310
+ for (i = 0, j = 0; i < n; ++i) {
311
+ if (map[k(v = a[i])]) {
312
+ map[k(v)] = 0;
313
+ } else {
314
+ x[j++] = v;
315
+ }
316
+ }
317
+ this._rem = [];
318
+ return this._add = x;
319
+ };
320
+
321
+ // memoizing statistics methods
322
+
323
+ prototype$1.distinct = function (get) {
324
+ const v = this.values(),
325
+ map = {};
326
+ let n = v.length,
327
+ count = 0,
328
+ s;
329
+ while (--n >= 0) {
330
+ s = get(v[n]) + '';
331
+ if (!has(map, s)) {
332
+ map[s] = 1;
333
+ ++count;
334
+ }
335
+ }
336
+ return count;
337
+ };
338
+ prototype$1.extent = function (get) {
339
+ if (this._get !== get || !this._ext) {
340
+ const v = this.values(),
341
+ i = extentIndex(v, get);
342
+ this._ext = [v[i[0]], v[i[1]]];
343
+ this._get = get;
344
+ }
345
+ return this._ext;
346
+ };
347
+ prototype$1.argmin = function (get) {
348
+ return this.extent(get)[0] || {};
349
+ };
350
+ prototype$1.argmax = function (get) {
351
+ return this.extent(get)[1] || {};
352
+ };
353
+ prototype$1.min = function (get) {
354
+ const m = this.extent(get)[0];
355
+ return m != null ? get(m) : undefined;
356
+ };
357
+ prototype$1.max = function (get) {
358
+ const m = this.extent(get)[1];
359
+ return m != null ? get(m) : undefined;
360
+ };
361
+ prototype$1.quartile = function (get) {
362
+ if (this._get !== get || !this._q) {
363
+ this._q = quartiles(this.values(), get);
364
+ this._get = get;
365
+ }
366
+ return this._q;
367
+ };
368
+ prototype$1.q1 = function (get) {
369
+ return this.quartile(get)[0];
370
+ };
371
+ prototype$1.q2 = function (get) {
372
+ return this.quartile(get)[1];
373
+ };
374
+ prototype$1.q3 = function (get) {
375
+ return this.quartile(get)[2];
376
+ };
377
+ prototype$1.ci = function (get) {
378
+ if (this._get !== get || !this._ci) {
379
+ this._ci = bootstrapCI(this.values(), 1000, 0.05, get);
380
+ this._get = get;
381
+ }
382
+ return this._ci;
383
+ };
384
+ prototype$1.ci0 = function (get) {
385
+ return this.ci(get)[0];
386
+ };
387
+ prototype$1.ci1 = function (get) {
388
+ return this.ci(get)[1];
389
+ };
390
+
391
+ /**
392
+ * Group-by aggregation operator.
393
+ * @constructor
394
+ * @param {object} params - The parameters for this operator.
395
+ * @param {Array<function(object): *>} [params.groupby] - An array of accessors to groupby.
396
+ * @param {Array<function(object): *>} [params.fields] - An array of accessors to aggregate.
397
+ * @param {Array<string>} [params.ops] - An array of strings indicating aggregation operations.
398
+ * @param {Array<number>} [params.aggregate_params] - An optional array of parameters for aggregation operations.
399
+ * @param {Array<string>} [params.as] - An array of output field names for aggregated values.
400
+ * @param {boolean} [params.cross=false] - A flag indicating that the full
401
+ * cross-product of groupby values should be generated, including empty cells.
402
+ * If true, the drop parameter is ignored and empty cells are retained.
403
+ * @param {boolean} [params.drop=true] - A flag indicating if empty cells should be removed.
404
+ */
405
+ function Aggregate(params) {
406
+ Transform.call(this, null, params);
407
+ this._adds = []; // array of added output tuples
408
+ this._mods = []; // array of modified output tuples
409
+ this._alen = 0; // number of active added tuples
410
+ this._mlen = 0; // number of active modified tuples
411
+ this._drop = true; // should empty aggregation cells be removed
412
+ this._cross = false; // produce full cross-product of group-by values
413
+
414
+ this._dims = []; // group-by dimension accessors
415
+ this._dnames = []; // group-by dimension names
416
+
417
+ this._measures = []; // collection of aggregation monoids
418
+ this._countOnly = false; // flag indicating only count aggregation
419
+ this._counts = null; // collection of count fields
420
+ this._prev = null; // previous aggregation cells
421
+
422
+ this._inputs = null; // array of dependent input tuple field names
423
+ this._outputs = null; // array of output tuple field names
424
+ }
425
+ Aggregate.Definition = {
426
+ 'type': 'Aggregate',
427
+ 'metadata': {
428
+ 'generates': true,
429
+ 'changes': true
430
+ },
431
+ 'params': [{
432
+ 'name': 'groupby',
433
+ 'type': 'field',
434
+ 'array': true
435
+ }, {
436
+ 'name': 'ops',
437
+ 'type': 'enum',
438
+ 'array': true,
439
+ 'values': ValidAggregateOps
440
+ }, {
441
+ 'name': 'aggregate_params',
442
+ 'type': 'number',
443
+ 'null': true,
444
+ 'array': true
445
+ }, {
446
+ 'name': 'fields',
447
+ 'type': 'field',
448
+ 'null': true,
449
+ 'array': true
450
+ }, {
451
+ 'name': 'as',
452
+ 'type': 'string',
453
+ 'null': true,
454
+ 'array': true
455
+ }, {
456
+ 'name': 'drop',
457
+ 'type': 'boolean',
458
+ 'default': true
459
+ }, {
460
+ 'name': 'cross',
461
+ 'type': 'boolean',
462
+ 'default': false
463
+ }, {
464
+ 'name': 'key',
465
+ 'type': 'field'
466
+ }]
467
+ };
468
+ inherits(Aggregate, Transform, {
469
+ transform(_, pulse) {
470
+ const aggr = this,
471
+ out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS),
472
+ mod = _.modified();
473
+ aggr.stamp = out.stamp;
474
+ if (aggr.value && (mod || pulse.modified(aggr._inputs, true))) {
475
+ aggr._prev = aggr.value;
476
+ aggr.value = mod ? aggr.init(_) : Object.create(null);
477
+ pulse.visit(pulse.SOURCE, t => aggr.add(t));
478
+ } else {
479
+ aggr.value = aggr.value || aggr.init(_);
480
+ pulse.visit(pulse.REM, t => aggr.rem(t));
481
+ pulse.visit(pulse.ADD, t => aggr.add(t));
482
+ }
483
+
484
+ // Indicate output fields and return aggregate tuples.
485
+ out.modifies(aggr._outputs);
486
+
487
+ // Should empty cells be dropped?
488
+ aggr._drop = _.drop !== false;
489
+
490
+ // If domain cross-product requested, generate empty cells as needed
491
+ // and ensure that empty cells are not dropped
492
+ if (_.cross && aggr._dims.length > 1) {
493
+ aggr._drop = false;
494
+ aggr.cross();
495
+ }
496
+ if (pulse.clean() && aggr._drop) {
497
+ out.clean(true).runAfter(() => this.clean());
498
+ }
499
+ return aggr.changes(out);
500
+ },
501
+ cross() {
502
+ const aggr = this,
503
+ curr = aggr.value,
504
+ dims = aggr._dnames,
505
+ vals = dims.map(() => ({})),
506
+ n = dims.length;
507
+
508
+ // collect all group-by domain values
509
+ function collect(cells) {
510
+ let key, i, t, v;
511
+ for (key in cells) {
512
+ t = cells[key].tuple;
513
+ for (i = 0; i < n; ++i) {
514
+ vals[i][v = t[dims[i]]] = v;
515
+ }
516
+ }
517
+ }
518
+ collect(aggr._prev);
519
+ collect(curr);
520
+
521
+ // iterate over key cross-product, create cells as needed
522
+ function generate(base, tuple, index) {
523
+ const name = dims[index],
524
+ v = vals[index++];
525
+ for (const k in v) {
526
+ const key = base ? base + '|' + k : k;
527
+ tuple[name] = v[k];
528
+ if (index < n) generate(key, tuple, index);else if (!curr[key]) aggr.cell(key, tuple);
529
+ }
530
+ }
531
+ generate('', {}, 0);
532
+ },
533
+ init(_) {
534
+ // initialize input and output fields
535
+ const inputs = this._inputs = [],
536
+ outputs = this._outputs = [],
537
+ inputMap = {};
538
+ function inputVisit(get) {
539
+ const fields = array(accessorFields(get)),
540
+ n = fields.length;
541
+ let i = 0,
542
+ f;
543
+ for (; i < n; ++i) {
544
+ if (!inputMap[f = fields[i]]) {
545
+ inputMap[f] = 1;
546
+ inputs.push(f);
547
+ }
548
+ }
549
+ }
550
+
551
+ // initialize group-by dimensions
552
+ this._dims = array(_.groupby);
553
+ this._dnames = this._dims.map(d => {
554
+ const dname = accessorName(d);
555
+ inputVisit(d);
556
+ outputs.push(dname);
557
+ return dname;
558
+ });
559
+ this.cellkey = _.key ? _.key : groupkey(this._dims);
560
+
561
+ // initialize aggregate measures
562
+ this._countOnly = true;
563
+ this._counts = [];
564
+ this._measures = [];
565
+ const fields = _.fields || [null],
566
+ ops = _.ops || ['count'],
567
+ aggregate_params = _.aggregate_params || [null],
568
+ as = _.as || [],
569
+ n = fields.length,
570
+ map = {};
571
+ let field, op, aggregate_param, m, mname, outname, i;
572
+ if (n !== ops.length) {
573
+ error('Unmatched number of fields and aggregate ops.');
574
+ }
575
+ for (i = 0; i < n; ++i) {
576
+ field = fields[i];
577
+ op = ops[i];
578
+ aggregate_param = aggregate_params[i] || null;
579
+ if (field == null && op !== 'count') {
580
+ error('Null aggregate field specified.');
581
+ }
582
+ mname = accessorName(field);
583
+ outname = measureName(op, mname, as[i]);
584
+ outputs.push(outname);
585
+ if (op === 'count') {
586
+ this._counts.push(outname);
587
+ continue;
588
+ }
589
+ m = map[mname];
590
+ if (!m) {
591
+ inputVisit(field);
592
+ m = map[mname] = [];
593
+ m.field = field;
594
+ this._measures.push(m);
595
+ }
596
+ if (op !== 'count') this._countOnly = false;
597
+ m.push(createMeasure(op, aggregate_param, outname));
598
+ }
599
+ this._measures = this._measures.map(m => compileMeasures(m, m.field));
600
+ return Object.create(null); // aggregation cells (this.value)
601
+ },
602
+ // -- Cell Management -----
603
+
604
+ cellkey: groupkey(),
605
+ cell(key, t) {
606
+ let cell = this.value[key];
607
+ if (!cell) {
608
+ cell = this.value[key] = this.newcell(key, t);
609
+ this._adds[this._alen++] = cell;
610
+ } else if (cell.num === 0 && this._drop && cell.stamp < this.stamp) {
611
+ cell.stamp = this.stamp;
612
+ this._adds[this._alen++] = cell;
613
+ } else if (cell.stamp < this.stamp) {
614
+ cell.stamp = this.stamp;
615
+ this._mods[this._mlen++] = cell;
616
+ }
617
+ return cell;
618
+ },
619
+ newcell(key, t) {
620
+ const cell = {
621
+ key: key,
622
+ num: 0,
623
+ agg: null,
624
+ tuple: this.newtuple(t, this._prev && this._prev[key]),
625
+ stamp: this.stamp,
626
+ store: false
627
+ };
628
+ if (!this._countOnly) {
629
+ const measures = this._measures,
630
+ n = measures.length;
631
+ cell.agg = Array(n);
632
+ for (let i = 0; i < n; ++i) {
633
+ cell.agg[i] = new measures[i](cell);
634
+ }
635
+ }
636
+ if (cell.store) {
637
+ cell.data = new TupleStore();
638
+ }
639
+ return cell;
640
+ },
641
+ newtuple(t, p) {
642
+ const names = this._dnames,
643
+ dims = this._dims,
644
+ n = dims.length,
645
+ x = {};
646
+ for (let i = 0; i < n; ++i) {
647
+ x[names[i]] = dims[i](t);
648
+ }
649
+ return p ? replace(p.tuple, x) : ingest$1(x);
650
+ },
651
+ clean() {
652
+ const cells = this.value;
653
+ for (const key in cells) {
654
+ if (cells[key].num === 0) {
655
+ delete cells[key];
656
+ }
657
+ }
658
+ },
659
+ // -- Process Tuples -----
660
+
661
+ add(t) {
662
+ const key = this.cellkey(t),
663
+ cell = this.cell(key, t);
664
+ cell.num += 1;
665
+ if (this._countOnly) return;
666
+ if (cell.store) cell.data.add(t);
667
+ const agg = cell.agg;
668
+ for (let i = 0, n = agg.length; i < n; ++i) {
669
+ agg[i].add(agg[i].get(t), t);
670
+ }
671
+ },
672
+ rem(t) {
673
+ const key = this.cellkey(t),
674
+ cell = this.cell(key, t);
675
+ cell.num -= 1;
676
+ if (this._countOnly) return;
677
+ if (cell.store) cell.data.rem(t);
678
+ const agg = cell.agg;
679
+ for (let i = 0, n = agg.length; i < n; ++i) {
680
+ agg[i].rem(agg[i].get(t), t);
681
+ }
682
+ },
683
+ celltuple(cell) {
684
+ const tuple = cell.tuple,
685
+ counts = this._counts;
686
+
687
+ // consolidate stored values
688
+ if (cell.store) {
689
+ cell.data.values();
690
+ }
691
+
692
+ // update tuple properties
693
+ for (let i = 0, n = counts.length; i < n; ++i) {
694
+ tuple[counts[i]] = cell.num;
695
+ }
696
+ if (!this._countOnly) {
697
+ const agg = cell.agg;
698
+ for (let i = 0, n = agg.length; i < n; ++i) {
699
+ agg[i].set(tuple);
700
+ }
701
+ }
702
+ return tuple;
703
+ },
704
+ changes(out) {
705
+ const adds = this._adds,
706
+ mods = this._mods,
707
+ prev = this._prev,
708
+ drop = this._drop,
709
+ add = out.add,
710
+ rem = out.rem,
711
+ mod = out.mod;
712
+ let cell, key, i, n;
713
+ if (prev) for (key in prev) {
714
+ cell = prev[key];
715
+ if (!drop || cell.num) rem.push(cell.tuple);
716
+ }
717
+ for (i = 0, n = this._alen; i < n; ++i) {
718
+ add.push(this.celltuple(adds[i]));
719
+ adds[i] = null; // for garbage collection
720
+ }
721
+ for (i = 0, n = this._mlen; i < n; ++i) {
722
+ cell = mods[i];
723
+ (cell.num === 0 && drop ? rem : mod).push(this.celltuple(cell));
724
+ mods[i] = null; // for garbage collection
725
+ }
726
+ this._alen = this._mlen = 0; // reset list of active cells
727
+ this._prev = null;
728
+ return out;
729
+ }
730
+ });
731
+
732
+ // epsilon bias to offset floating point error (#1737)
733
+ const EPSILON$1 = 1e-14;
734
+
735
+ /**
736
+ * Generates a binning function for discretizing data.
737
+ * @constructor
738
+ * @param {object} params - The parameters for this operator. The
739
+ * provided values should be valid options for the {@link bin} function.
740
+ * @param {function(object): *} params.field - The data field to bin.
741
+ */
742
+ function Bin(params) {
743
+ Transform.call(this, null, params);
744
+ }
745
+ Bin.Definition = {
746
+ 'type': 'Bin',
747
+ 'metadata': {
748
+ 'modifies': true
749
+ },
750
+ 'params': [{
751
+ 'name': 'field',
752
+ 'type': 'field',
753
+ 'required': true
754
+ }, {
755
+ 'name': 'interval',
756
+ 'type': 'boolean',
757
+ 'default': true
758
+ }, {
759
+ 'name': 'anchor',
760
+ 'type': 'number'
761
+ }, {
762
+ 'name': 'maxbins',
763
+ 'type': 'number',
764
+ 'default': 20
765
+ }, {
766
+ 'name': 'base',
767
+ 'type': 'number',
768
+ 'default': 10
769
+ }, {
770
+ 'name': 'divide',
771
+ 'type': 'number',
772
+ 'array': true,
773
+ 'default': [5, 2]
774
+ }, {
775
+ 'name': 'extent',
776
+ 'type': 'number',
777
+ 'array': true,
778
+ 'length': 2,
779
+ 'required': true
780
+ }, {
781
+ 'name': 'span',
782
+ 'type': 'number'
783
+ }, {
784
+ 'name': 'step',
785
+ 'type': 'number'
786
+ }, {
787
+ 'name': 'steps',
788
+ 'type': 'number',
789
+ 'array': true
790
+ }, {
791
+ 'name': 'minstep',
792
+ 'type': 'number',
793
+ 'default': 0
794
+ }, {
795
+ 'name': 'nice',
796
+ 'type': 'boolean',
797
+ 'default': true
798
+ }, {
799
+ 'name': 'name',
800
+ 'type': 'string'
801
+ }, {
802
+ 'name': 'as',
803
+ 'type': 'string',
804
+ 'array': true,
805
+ 'length': 2,
806
+ 'default': ['bin0', 'bin1']
807
+ }]
808
+ };
809
+ inherits(Bin, Transform, {
810
+ transform(_, pulse) {
811
+ const band = _.interval !== false,
812
+ bins = this._bins(_),
813
+ start = bins.start,
814
+ step = bins.step,
815
+ as = _.as || ['bin0', 'bin1'],
816
+ b0 = as[0],
817
+ b1 = as[1];
818
+ let flag;
819
+ if (_.modified()) {
820
+ pulse = pulse.reflow(true);
821
+ flag = pulse.SOURCE;
822
+ } else {
823
+ flag = pulse.modified(accessorFields(_.field)) ? pulse.ADD_MOD : pulse.ADD;
824
+ }
825
+ pulse.visit(flag, band ? t => {
826
+ const v = bins(t);
827
+ // minimum bin value (inclusive)
828
+ t[b0] = v;
829
+ // maximum bin value (exclusive)
830
+ // use convoluted math for better floating point agreement
831
+ // see https://github.com/vega/vega/issues/830
832
+ // infinite values propagate through this formula! #2227
833
+ t[b1] = v == null ? null : start + step * (1 + (v - start) / step);
834
+ } : t => t[b0] = bins(t));
835
+ return pulse.modifies(band ? as : b0);
836
+ },
837
+ _bins(_) {
838
+ if (this.value && !_.modified()) {
839
+ return this.value;
840
+ }
841
+ const field = _.field,
842
+ bins = bin(_),
843
+ step = bins.step;
844
+ let start = bins.start,
845
+ stop = start + Math.ceil((bins.stop - start) / step) * step,
846
+ a,
847
+ d;
848
+ if ((a = _.anchor) != null) {
849
+ d = a - (start + step * Math.floor((a - start) / step));
850
+ start += d;
851
+ stop += d;
852
+ }
853
+ const f = function (t) {
854
+ let v = toNumber(field(t));
855
+ return v == null ? null : v < start ? -Infinity : v > stop ? +Infinity : (v = Math.max(start, Math.min(v, stop - step)), start + step * Math.floor(EPSILON$1 + (v - start) / step));
856
+ };
857
+ f.start = start;
858
+ f.stop = bins.stop;
859
+ f.step = step;
860
+ return this.value = accessor(f, accessorFields(field), _.name || 'bin_' + accessorName(field));
861
+ }
862
+ });
863
+
864
+ function SortedList (idFunc, source, input) {
865
+ const $ = idFunc;
866
+ let data = source || [],
867
+ add = input || [],
868
+ rem = {},
869
+ cnt = 0;
870
+ return {
871
+ add: t => add.push(t),
872
+ remove: t => rem[$(t)] = ++cnt,
873
+ size: () => data.length,
874
+ data: (compare, resort) => {
875
+ if (cnt) {
876
+ data = data.filter(t => !rem[$(t)]);
877
+ rem = {};
878
+ cnt = 0;
879
+ }
880
+ if (resort && compare) {
881
+ data.sort(compare);
882
+ }
883
+ if (add.length) {
884
+ data = compare ? merge(compare, data, add.sort(compare)) : data.concat(add);
885
+ add = [];
886
+ }
887
+ return data;
888
+ }
889
+ };
890
+ }
891
+
892
+ /**
893
+ * Collects all data tuples that pass through this operator.
894
+ * @constructor
895
+ * @param {object} params - The parameters for this operator.
896
+ * @param {function(*,*): number} [params.sort] - An optional
897
+ * comparator function for additionally sorting the collected tuples.
898
+ */
899
+ function Collect(params) {
900
+ Transform.call(this, [], params);
901
+ }
902
+ Collect.Definition = {
903
+ 'type': 'Collect',
904
+ 'metadata': {
905
+ 'source': true
906
+ },
907
+ 'params': [{
908
+ 'name': 'sort',
909
+ 'type': 'compare'
910
+ }]
911
+ };
912
+ inherits(Collect, Transform, {
913
+ transform(_, pulse) {
914
+ const out = pulse.fork(pulse.ALL),
915
+ list = SortedList(tupleid, this.value, out.materialize(out.ADD).add),
916
+ sort = _.sort,
917
+ mod = pulse.changed() || sort && (_.modified('sort') || pulse.modified(sort.fields));
918
+ out.visit(out.REM, list.remove);
919
+ this.modified(mod);
920
+ this.value = out.source = list.data(stableCompare(sort), mod);
921
+
922
+ // propagate tree root if defined
923
+ if (pulse.source && pulse.source.root) {
924
+ this.value.root = pulse.source.root;
925
+ }
926
+ return out;
927
+ }
928
+ });
929
+
930
+ /**
931
+ * Generates a comparator function.
932
+ * @constructor
933
+ * @param {object} params - The parameters for this operator.
934
+ * @param {Array<string|function>} params.fields - The fields to compare.
935
+ * @param {Array<string>} [params.orders] - The sort orders.
936
+ * Each entry should be one of "ascending" (default) or "descending".
937
+ */
938
+ function Compare(params) {
939
+ Operator.call(this, null, update$5, params);
940
+ }
941
+ inherits(Compare, Operator);
942
+ function update$5(_) {
943
+ return this.value && !_.modified() ? this.value : compare(_.fields, _.orders);
944
+ }
945
+
946
+ /**
947
+ * Count regexp-defined pattern occurrences in a text field.
948
+ * @constructor
949
+ * @param {object} params - The parameters for this operator.
950
+ * @param {function(object): *} params.field - An accessor for the text field.
951
+ * @param {string} [params.pattern] - RegExp string defining the text pattern.
952
+ * @param {string} [params.case] - One of 'lower', 'upper' or null (mixed) case.
953
+ * @param {string} [params.stopwords] - RegExp string of words to ignore.
954
+ */
955
+ function CountPattern(params) {
956
+ Transform.call(this, null, params);
957
+ }
958
+ CountPattern.Definition = {
959
+ 'type': 'CountPattern',
960
+ 'metadata': {
961
+ 'generates': true,
962
+ 'changes': true
963
+ },
964
+ 'params': [{
965
+ 'name': 'field',
966
+ 'type': 'field',
967
+ 'required': true
968
+ }, {
969
+ 'name': 'case',
970
+ 'type': 'enum',
971
+ 'values': ['upper', 'lower', 'mixed'],
972
+ 'default': 'mixed'
973
+ }, {
974
+ 'name': 'pattern',
975
+ 'type': 'string',
976
+ 'default': '[\\w"]+'
977
+ }, {
978
+ 'name': 'stopwords',
979
+ 'type': 'string',
980
+ 'default': ''
981
+ }, {
982
+ 'name': 'as',
983
+ 'type': 'string',
984
+ 'array': true,
985
+ 'length': 2,
986
+ 'default': ['text', 'count']
987
+ }]
988
+ };
989
+ function tokenize(text, tcase, match) {
990
+ switch (tcase) {
991
+ case 'upper':
992
+ text = text.toUpperCase();
993
+ break;
994
+ case 'lower':
995
+ text = text.toLowerCase();
996
+ break;
997
+ }
998
+ return text.match(match);
999
+ }
1000
+ inherits(CountPattern, Transform, {
1001
+ transform(_, pulse) {
1002
+ const process = update => tuple => {
1003
+ var tokens = tokenize(get(tuple), _.case, match) || [],
1004
+ t;
1005
+ for (var i = 0, n = tokens.length; i < n; ++i) {
1006
+ if (!stop.test(t = tokens[i])) update(t);
1007
+ }
1008
+ };
1009
+ const init = this._parameterCheck(_, pulse),
1010
+ counts = this._counts,
1011
+ match = this._match,
1012
+ stop = this._stop,
1013
+ get = _.field,
1014
+ as = _.as || ['text', 'count'],
1015
+ add = process(t => counts[t] = 1 + (counts[t] || 0)),
1016
+ rem = process(t => counts[t] -= 1);
1017
+ if (init) {
1018
+ pulse.visit(pulse.SOURCE, add);
1019
+ } else {
1020
+ pulse.visit(pulse.ADD, add);
1021
+ pulse.visit(pulse.REM, rem);
1022
+ }
1023
+ return this._finish(pulse, as); // generate output tuples
1024
+ },
1025
+ _parameterCheck(_, pulse) {
1026
+ let init = false;
1027
+ if (_.modified('stopwords') || !this._stop) {
1028
+ this._stop = new RegExp('^' + (_.stopwords || '') + '$', 'i');
1029
+ init = true;
1030
+ }
1031
+ if (_.modified('pattern') || !this._match) {
1032
+ this._match = new RegExp(_.pattern || '[\\w\']+', 'g');
1033
+ init = true;
1034
+ }
1035
+ if (_.modified('field') || pulse.modified(_.field.fields)) {
1036
+ init = true;
1037
+ }
1038
+ if (init) this._counts = {};
1039
+ return init;
1040
+ },
1041
+ _finish(pulse, as) {
1042
+ const counts = this._counts,
1043
+ tuples = this._tuples || (this._tuples = {}),
1044
+ text = as[0],
1045
+ count = as[1],
1046
+ out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS);
1047
+ let w, t, c;
1048
+ for (w in counts) {
1049
+ t = tuples[w];
1050
+ c = counts[w] || 0;
1051
+ if (!t && c) {
1052
+ tuples[w] = t = ingest$1({});
1053
+ t[text] = w;
1054
+ t[count] = c;
1055
+ out.add.push(t);
1056
+ } else if (c === 0) {
1057
+ if (t) out.rem.push(t);
1058
+ counts[w] = null;
1059
+ tuples[w] = null;
1060
+ } else if (t[count] !== c) {
1061
+ t[count] = c;
1062
+ out.mod.push(t);
1063
+ }
1064
+ }
1065
+ return out.modifies(as);
1066
+ }
1067
+ });
1068
+
1069
+ /**
1070
+ * Perform a cross-product of a tuple stream with itself.
1071
+ * @constructor
1072
+ * @param {object} params - The parameters for this operator.
1073
+ * @param {function(object):boolean} [params.filter] - An optional filter
1074
+ * function for selectively including tuples in the cross product.
1075
+ * @param {Array<string>} [params.as] - The names of the output fields.
1076
+ */
1077
+ function Cross(params) {
1078
+ Transform.call(this, null, params);
1079
+ }
1080
+ Cross.Definition = {
1081
+ 'type': 'Cross',
1082
+ 'metadata': {
1083
+ 'generates': true
1084
+ },
1085
+ 'params': [{
1086
+ 'name': 'filter',
1087
+ 'type': 'expr'
1088
+ }, {
1089
+ 'name': 'as',
1090
+ 'type': 'string',
1091
+ 'array': true,
1092
+ 'length': 2,
1093
+ 'default': ['a', 'b']
1094
+ }]
1095
+ };
1096
+ inherits(Cross, Transform, {
1097
+ transform(_, pulse) {
1098
+ const out = pulse.fork(pulse.NO_SOURCE),
1099
+ as = _.as || ['a', 'b'],
1100
+ a = as[0],
1101
+ b = as[1],
1102
+ reset = !this.value || pulse.changed(pulse.ADD_REM) || _.modified('as') || _.modified('filter');
1103
+ let data = this.value;
1104
+ if (reset) {
1105
+ if (data) out.rem = data;
1106
+ data = pulse.materialize(pulse.SOURCE).source;
1107
+ out.add = this.value = cross(data, a, b, _.filter || truthy);
1108
+ } else {
1109
+ out.mod = data;
1110
+ }
1111
+ out.source = this.value;
1112
+ return out.modifies(as);
1113
+ }
1114
+ });
1115
+ function cross(input, a, b, filter) {
1116
+ var data = [],
1117
+ t = {},
1118
+ n = input.length,
1119
+ i = 0,
1120
+ j,
1121
+ left;
1122
+ for (; i < n; ++i) {
1123
+ t[a] = left = input[i];
1124
+ for (j = 0; j < n; ++j) {
1125
+ t[b] = input[j];
1126
+ if (filter(t)) {
1127
+ data.push(ingest$1(t));
1128
+ t = {};
1129
+ t[a] = left;
1130
+ }
1131
+ }
1132
+ }
1133
+ return data;
1134
+ }
1135
+
1136
+ const Distributions = {
1137
+ kde: kde,
1138
+ mixture: mixture$1,
1139
+ normal: gaussian,
1140
+ lognormal: lognormal,
1141
+ uniform: uniform
1142
+ };
1143
+ const DISTRIBUTIONS = 'distributions',
1144
+ FUNCTION = 'function',
1145
+ FIELD = 'field';
1146
+
1147
+ /**
1148
+ * Parse a parameter object for a probability distribution.
1149
+ * @param {object} def - The distribution parameter object.
1150
+ * @param {function():Array<object>} - A method for requesting
1151
+ * source data. Used for distributions (such as KDE) that
1152
+ * require sample data points. This method will only be
1153
+ * invoked if the 'from' parameter for a target data source
1154
+ * is not provided. Typically this method returns backing
1155
+ * source data for a Pulse object.
1156
+ * @return {object} - The output distribution object.
1157
+ */
1158
+ function parse(def, data) {
1159
+ const func = def[FUNCTION];
1160
+ if (!has(Distributions, func)) {
1161
+ error('Unknown distribution function: ' + func);
1162
+ }
1163
+ const d = Distributions[func]();
1164
+ for (const name in def) {
1165
+ // if data field, extract values
1166
+ if (name === FIELD) {
1167
+ d.data((def.from || data()).map(def[name]));
1168
+ }
1169
+
1170
+ // if distribution mixture, recurse to parse each definition
1171
+ else if (name === DISTRIBUTIONS) {
1172
+ d[name](def[name].map(_ => parse(_, data)));
1173
+ }
1174
+
1175
+ // otherwise, simply set the parameter
1176
+ else if (typeof d[name] === FUNCTION) {
1177
+ d[name](def[name]);
1178
+ }
1179
+ }
1180
+ return d;
1181
+ }
1182
+
1183
+ /**
1184
+ * Grid sample points for a probability density. Given a distribution and
1185
+ * a sampling extent, will generate points suitable for plotting either
1186
+ * PDF (probability density function) or CDF (cumulative distribution
1187
+ * function) curves.
1188
+ * @constructor
1189
+ * @param {object} params - The parameters for this operator.
1190
+ * @param {object} params.distribution - The probability distribution. This
1191
+ * is an object parameter dependent on the distribution type.
1192
+ * @param {string} [params.method='pdf'] - The distribution method to sample.
1193
+ * One of 'pdf' or 'cdf'.
1194
+ * @param {Array<number>} [params.extent] - The [min, max] extent over which
1195
+ * to sample the distribution. This argument is required in most cases, but
1196
+ * can be omitted if the distribution (e.g., 'kde') supports a 'data' method
1197
+ * that returns numerical sample points from which the extent can be deduced.
1198
+ * @param {number} [params.minsteps=25] - The minimum number of curve samples
1199
+ * for plotting the density.
1200
+ * @param {number} [params.maxsteps=200] - The maximum number of curve samples
1201
+ * for plotting the density.
1202
+ * @param {number} [params.steps] - The exact number of curve samples for
1203
+ * plotting the density. If specified, overrides both minsteps and maxsteps
1204
+ * to set an exact number of uniform samples. Useful in conjunction with
1205
+ * a fixed extent to ensure consistent sample points for stacked densities.
1206
+ */
1207
+ function Density(params) {
1208
+ Transform.call(this, null, params);
1209
+ }
1210
+ const distributions = [{
1211
+ 'key': {
1212
+ 'function': 'normal'
1213
+ },
1214
+ 'params': [{
1215
+ 'name': 'mean',
1216
+ 'type': 'number',
1217
+ 'default': 0
1218
+ }, {
1219
+ 'name': 'stdev',
1220
+ 'type': 'number',
1221
+ 'default': 1
1222
+ }]
1223
+ }, {
1224
+ 'key': {
1225
+ 'function': 'lognormal'
1226
+ },
1227
+ 'params': [{
1228
+ 'name': 'mean',
1229
+ 'type': 'number',
1230
+ 'default': 0
1231
+ }, {
1232
+ 'name': 'stdev',
1233
+ 'type': 'number',
1234
+ 'default': 1
1235
+ }]
1236
+ }, {
1237
+ 'key': {
1238
+ 'function': 'uniform'
1239
+ },
1240
+ 'params': [{
1241
+ 'name': 'min',
1242
+ 'type': 'number',
1243
+ 'default': 0
1244
+ }, {
1245
+ 'name': 'max',
1246
+ 'type': 'number',
1247
+ 'default': 1
1248
+ }]
1249
+ }, {
1250
+ 'key': {
1251
+ 'function': 'kde'
1252
+ },
1253
+ 'params': [{
1254
+ 'name': 'field',
1255
+ 'type': 'field',
1256
+ 'required': true
1257
+ }, {
1258
+ 'name': 'from',
1259
+ 'type': 'data'
1260
+ }, {
1261
+ 'name': 'bandwidth',
1262
+ 'type': 'number',
1263
+ 'default': 0
1264
+ }]
1265
+ }];
1266
+ const mixture = {
1267
+ 'key': {
1268
+ 'function': 'mixture'
1269
+ },
1270
+ 'params': [{
1271
+ 'name': 'distributions',
1272
+ 'type': 'param',
1273
+ 'array': true,
1274
+ 'params': distributions
1275
+ }, {
1276
+ 'name': 'weights',
1277
+ 'type': 'number',
1278
+ 'array': true
1279
+ }]
1280
+ };
1281
+ Density.Definition = {
1282
+ 'type': 'Density',
1283
+ 'metadata': {
1284
+ 'generates': true
1285
+ },
1286
+ 'params': [{
1287
+ 'name': 'extent',
1288
+ 'type': 'number',
1289
+ 'array': true,
1290
+ 'length': 2
1291
+ }, {
1292
+ 'name': 'steps',
1293
+ 'type': 'number'
1294
+ }, {
1295
+ 'name': 'minsteps',
1296
+ 'type': 'number',
1297
+ 'default': 25
1298
+ }, {
1299
+ 'name': 'maxsteps',
1300
+ 'type': 'number',
1301
+ 'default': 200
1302
+ }, {
1303
+ 'name': 'method',
1304
+ 'type': 'string',
1305
+ 'default': 'pdf',
1306
+ 'values': ['pdf', 'cdf']
1307
+ }, {
1308
+ 'name': 'distribution',
1309
+ 'type': 'param',
1310
+ 'params': distributions.concat(mixture)
1311
+ }, {
1312
+ 'name': 'as',
1313
+ 'type': 'string',
1314
+ 'array': true,
1315
+ 'default': ['value', 'density']
1316
+ }]
1317
+ };
1318
+ inherits(Density, Transform, {
1319
+ transform(_, pulse) {
1320
+ const out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS);
1321
+ if (!this.value || pulse.changed() || _.modified()) {
1322
+ const dist = parse(_.distribution, source(pulse)),
1323
+ minsteps = _.steps || _.minsteps || 25,
1324
+ maxsteps = _.steps || _.maxsteps || 200;
1325
+ let method = _.method || 'pdf';
1326
+ if (method !== 'pdf' && method !== 'cdf') {
1327
+ error('Invalid density method: ' + method);
1328
+ }
1329
+ if (!_.extent && !dist.data) {
1330
+ error('Missing density extent parameter.');
1331
+ }
1332
+ method = dist[method];
1333
+ const as = _.as || ['value', 'density'],
1334
+ domain = _.extent || extent(dist.data()),
1335
+ values = sampleCurve(method, domain, minsteps, maxsteps).map(v => {
1336
+ const tuple = {};
1337
+ tuple[as[0]] = v[0];
1338
+ tuple[as[1]] = v[1];
1339
+ return ingest$1(tuple);
1340
+ });
1341
+ if (this.value) out.rem = this.value;
1342
+ this.value = out.add = out.source = values;
1343
+ }
1344
+ return out;
1345
+ }
1346
+ });
1347
+ function source(pulse) {
1348
+ return () => pulse.materialize(pulse.SOURCE).source;
1349
+ }
1350
+
1351
+ // use either provided alias or accessor field name
1352
+ function fieldNames(fields, as) {
1353
+ if (!fields) return null;
1354
+ return fields.map((f, i) => as[i] || accessorName(f));
1355
+ }
1356
+ function partition$1(data, groupby, field) {
1357
+ const groups = [],
1358
+ get = f => f(t);
1359
+ let map, i, n, t, k, g;
1360
+
1361
+ // partition data points into groups
1362
+ if (groupby == null) {
1363
+ groups.push(data.map(field));
1364
+ } else {
1365
+ for (map = {}, i = 0, n = data.length; i < n; ++i) {
1366
+ t = data[i];
1367
+ k = groupby.map(get);
1368
+ g = map[k];
1369
+ if (!g) {
1370
+ map[k] = g = [];
1371
+ g.dims = k;
1372
+ groups.push(g);
1373
+ }
1374
+ g.push(field(t));
1375
+ }
1376
+ }
1377
+ return groups;
1378
+ }
1379
+
1380
+ const Output = 'bin';
1381
+
1382
+ /**
1383
+ * Dot density binning for dot plot construction.
1384
+ * Based on Leland Wilkinson, Dot Plots, The American Statistician, 1999.
1385
+ * https://www.cs.uic.edu/~wilkinson/Publications/dotplots.pdf
1386
+ * @constructor
1387
+ * @param {object} params - The parameters for this operator.
1388
+ * @param {function(object): *} params.field - The value field to bin.
1389
+ * @param {Array<function(object): *>} [params.groupby] - An array of accessors to groupby.
1390
+ * @param {number} [params.step] - The step size (bin width) within which dots should be
1391
+ * stacked. Defaults to 1/30 of the extent of the data *field*.
1392
+ * @param {boolean} [params.smooth=false] - A boolean flag indicating if dot density
1393
+ * stacks should be smoothed to reduce variance.
1394
+ */
1395
+ function DotBin(params) {
1396
+ Transform.call(this, null, params);
1397
+ }
1398
+ DotBin.Definition = {
1399
+ 'type': 'DotBin',
1400
+ 'metadata': {
1401
+ 'modifies': true
1402
+ },
1403
+ 'params': [{
1404
+ 'name': 'field',
1405
+ 'type': 'field',
1406
+ 'required': true
1407
+ }, {
1408
+ 'name': 'groupby',
1409
+ 'type': 'field',
1410
+ 'array': true
1411
+ }, {
1412
+ 'name': 'step',
1413
+ 'type': 'number'
1414
+ }, {
1415
+ 'name': 'smooth',
1416
+ 'type': 'boolean',
1417
+ 'default': false
1418
+ }, {
1419
+ 'name': 'as',
1420
+ 'type': 'string',
1421
+ 'default': Output
1422
+ }]
1423
+ };
1424
+ const autostep = (data, field) => span(extent(data, field)) / 30;
1425
+ inherits(DotBin, Transform, {
1426
+ transform(_, pulse) {
1427
+ if (this.value && !(_.modified() || pulse.changed())) {
1428
+ return pulse; // early exit
1429
+ }
1430
+ const source = pulse.materialize(pulse.SOURCE).source,
1431
+ groups = partition$1(pulse.source, _.groupby, identity),
1432
+ smooth = _.smooth || false,
1433
+ field = _.field,
1434
+ step = _.step || autostep(source, field),
1435
+ sort = stableCompare((a, b) => field(a) - field(b)),
1436
+ as = _.as || Output,
1437
+ n = groups.length;
1438
+
1439
+ // compute dotplot bins per group
1440
+ let min = Infinity,
1441
+ max = -Infinity,
1442
+ i = 0,
1443
+ j;
1444
+ for (; i < n; ++i) {
1445
+ const g = groups[i].sort(sort);
1446
+ j = -1;
1447
+ for (const v of dotbin(g, step, smooth, field)) {
1448
+ if (v < min) min = v;
1449
+ if (v > max) max = v;
1450
+ g[++j][as] = v;
1451
+ }
1452
+ }
1453
+ this.value = {
1454
+ start: min,
1455
+ stop: max,
1456
+ step: step
1457
+ };
1458
+ return pulse.reflow(true).modifies(as);
1459
+ }
1460
+ });
1461
+
1462
+ /**
1463
+ * Wraps an expression function with access to external parameters.
1464
+ * @constructor
1465
+ * @param {object} params - The parameters for this operator.
1466
+ * @param {function} params.expr - The expression function. The
1467
+ * function should accept both a datum and a parameter object.
1468
+ * This operator's value will be a new function that wraps the
1469
+ * expression function with access to this operator's parameters.
1470
+ */
1471
+ function Expression(params) {
1472
+ Operator.call(this, null, update$4, params);
1473
+ this.modified(true);
1474
+ }
1475
+ inherits(Expression, Operator);
1476
+ function update$4(_) {
1477
+ const expr = _.expr;
1478
+ return this.value && !_.modified('expr') ? this.value : accessor(datum => expr(datum, _), accessorFields(expr), accessorName(expr));
1479
+ }
1480
+
1481
+ /**
1482
+ * Computes extents (min/max) for a data field.
1483
+ * @constructor
1484
+ * @param {object} params - The parameters for this operator.
1485
+ * @param {function(object): *} params.field - The field over which to compute extends.
1486
+ */
1487
+ function Extent(params) {
1488
+ Transform.call(this, [undefined, undefined], params);
1489
+ }
1490
+ Extent.Definition = {
1491
+ 'type': 'Extent',
1492
+ 'metadata': {},
1493
+ 'params': [{
1494
+ 'name': 'field',
1495
+ 'type': 'field',
1496
+ 'required': true
1497
+ }]
1498
+ };
1499
+ inherits(Extent, Transform, {
1500
+ transform(_, pulse) {
1501
+ const extent = this.value,
1502
+ field = _.field,
1503
+ mod = pulse.changed() || pulse.modified(field.fields) || _.modified('field');
1504
+ let min = extent[0],
1505
+ max = extent[1];
1506
+ if (mod || min == null) {
1507
+ min = +Infinity;
1508
+ max = -Infinity;
1509
+ }
1510
+ pulse.visit(mod ? pulse.SOURCE : pulse.ADD, t => {
1511
+ const v = toNumber(field(t));
1512
+ if (v != null) {
1513
+ // NaNs will fail all comparisons!
1514
+ if (v < min) min = v;
1515
+ if (v > max) max = v;
1516
+ }
1517
+ });
1518
+ if (!Number.isFinite(min) || !Number.isFinite(max)) {
1519
+ let name = accessorName(field);
1520
+ if (name) name = ` for field "${name}"`;
1521
+ pulse.dataflow.warn(`Infinite extent${name}: [${min}, ${max}]`);
1522
+ min = max = undefined;
1523
+ }
1524
+ this.value = [min, max];
1525
+ }
1526
+ });
1527
+
1528
+ /**
1529
+ * Provides a bridge between a parent transform and a target subflow that
1530
+ * consumes only a subset of the tuples that pass through the parent.
1531
+ * @constructor
1532
+ * @param {Pulse} pulse - A pulse to use as the value of this operator.
1533
+ * @param {Transform} parent - The parent transform (typically a Facet instance).
1534
+ */
1535
+ function Subflow(pulse, parent) {
1536
+ Operator.call(this, pulse);
1537
+ this.parent = parent;
1538
+ this.count = 0;
1539
+ }
1540
+ inherits(Subflow, Operator, {
1541
+ /**
1542
+ * Routes pulses from this subflow to a target transform.
1543
+ * @param {Transform} target - A transform that receives the subflow of tuples.
1544
+ */
1545
+ connect(target) {
1546
+ this.detachSubflow = target.detachSubflow;
1547
+ this.targets().add(target);
1548
+ return target.source = this;
1549
+ },
1550
+ /**
1551
+ * Add an 'add' tuple to the subflow pulse.
1552
+ * @param {Tuple} t - The tuple being added.
1553
+ */
1554
+ add(t) {
1555
+ this.count += 1;
1556
+ this.value.add.push(t);
1557
+ },
1558
+ /**
1559
+ * Add a 'rem' tuple to the subflow pulse.
1560
+ * @param {Tuple} t - The tuple being removed.
1561
+ */
1562
+ rem(t) {
1563
+ this.count -= 1;
1564
+ this.value.rem.push(t);
1565
+ },
1566
+ /**
1567
+ * Add a 'mod' tuple to the subflow pulse.
1568
+ * @param {Tuple} t - The tuple being modified.
1569
+ */
1570
+ mod(t) {
1571
+ this.value.mod.push(t);
1572
+ },
1573
+ /**
1574
+ * Re-initialize this operator's pulse value.
1575
+ * @param {Pulse} pulse - The pulse to copy from.
1576
+ * @see Pulse.init
1577
+ */
1578
+ init(pulse) {
1579
+ this.value.init(pulse, pulse.NO_SOURCE);
1580
+ },
1581
+ /**
1582
+ * Evaluate this operator. This method overrides the
1583
+ * default behavior to simply return the contained pulse value.
1584
+ * @return {Pulse}
1585
+ */
1586
+ evaluate() {
1587
+ // assert: this.value.stamp === pulse.stamp
1588
+ return this.value;
1589
+ }
1590
+ });
1591
+
1592
+ /**
1593
+ * Facets a dataflow into a set of subflows based on a key.
1594
+ * @constructor
1595
+ * @param {object} params - The parameters for this operator.
1596
+ * @param {function(Dataflow, string): Operator} params.subflow - A function
1597
+ * that generates a subflow of operators and returns its root operator.
1598
+ * @param {function(object): *} params.key - The key field to facet by.
1599
+ */
1600
+ function Facet(params) {
1601
+ Transform.call(this, {}, params);
1602
+ this._keys = fastmap(); // cache previously calculated key values
1603
+
1604
+ // keep track of active subflows, use as targets array for listeners
1605
+ // this allows us to limit propagation to only updated subflows
1606
+ const a = this._targets = [];
1607
+ a.active = 0;
1608
+ a.forEach = f => {
1609
+ for (let i = 0, n = a.active; i < n; ++i) {
1610
+ f(a[i], i, a);
1611
+ }
1612
+ };
1613
+ }
1614
+ inherits(Facet, Transform, {
1615
+ activate(flow) {
1616
+ this._targets[this._targets.active++] = flow;
1617
+ },
1618
+ // parent argument provided by PreFacet subclass
1619
+ subflow(key, flow, pulse, parent) {
1620
+ const flows = this.value;
1621
+ let sf = has(flows, key) && flows[key],
1622
+ df,
1623
+ p;
1624
+ if (!sf) {
1625
+ p = parent || (p = this._group[key]) && p.tuple;
1626
+ df = pulse.dataflow;
1627
+ sf = new Subflow(pulse.fork(pulse.NO_SOURCE), this);
1628
+ df.add(sf).connect(flow(df, key, p));
1629
+ flows[key] = sf;
1630
+ this.activate(sf);
1631
+ } else if (sf.value.stamp < pulse.stamp) {
1632
+ sf.init(pulse);
1633
+ this.activate(sf);
1634
+ }
1635
+ return sf;
1636
+ },
1637
+ clean() {
1638
+ const flows = this.value;
1639
+ let detached = 0;
1640
+ for (const key in flows) {
1641
+ if (flows[key].count === 0) {
1642
+ const detach = flows[key].detachSubflow;
1643
+ if (detach) detach();
1644
+ delete flows[key];
1645
+ ++detached;
1646
+ }
1647
+ }
1648
+
1649
+ // remove inactive targets from the active targets array
1650
+ if (detached) {
1651
+ const active = this._targets.filter(sf => sf && sf.count > 0);
1652
+ this.initTargets(active);
1653
+ }
1654
+ },
1655
+ initTargets(act) {
1656
+ const a = this._targets,
1657
+ n = a.length,
1658
+ m = act ? act.length : 0;
1659
+ let i = 0;
1660
+ for (; i < m; ++i) {
1661
+ a[i] = act[i];
1662
+ }
1663
+ for (; i < n && a[i] != null; ++i) {
1664
+ a[i] = null; // ensure old flows can be garbage collected
1665
+ }
1666
+ a.active = m;
1667
+ },
1668
+ transform(_, pulse) {
1669
+ const df = pulse.dataflow,
1670
+ key = _.key,
1671
+ flow = _.subflow,
1672
+ cache = this._keys,
1673
+ rekey = _.modified('key'),
1674
+ subflow = key => this.subflow(key, flow, pulse);
1675
+ this._group = _.group || {};
1676
+ this.initTargets(); // reset list of active subflows
1677
+
1678
+ pulse.visit(pulse.REM, t => {
1679
+ const id = tupleid(t),
1680
+ k = cache.get(id);
1681
+ if (k !== undefined) {
1682
+ cache.delete(id);
1683
+ subflow(k).rem(t);
1684
+ }
1685
+ });
1686
+ pulse.visit(pulse.ADD, t => {
1687
+ const k = key(t);
1688
+ cache.set(tupleid(t), k);
1689
+ subflow(k).add(t);
1690
+ });
1691
+ if (rekey || pulse.modified(key.fields)) {
1692
+ pulse.visit(pulse.MOD, t => {
1693
+ const id = tupleid(t),
1694
+ k0 = cache.get(id),
1695
+ k1 = key(t);
1696
+ if (k0 === k1) {
1697
+ subflow(k1).mod(t);
1698
+ } else {
1699
+ cache.set(id, k1);
1700
+ subflow(k0).rem(t);
1701
+ subflow(k1).add(t);
1702
+ }
1703
+ });
1704
+ } else if (pulse.changed(pulse.MOD)) {
1705
+ pulse.visit(pulse.MOD, t => {
1706
+ subflow(cache.get(tupleid(t))).mod(t);
1707
+ });
1708
+ }
1709
+ if (rekey) {
1710
+ pulse.visit(pulse.REFLOW, t => {
1711
+ const id = tupleid(t),
1712
+ k0 = cache.get(id),
1713
+ k1 = key(t);
1714
+ if (k0 !== k1) {
1715
+ cache.set(id, k1);
1716
+ subflow(k0).rem(t);
1717
+ subflow(k1).add(t);
1718
+ }
1719
+ });
1720
+ }
1721
+ if (pulse.clean()) {
1722
+ df.runAfter(() => {
1723
+ this.clean();
1724
+ cache.clean();
1725
+ });
1726
+ } else if (cache.empty > df.cleanThreshold) {
1727
+ df.runAfter(cache.clean);
1728
+ }
1729
+ return pulse;
1730
+ }
1731
+ });
1732
+
1733
+ /**
1734
+ * Generates one or more field accessor functions.
1735
+ * If the 'name' parameter is an array, an array of field accessors
1736
+ * will be created and the 'as' parameter will be ignored.
1737
+ * @constructor
1738
+ * @param {object} params - The parameters for this operator.
1739
+ * @param {string} params.name - The field name(s) to access.
1740
+ * @param {string} params.as - The accessor function name.
1741
+ */
1742
+ function Field(params) {
1743
+ Operator.call(this, null, update$3, params);
1744
+ }
1745
+ inherits(Field, Operator);
1746
+ function update$3(_) {
1747
+ return this.value && !_.modified() ? this.value : isArray(_.name) ? array(_.name).map(f => field(f)) : field(_.name, _.as);
1748
+ }
1749
+
1750
+ /**
1751
+ * Filters data tuples according to a predicate function.
1752
+ * @constructor
1753
+ * @param {object} params - The parameters for this operator.
1754
+ * @param {function(object): *} params.expr - The predicate expression function
1755
+ * that determines a tuple's filter status. Truthy values pass the filter.
1756
+ */
1757
+ function Filter(params) {
1758
+ Transform.call(this, fastmap(), params);
1759
+ }
1760
+ Filter.Definition = {
1761
+ 'type': 'Filter',
1762
+ 'metadata': {
1763
+ 'changes': true
1764
+ },
1765
+ 'params': [{
1766
+ 'name': 'expr',
1767
+ 'type': 'expr',
1768
+ 'required': true
1769
+ }]
1770
+ };
1771
+ inherits(Filter, Transform, {
1772
+ transform(_, pulse) {
1773
+ const df = pulse.dataflow,
1774
+ cache = this.value,
1775
+ // cache ids of filtered tuples
1776
+ output = pulse.fork(),
1777
+ add = output.add,
1778
+ rem = output.rem,
1779
+ mod = output.mod,
1780
+ test = _.expr;
1781
+ let isMod = true;
1782
+ pulse.visit(pulse.REM, t => {
1783
+ const id = tupleid(t);
1784
+ if (!cache.has(id)) rem.push(t);else cache.delete(id);
1785
+ });
1786
+ pulse.visit(pulse.ADD, t => {
1787
+ if (test(t, _)) add.push(t);else cache.set(tupleid(t), 1);
1788
+ });
1789
+ function revisit(t) {
1790
+ const id = tupleid(t),
1791
+ b = test(t, _),
1792
+ s = cache.get(id);
1793
+ if (b && s) {
1794
+ cache.delete(id);
1795
+ add.push(t);
1796
+ } else if (!b && !s) {
1797
+ cache.set(id, 1);
1798
+ rem.push(t);
1799
+ } else if (isMod && b && !s) {
1800
+ mod.push(t);
1801
+ }
1802
+ }
1803
+ pulse.visit(pulse.MOD, revisit);
1804
+ if (_.modified()) {
1805
+ isMod = false;
1806
+ pulse.visit(pulse.REFLOW, revisit);
1807
+ }
1808
+ if (cache.empty > df.cleanThreshold) df.runAfter(cache.clean);
1809
+ return output;
1810
+ }
1811
+ });
1812
+
1813
+ /**
1814
+ * Flattens array-typed field values into new data objects.
1815
+ * If multiple fields are specified, they are treated as parallel arrays,
1816
+ * with output values included for each matching index (or null if missing).
1817
+ * @constructor
1818
+ * @param {object} params - The parameters for this operator.
1819
+ * @param {Array<function(object): *>} params.fields - An array of field
1820
+ * accessors for the tuple fields that should be flattened.
1821
+ * @param {string} [params.index] - Optional output field name for index
1822
+ * value. If unspecified, no index field is included in the output.
1823
+ * @param {Array<string>} [params.as] - Output field names for flattened
1824
+ * array fields. Any unspecified fields will use the field name provided
1825
+ * by the fields accessors.
1826
+ */
1827
+ function Flatten(params) {
1828
+ Transform.call(this, [], params);
1829
+ }
1830
+ Flatten.Definition = {
1831
+ 'type': 'Flatten',
1832
+ 'metadata': {
1833
+ 'generates': true
1834
+ },
1835
+ 'params': [{
1836
+ 'name': 'fields',
1837
+ 'type': 'field',
1838
+ 'array': true,
1839
+ 'required': true
1840
+ }, {
1841
+ 'name': 'index',
1842
+ 'type': 'string'
1843
+ }, {
1844
+ 'name': 'as',
1845
+ 'type': 'string',
1846
+ 'array': true
1847
+ }]
1848
+ };
1849
+ inherits(Flatten, Transform, {
1850
+ transform(_, pulse) {
1851
+ const out = pulse.fork(pulse.NO_SOURCE),
1852
+ fields = _.fields,
1853
+ as = fieldNames(fields, _.as || []),
1854
+ index = _.index || null,
1855
+ m = as.length;
1856
+
1857
+ // remove any previous results
1858
+ out.rem = this.value;
1859
+
1860
+ // generate flattened tuples
1861
+ pulse.visit(pulse.SOURCE, t => {
1862
+ const arrays = fields.map(f => f(t)),
1863
+ maxlen = arrays.reduce((l, a) => Math.max(l, a.length), 0);
1864
+ let i = 0,
1865
+ j,
1866
+ d,
1867
+ v;
1868
+ for (; i < maxlen; ++i) {
1869
+ d = derive(t);
1870
+ for (j = 0; j < m; ++j) {
1871
+ d[as[j]] = (v = arrays[j][i]) == null ? null : v;
1872
+ }
1873
+ if (index) {
1874
+ d[index] = i;
1875
+ }
1876
+ out.add.push(d);
1877
+ }
1878
+ });
1879
+ this.value = out.source = out.add;
1880
+ if (index) out.modifies(index);
1881
+ return out.modifies(as);
1882
+ }
1883
+ });
1884
+
1885
+ /**
1886
+ * Folds one more tuple fields into multiple tuples in which the field
1887
+ * name and values are available under new 'key' and 'value' fields.
1888
+ * @constructor
1889
+ * @param {object} params - The parameters for this operator.
1890
+ * @param {function(object): *} params.fields - An array of field accessors
1891
+ * for the tuple fields that should be folded.
1892
+ * @param {Array<string>} [params.as] - Output field names for folded key
1893
+ * and value fields, defaults to ['key', 'value'].
1894
+ */
1895
+ function Fold(params) {
1896
+ Transform.call(this, [], params);
1897
+ }
1898
+ Fold.Definition = {
1899
+ 'type': 'Fold',
1900
+ 'metadata': {
1901
+ 'generates': true
1902
+ },
1903
+ 'params': [{
1904
+ 'name': 'fields',
1905
+ 'type': 'field',
1906
+ 'array': true,
1907
+ 'required': true
1908
+ }, {
1909
+ 'name': 'as',
1910
+ 'type': 'string',
1911
+ 'array': true,
1912
+ 'length': 2,
1913
+ 'default': ['key', 'value']
1914
+ }]
1915
+ };
1916
+ inherits(Fold, Transform, {
1917
+ transform(_, pulse) {
1918
+ const out = pulse.fork(pulse.NO_SOURCE),
1919
+ fields = _.fields,
1920
+ fnames = fields.map(accessorName),
1921
+ as = _.as || ['key', 'value'],
1922
+ k = as[0],
1923
+ v = as[1],
1924
+ n = fields.length;
1925
+ out.rem = this.value;
1926
+ pulse.visit(pulse.SOURCE, t => {
1927
+ for (let i = 0, d; i < n; ++i) {
1928
+ d = derive(t);
1929
+ d[k] = fnames[i];
1930
+ d[v] = fields[i](t);
1931
+ out.add.push(d);
1932
+ }
1933
+ });
1934
+ this.value = out.source = out.add;
1935
+ return out.modifies(as);
1936
+ }
1937
+ });
1938
+
1939
+ /**
1940
+ * Invokes a function for each data tuple and saves the results as a new field.
1941
+ * @constructor
1942
+ * @param {object} params - The parameters for this operator.
1943
+ * @param {function(object): *} params.expr - The formula function to invoke for each tuple.
1944
+ * @param {string} params.as - The field name under which to save the result.
1945
+ * @param {boolean} [params.initonly=false] - If true, the formula is applied to
1946
+ * added tuples only, and does not update in response to modifications.
1947
+ */
1948
+ function Formula(params) {
1949
+ Transform.call(this, null, params);
1950
+ }
1951
+ Formula.Definition = {
1952
+ 'type': 'Formula',
1953
+ 'metadata': {
1954
+ 'modifies': true
1955
+ },
1956
+ 'params': [{
1957
+ 'name': 'expr',
1958
+ 'type': 'expr',
1959
+ 'required': true
1960
+ }, {
1961
+ 'name': 'as',
1962
+ 'type': 'string',
1963
+ 'required': true
1964
+ }, {
1965
+ 'name': 'initonly',
1966
+ 'type': 'boolean'
1967
+ }]
1968
+ };
1969
+ inherits(Formula, Transform, {
1970
+ transform(_, pulse) {
1971
+ const func = _.expr,
1972
+ as = _.as,
1973
+ mod = _.modified(),
1974
+ flag = _.initonly ? pulse.ADD : mod ? pulse.SOURCE : pulse.modified(func.fields) || pulse.modified(as) ? pulse.ADD_MOD : pulse.ADD;
1975
+ if (mod) {
1976
+ // parameters updated, need to reflow
1977
+ pulse = pulse.materialize().reflow(true);
1978
+ }
1979
+ if (!_.initonly) {
1980
+ pulse.modifies(as);
1981
+ }
1982
+ return pulse.visit(flag, t => t[as] = func(t, _));
1983
+ }
1984
+ });
1985
+
1986
+ /**
1987
+ * Generates data tuples using a provided generator function.
1988
+ * @constructor
1989
+ * @param {object} params - The parameters for this operator.
1990
+ * @param {function(Parameters): object} params.generator - A tuple generator
1991
+ * function. This function is given the operator parameters as input.
1992
+ * Changes to any additional parameters will not trigger re-calculation
1993
+ * of previously generated tuples. Only future tuples are affected.
1994
+ * @param {number} params.size - The number of tuples to produce.
1995
+ */
1996
+ function Generate(params) {
1997
+ Transform.call(this, [], params);
1998
+ }
1999
+ inherits(Generate, Transform, {
2000
+ transform(_, pulse) {
2001
+ const out = pulse.fork(pulse.ALL),
2002
+ gen = _.generator;
2003
+ let data = this.value,
2004
+ num = _.size - data.length,
2005
+ add,
2006
+ rem,
2007
+ t;
2008
+ if (num > 0) {
2009
+ // need more tuples, generate and add
2010
+ for (add = []; --num >= 0;) {
2011
+ add.push(t = ingest$1(gen(_)));
2012
+ data.push(t);
2013
+ }
2014
+ out.add = out.add.length ? out.materialize(out.ADD).add.concat(add) : add;
2015
+ } else {
2016
+ // need fewer tuples, remove
2017
+ rem = data.slice(0, -num);
2018
+ out.rem = out.rem.length ? out.materialize(out.REM).rem.concat(rem) : rem;
2019
+ data = data.slice(-num);
2020
+ }
2021
+ out.source = this.value = data;
2022
+ return out;
2023
+ }
2024
+ });
2025
+
2026
+ const Methods = {
2027
+ value: 'value',
2028
+ median: median,
2029
+ mean: mean,
2030
+ min: min,
2031
+ max: max
2032
+ };
2033
+ const Empty = [];
2034
+
2035
+ /**
2036
+ * Impute missing values.
2037
+ * @constructor
2038
+ * @param {object} params - The parameters for this operator.
2039
+ * @param {function(object): *} params.field - The value field to impute.
2040
+ * @param {Array<function(object): *>} [params.groupby] - An array of
2041
+ * accessors to determine series within which to perform imputation.
2042
+ * @param {function(object): *} params.key - An accessor for a key value.
2043
+ * Each key value should be unique within a group. New tuples will be
2044
+ * imputed for any key values that are not found within a group.
2045
+ * @param {Array<*>} [params.keyvals] - Optional array of required key
2046
+ * values. New tuples will be imputed for any key values that are not
2047
+ * found within a group. In addition, these values will be automatically
2048
+ * augmented with the key values observed in the input data.
2049
+ * @param {string} [method='value'] - The imputation method to use. One of
2050
+ * 'value', 'mean', 'median', 'max', 'min'.
2051
+ * @param {*} [value=0] - The constant value to use for imputation
2052
+ * when using method 'value'.
2053
+ */
2054
+ function Impute(params) {
2055
+ Transform.call(this, [], params);
2056
+ }
2057
+ Impute.Definition = {
2058
+ 'type': 'Impute',
2059
+ 'metadata': {
2060
+ 'changes': true
2061
+ },
2062
+ 'params': [{
2063
+ 'name': 'field',
2064
+ 'type': 'field',
2065
+ 'required': true
2066
+ }, {
2067
+ 'name': 'key',
2068
+ 'type': 'field',
2069
+ 'required': true
2070
+ }, {
2071
+ 'name': 'keyvals',
2072
+ 'array': true
2073
+ }, {
2074
+ 'name': 'groupby',
2075
+ 'type': 'field',
2076
+ 'array': true
2077
+ }, {
2078
+ 'name': 'method',
2079
+ 'type': 'enum',
2080
+ 'default': 'value',
2081
+ 'values': ['value', 'mean', 'median', 'max', 'min']
2082
+ }, {
2083
+ 'name': 'value',
2084
+ 'default': 0
2085
+ }]
2086
+ };
2087
+ function getValue(_) {
2088
+ var m = _.method || Methods.value,
2089
+ v;
2090
+ if (Methods[m] == null) {
2091
+ error('Unrecognized imputation method: ' + m);
2092
+ } else if (m === Methods.value) {
2093
+ v = _.value !== undefined ? _.value : 0;
2094
+ return () => v;
2095
+ } else {
2096
+ return Methods[m];
2097
+ }
2098
+ }
2099
+ function getField(_) {
2100
+ const f = _.field;
2101
+ return t => t ? f(t) : NaN;
2102
+ }
2103
+ inherits(Impute, Transform, {
2104
+ transform(_, pulse) {
2105
+ var out = pulse.fork(pulse.ALL),
2106
+ impute = getValue(_),
2107
+ field = getField(_),
2108
+ fName = accessorName(_.field),
2109
+ kName = accessorName(_.key),
2110
+ gNames = (_.groupby || []).map(accessorName),
2111
+ groups = partition(pulse.source, _.groupby, _.key, _.keyvals),
2112
+ curr = [],
2113
+ prev = this.value,
2114
+ m = groups.domain.length,
2115
+ group,
2116
+ value,
2117
+ gVals,
2118
+ kVal,
2119
+ g,
2120
+ i,
2121
+ j,
2122
+ l,
2123
+ n,
2124
+ t;
2125
+ for (g = 0, l = groups.length; g < l; ++g) {
2126
+ group = groups[g];
2127
+ gVals = group.values;
2128
+ value = NaN;
2129
+
2130
+ // add tuples for missing values
2131
+ for (j = 0; j < m; ++j) {
2132
+ if (group[j] != null) continue;
2133
+ kVal = groups.domain[j];
2134
+ t = {
2135
+ _impute: true
2136
+ };
2137
+ for (i = 0, n = gVals.length; i < n; ++i) t[gNames[i]] = gVals[i];
2138
+ t[kName] = kVal;
2139
+ t[fName] = Number.isNaN(value) ? value = impute(group, field) : value;
2140
+ curr.push(ingest$1(t));
2141
+ }
2142
+ }
2143
+
2144
+ // update pulse with imputed tuples
2145
+ if (curr.length) out.add = out.materialize(out.ADD).add.concat(curr);
2146
+ if (prev.length) out.rem = out.materialize(out.REM).rem.concat(prev);
2147
+ this.value = curr;
2148
+ return out;
2149
+ }
2150
+ });
2151
+ function partition(data, groupby, key, keyvals) {
2152
+ var get = f => f(t),
2153
+ groups = [],
2154
+ domain = keyvals ? keyvals.slice() : [],
2155
+ kMap = {},
2156
+ gMap = {},
2157
+ gVals,
2158
+ gKey,
2159
+ group,
2160
+ i,
2161
+ j,
2162
+ k,
2163
+ n,
2164
+ t;
2165
+ domain.forEach((k, i) => kMap[k] = i + 1);
2166
+ for (i = 0, n = data.length; i < n; ++i) {
2167
+ t = data[i];
2168
+ k = key(t);
2169
+ j = kMap[k] || (kMap[k] = domain.push(k));
2170
+ gKey = (gVals = groupby ? groupby.map(get) : Empty) + '';
2171
+ if (!(group = gMap[gKey])) {
2172
+ group = gMap[gKey] = [];
2173
+ groups.push(group);
2174
+ group.values = gVals;
2175
+ }
2176
+ group[j - 1] = t;
2177
+ }
2178
+ groups.domain = domain;
2179
+ return groups;
2180
+ }
2181
+
2182
+ /**
2183
+ * Extend input tuples with aggregate values.
2184
+ * Calcuates aggregate values and joins them with the input stream.
2185
+ * @constructor
2186
+ */
2187
+ function JoinAggregate(params) {
2188
+ Aggregate.call(this, params);
2189
+ }
2190
+ JoinAggregate.Definition = {
2191
+ 'type': 'JoinAggregate',
2192
+ 'metadata': {
2193
+ 'modifies': true
2194
+ },
2195
+ 'params': [{
2196
+ 'name': 'groupby',
2197
+ 'type': 'field',
2198
+ 'array': true
2199
+ }, {
2200
+ 'name': 'fields',
2201
+ 'type': 'field',
2202
+ 'null': true,
2203
+ 'array': true
2204
+ }, {
2205
+ 'name': 'ops',
2206
+ 'type': 'enum',
2207
+ 'array': true,
2208
+ 'values': ValidAggregateOps
2209
+ }, {
2210
+ 'name': 'as',
2211
+ 'type': 'string',
2212
+ 'null': true,
2213
+ 'array': true
2214
+ }, {
2215
+ 'name': 'key',
2216
+ 'type': 'field'
2217
+ }]
2218
+ };
2219
+ inherits(JoinAggregate, Aggregate, {
2220
+ transform(_, pulse) {
2221
+ const aggr = this,
2222
+ mod = _.modified();
2223
+ let cells;
2224
+
2225
+ // process all input tuples to calculate aggregates
2226
+ if (aggr.value && (mod || pulse.modified(aggr._inputs, true))) {
2227
+ cells = aggr.value = mod ? aggr.init(_) : {};
2228
+ pulse.visit(pulse.SOURCE, t => aggr.add(t));
2229
+ } else {
2230
+ cells = aggr.value = aggr.value || this.init(_);
2231
+ pulse.visit(pulse.REM, t => aggr.rem(t));
2232
+ pulse.visit(pulse.ADD, t => aggr.add(t));
2233
+ }
2234
+
2235
+ // update aggregation cells
2236
+ aggr.changes();
2237
+
2238
+ // write aggregate values to input tuples
2239
+ pulse.visit(pulse.SOURCE, t => {
2240
+ extend(t, cells[aggr.cellkey(t)].tuple);
2241
+ });
2242
+ return pulse.reflow(mod).modifies(this._outputs);
2243
+ },
2244
+ changes() {
2245
+ const adds = this._adds,
2246
+ mods = this._mods;
2247
+ let i, n;
2248
+ for (i = 0, n = this._alen; i < n; ++i) {
2249
+ this.celltuple(adds[i]);
2250
+ adds[i] = null; // for garbage collection
2251
+ }
2252
+ for (i = 0, n = this._mlen; i < n; ++i) {
2253
+ this.celltuple(mods[i]);
2254
+ mods[i] = null; // for garbage collection
2255
+ }
2256
+ this._alen = this._mlen = 0; // reset list of active cells
2257
+ }
2258
+ });
2259
+
2260
+ /**
2261
+ * Compute kernel density estimates (KDE) for one or more data groups.
2262
+ * @constructor
2263
+ * @param {object} params - The parameters for this operator.
2264
+ * @param {Array<function(object): *>} [params.groupby] - An array of accessors
2265
+ * to groupby.
2266
+ * @param {function(object): *} params.field - An accessor for the data field
2267
+ * to estimate.
2268
+ * @param {number} [params.bandwidth=0] - The KDE kernel bandwidth.
2269
+ * If zero or unspecified, the bandwidth is automatically determined.
2270
+ * @param {boolean} [params.counts=false] - A boolean flag indicating if the
2271
+ * output values should be probability estimates (false, default) or
2272
+ * smoothed counts (true).
2273
+ * @param {string} [params.cumulative=false] - A boolean flag indicating if a
2274
+ * density (false) or cumulative distribution (true) should be generated.
2275
+ * @param {Array<number>} [params.extent] - The domain extent over which to
2276
+ * plot the density. If unspecified, the [min, max] data extent is used.
2277
+ * @param {string} [params.resolve='independent'] - Indicates how parameters for
2278
+ * multiple densities should be resolved. If "independent" (the default), each
2279
+ * density may have its own domain extent and dynamic number of curve sample
2280
+ * steps. If "shared", the KDE transform will ensure that all densities are
2281
+ * defined over a shared domain and curve steps, enabling stacking.
2282
+ * @param {number} [params.minsteps=25] - The minimum number of curve samples
2283
+ * for plotting the density.
2284
+ * @param {number} [params.maxsteps=200] - The maximum number of curve samples
2285
+ * for plotting the density.
2286
+ * @param {number} [params.steps] - The exact number of curve samples for
2287
+ * plotting the density. If specified, overrides both minsteps and maxsteps
2288
+ * to set an exact number of uniform samples. Useful in conjunction with
2289
+ * a fixed extent to ensure consistent sample points for stacked densities.
2290
+ */
2291
+ function KDE(params) {
2292
+ Transform.call(this, null, params);
2293
+ }
2294
+ KDE.Definition = {
2295
+ 'type': 'KDE',
2296
+ 'metadata': {
2297
+ 'generates': true
2298
+ },
2299
+ 'params': [{
2300
+ 'name': 'groupby',
2301
+ 'type': 'field',
2302
+ 'array': true
2303
+ }, {
2304
+ 'name': 'field',
2305
+ 'type': 'field',
2306
+ 'required': true
2307
+ }, {
2308
+ 'name': 'cumulative',
2309
+ 'type': 'boolean',
2310
+ 'default': false
2311
+ }, {
2312
+ 'name': 'counts',
2313
+ 'type': 'boolean',
2314
+ 'default': false
2315
+ }, {
2316
+ 'name': 'bandwidth',
2317
+ 'type': 'number',
2318
+ 'default': 0
2319
+ }, {
2320
+ 'name': 'extent',
2321
+ 'type': 'number',
2322
+ 'array': true,
2323
+ 'length': 2
2324
+ }, {
2325
+ 'name': 'resolve',
2326
+ 'type': 'enum',
2327
+ 'values': ['shared', 'independent'],
2328
+ 'default': 'independent'
2329
+ }, {
2330
+ 'name': 'steps',
2331
+ 'type': 'number'
2332
+ }, {
2333
+ 'name': 'minsteps',
2334
+ 'type': 'number',
2335
+ 'default': 25
2336
+ }, {
2337
+ 'name': 'maxsteps',
2338
+ 'type': 'number',
2339
+ 'default': 200
2340
+ }, {
2341
+ 'name': 'as',
2342
+ 'type': 'string',
2343
+ 'array': true,
2344
+ 'default': ['value', 'density']
2345
+ }]
2346
+ };
2347
+ inherits(KDE, Transform, {
2348
+ transform(_, pulse) {
2349
+ const out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS);
2350
+ if (!this.value || pulse.changed() || _.modified()) {
2351
+ const source = pulse.materialize(pulse.SOURCE).source,
2352
+ groups = partition$1(source, _.groupby, _.field),
2353
+ names = (_.groupby || []).map(accessorName),
2354
+ bandwidth = _.bandwidth,
2355
+ method = _.cumulative ? 'cdf' : 'pdf',
2356
+ as = _.as || ['value', 'density'],
2357
+ values = [];
2358
+ let domain = _.extent,
2359
+ minsteps = _.steps || _.minsteps || 25,
2360
+ maxsteps = _.steps || _.maxsteps || 200;
2361
+ if (method !== 'pdf' && method !== 'cdf') {
2362
+ error('Invalid density method: ' + method);
2363
+ }
2364
+ if (_.resolve === 'shared') {
2365
+ if (!domain) domain = extent(source, _.field);
2366
+ minsteps = maxsteps = _.steps || maxsteps;
2367
+ }
2368
+ groups.forEach(g => {
2369
+ const density = kde(g, bandwidth)[method],
2370
+ scale = _.counts ? g.length : 1,
2371
+ local = domain || extent(g);
2372
+ sampleCurve(density, local, minsteps, maxsteps).forEach(v => {
2373
+ const t = {};
2374
+ for (let i = 0; i < names.length; ++i) {
2375
+ t[names[i]] = g.dims[i];
2376
+ }
2377
+ t[as[0]] = v[0];
2378
+ t[as[1]] = v[1] * scale;
2379
+ values.push(ingest$1(t));
2380
+ });
2381
+ });
2382
+ if (this.value) out.rem = this.value;
2383
+ this.value = out.add = out.source = values;
2384
+ }
2385
+ return out;
2386
+ }
2387
+ });
2388
+
2389
+ /**
2390
+ * Generates a key function.
2391
+ * @constructor
2392
+ * @param {object} params - The parameters for this operator.
2393
+ * @param {Array<string>} params.fields - The field name(s) for the key function.
2394
+ * @param {boolean} params.flat - A boolean flag indicating if the field names
2395
+ * should be treated as flat property names, side-stepping nested field
2396
+ * lookups normally indicated by dot or bracket notation.
2397
+ */
2398
+ function Key(params) {
2399
+ Operator.call(this, null, update$2, params);
2400
+ }
2401
+ inherits(Key, Operator);
2402
+ function update$2(_) {
2403
+ return this.value && !_.modified() ? this.value : key(_.fields, _.flat);
2404
+ }
2405
+
2406
+ /**
2407
+ * Load and parse data from an external source. Marshalls parameter
2408
+ * values and then invokes the Dataflow request method.
2409
+ * @constructor
2410
+ * @param {object} params - The parameters for this operator.
2411
+ * @param {string} params.url - The URL to load from.
2412
+ * @param {object} params.format - The data format options.
2413
+ */
2414
+ function Load(params) {
2415
+ Transform.call(this, [], params);
2416
+ this._pending = null;
2417
+ }
2418
+ inherits(Load, Transform, {
2419
+ transform(_, pulse) {
2420
+ const df = pulse.dataflow;
2421
+ if (this._pending) {
2422
+ // update state and return pulse
2423
+ return output(this, pulse, this._pending);
2424
+ }
2425
+ if (stop(_)) return pulse.StopPropagation;
2426
+ if (_.values) {
2427
+ // parse and ingest values, return output pulse
2428
+ return output(this, pulse, df.parse(_.values, _.format));
2429
+ } else if (_.async) {
2430
+ // return promise for non-blocking async loading
2431
+ const p = df.request(_.url, _.format).then(res => {
2432
+ this._pending = array(res.data);
2433
+ return df => df.touch(this);
2434
+ });
2435
+ return {
2436
+ async: p
2437
+ };
2438
+ } else {
2439
+ // return promise for synchronous loading
2440
+ return df.request(_.url, _.format).then(res => output(this, pulse, array(res.data)));
2441
+ }
2442
+ }
2443
+ });
2444
+ function stop(_) {
2445
+ return _.modified('async') && !(_.modified('values') || _.modified('url') || _.modified('format'));
2446
+ }
2447
+ function output(op, pulse, data) {
2448
+ data.forEach(ingest$1);
2449
+ const out = pulse.fork(pulse.NO_FIELDS & pulse.NO_SOURCE);
2450
+ out.rem = op.value;
2451
+ op.value = out.source = out.add = data;
2452
+ op._pending = null;
2453
+ if (out.rem.length) out.clean(true);
2454
+ return out;
2455
+ }
2456
+
2457
+ /**
2458
+ * Extend tuples by joining them with values from a lookup table.
2459
+ * @constructor
2460
+ * @param {object} params - The parameters for this operator.
2461
+ * @param {Map} params.index - The lookup table map.
2462
+ * @param {Array<function(object): *} params.fields - The fields to lookup.
2463
+ * @param {Array<string>} params.as - Output field names for each lookup value.
2464
+ * @param {*} [params.default] - A default value to use if lookup fails.
2465
+ */
2466
+ function Lookup(params) {
2467
+ Transform.call(this, {}, params);
2468
+ }
2469
+ Lookup.Definition = {
2470
+ 'type': 'Lookup',
2471
+ 'metadata': {
2472
+ 'modifies': true
2473
+ },
2474
+ 'params': [{
2475
+ 'name': 'index',
2476
+ 'type': 'index',
2477
+ 'params': [{
2478
+ 'name': 'from',
2479
+ 'type': 'data',
2480
+ 'required': true
2481
+ }, {
2482
+ 'name': 'key',
2483
+ 'type': 'field',
2484
+ 'required': true
2485
+ }]
2486
+ }, {
2487
+ 'name': 'values',
2488
+ 'type': 'field',
2489
+ 'array': true
2490
+ }, {
2491
+ 'name': 'fields',
2492
+ 'type': 'field',
2493
+ 'array': true,
2494
+ 'required': true
2495
+ }, {
2496
+ 'name': 'as',
2497
+ 'type': 'string',
2498
+ 'array': true
2499
+ }, {
2500
+ 'name': 'default',
2501
+ 'default': null
2502
+ }]
2503
+ };
2504
+ inherits(Lookup, Transform, {
2505
+ transform(_, pulse) {
2506
+ const keys = _.fields,
2507
+ index = _.index,
2508
+ values = _.values,
2509
+ defaultValue = _.default == null ? null : _.default,
2510
+ reset = _.modified(),
2511
+ n = keys.length;
2512
+ let flag = reset ? pulse.SOURCE : pulse.ADD,
2513
+ out = pulse,
2514
+ as = _.as,
2515
+ set,
2516
+ m,
2517
+ mods;
2518
+ if (values) {
2519
+ m = values.length;
2520
+ if (n > 1 && !as) {
2521
+ error('Multi-field lookup requires explicit "as" parameter.');
2522
+ }
2523
+ if (as && as.length !== n * m) {
2524
+ error('The "as" parameter has too few output field names.');
2525
+ }
2526
+ as = as || values.map(accessorName);
2527
+ set = function (t) {
2528
+ for (var i = 0, k = 0, j, v; i < n; ++i) {
2529
+ v = index.get(keys[i](t));
2530
+ if (v == null) for (j = 0; j < m; ++j, ++k) t[as[k]] = defaultValue;else for (j = 0; j < m; ++j, ++k) t[as[k]] = values[j](v);
2531
+ }
2532
+ };
2533
+ } else {
2534
+ if (!as) {
2535
+ error('Missing output field names.');
2536
+ }
2537
+ set = function (t) {
2538
+ for (var i = 0, v; i < n; ++i) {
2539
+ v = index.get(keys[i](t));
2540
+ t[as[i]] = v == null ? defaultValue : v;
2541
+ }
2542
+ };
2543
+ }
2544
+ if (reset) {
2545
+ out = pulse.reflow(true);
2546
+ } else {
2547
+ mods = keys.some(k => pulse.modified(k.fields));
2548
+ flag |= mods ? pulse.MOD : 0;
2549
+ }
2550
+ pulse.visit(flag, set);
2551
+ return out.modifies(as);
2552
+ }
2553
+ });
2554
+
2555
+ /**
2556
+ * Computes global min/max extents over a collection of extents.
2557
+ * @constructor
2558
+ * @param {object} params - The parameters for this operator.
2559
+ * @param {Array<Array<number>>} params.extents - The input extents.
2560
+ */
2561
+ function MultiExtent(params) {
2562
+ Operator.call(this, null, update$1, params);
2563
+ }
2564
+ inherits(MultiExtent, Operator);
2565
+ function update$1(_) {
2566
+ if (this.value && !_.modified()) {
2567
+ return this.value;
2568
+ }
2569
+ const ext = _.extents,
2570
+ n = ext.length;
2571
+ let min = +Infinity,
2572
+ max = -Infinity,
2573
+ i,
2574
+ e;
2575
+ for (i = 0; i < n; ++i) {
2576
+ e = ext[i];
2577
+ if (e[0] < min) min = e[0];
2578
+ if (e[1] > max) max = e[1];
2579
+ }
2580
+ return [min, max];
2581
+ }
2582
+
2583
+ /**
2584
+ * Merge a collection of value arrays.
2585
+ * @constructor
2586
+ * @param {object} params - The parameters for this operator.
2587
+ * @param {Array<Array<*>>} params.values - The input value arrrays.
2588
+ */
2589
+ function MultiValues(params) {
2590
+ Operator.call(this, null, update, params);
2591
+ }
2592
+ inherits(MultiValues, Operator);
2593
+ function update(_) {
2594
+ return this.value && !_.modified() ? this.value : _.values.reduce((data, _) => data.concat(_), []);
2595
+ }
2596
+
2597
+ /**
2598
+ * Operator whose value is simply its parameter hash. This operator is
2599
+ * useful for enabling reactive updates to values of nested objects.
2600
+ * @constructor
2601
+ * @param {object} params - The parameters for this operator.
2602
+ */
2603
+ function Params(params) {
2604
+ Transform.call(this, null, params);
2605
+ }
2606
+ inherits(Params, Transform, {
2607
+ transform(_, pulse) {
2608
+ this.modified(_.modified());
2609
+ this.value = _;
2610
+ return pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS); // do not pass tuples
2611
+ }
2612
+ });
2613
+
2614
+ /**
2615
+ * Aggregate and pivot selected field values to become new fields.
2616
+ * This operator is useful to construction cross-tabulations.
2617
+ * @constructor
2618
+ * @param {Array<function(object): *>} [params.groupby] - An array of accessors
2619
+ * to groupby. These fields act just like groupby fields of an Aggregate transform.
2620
+ * @param {function(object): *} params.field - The field to pivot on. The unique
2621
+ * values of this field become new field names in the output stream.
2622
+ * @param {function(object): *} params.value - The field to populate pivoted fields.
2623
+ * The aggregate values of this field become the values of the new pivoted fields.
2624
+ * @param {string} [params.op] - The aggregation operation for the value field,
2625
+ * applied per cell in the output stream. The default is "sum".
2626
+ * @param {number} [params.limit] - An optional parameter indicating the maximum
2627
+ * number of pivoted fields to generate. The pivoted field names are sorted in
2628
+ * ascending order prior to enforcing the limit.
2629
+ */
2630
+ function Pivot(params) {
2631
+ Aggregate.call(this, params);
2632
+ }
2633
+ Pivot.Definition = {
2634
+ 'type': 'Pivot',
2635
+ 'metadata': {
2636
+ 'generates': true,
2637
+ 'changes': true
2638
+ },
2639
+ 'params': [{
2640
+ 'name': 'groupby',
2641
+ 'type': 'field',
2642
+ 'array': true
2643
+ }, {
2644
+ 'name': 'field',
2645
+ 'type': 'field',
2646
+ 'required': true
2647
+ }, {
2648
+ 'name': 'value',
2649
+ 'type': 'field',
2650
+ 'required': true
2651
+ }, {
2652
+ 'name': 'op',
2653
+ 'type': 'enum',
2654
+ 'values': ValidAggregateOps,
2655
+ 'default': 'sum'
2656
+ }, {
2657
+ 'name': 'limit',
2658
+ 'type': 'number',
2659
+ 'default': 0
2660
+ }, {
2661
+ 'name': 'key',
2662
+ 'type': 'field'
2663
+ }]
2664
+ };
2665
+ inherits(Pivot, Aggregate, {
2666
+ _transform: Aggregate.prototype.transform,
2667
+ transform(_, pulse) {
2668
+ return this._transform(aggregateParams(_, pulse), pulse);
2669
+ }
2670
+ });
2671
+
2672
+ // Shoehorn a pivot transform into an aggregate transform!
2673
+ // First collect all unique pivot field values.
2674
+ // Then generate aggregate fields for each output pivot field.
2675
+ function aggregateParams(_, pulse) {
2676
+ const key = _.field,
2677
+ value = _.value,
2678
+ op = (_.op === 'count' ? '__count__' : _.op) || 'sum',
2679
+ fields = accessorFields(key).concat(accessorFields(value)),
2680
+ keys = pivotKeys(key, _.limit || 0, pulse);
2681
+
2682
+ // if data stream content changes, pivot fields may change
2683
+ // flag parameter modification to ensure re-initialization
2684
+ if (pulse.changed()) _.set('__pivot__', null, null, true);
2685
+ return {
2686
+ key: _.key,
2687
+ groupby: _.groupby,
2688
+ ops: keys.map(() => op),
2689
+ fields: keys.map(k => get(k, key, value, fields)),
2690
+ as: keys.map(k => k + ''),
2691
+ modified: _.modified.bind(_)
2692
+ };
2693
+ }
2694
+
2695
+ // Generate aggregate field accessor.
2696
+ // Output NaN for non-existent values; aggregator will ignore!
2697
+ function get(k, key, value, fields) {
2698
+ return accessor(d => key(d) === k ? value(d) : NaN, fields, k + '');
2699
+ }
2700
+
2701
+ // Collect (and optionally limit) all unique pivot values.
2702
+ function pivotKeys(key, limit, pulse) {
2703
+ const map = {},
2704
+ list = [];
2705
+ pulse.visit(pulse.SOURCE, t => {
2706
+ const k = key(t);
2707
+ if (!map[k]) {
2708
+ map[k] = 1;
2709
+ list.push(k);
2710
+ }
2711
+ });
2712
+ list.sort(ascending);
2713
+ return limit ? list.slice(0, limit) : list;
2714
+ }
2715
+
2716
+ /**
2717
+ * Partitions pre-faceted data into tuple subflows.
2718
+ * @constructor
2719
+ * @param {object} params - The parameters for this operator.
2720
+ * @param {function(Dataflow, string): Operator} params.subflow - A function
2721
+ * that generates a subflow of operators and returns its root operator.
2722
+ * @param {function(object): Array<object>} params.field - The field
2723
+ * accessor for an array of subflow tuple objects.
2724
+ */
2725
+ function PreFacet(params) {
2726
+ Facet.call(this, params);
2727
+ }
2728
+ inherits(PreFacet, Facet, {
2729
+ transform(_, pulse) {
2730
+ const flow = _.subflow,
2731
+ field = _.field,
2732
+ subflow = t => this.subflow(tupleid(t), flow, pulse, t);
2733
+ if (_.modified('field') || field && pulse.modified(accessorFields(field))) {
2734
+ error('PreFacet does not support field modification.');
2735
+ }
2736
+ this.initTargets(); // reset list of active subflows
2737
+
2738
+ if (field) {
2739
+ pulse.visit(pulse.MOD, t => {
2740
+ const sf = subflow(t);
2741
+ field(t).forEach(_ => sf.mod(_));
2742
+ });
2743
+ pulse.visit(pulse.ADD, t => {
2744
+ const sf = subflow(t);
2745
+ field(t).forEach(_ => sf.add(ingest$1(_)));
2746
+ });
2747
+ pulse.visit(pulse.REM, t => {
2748
+ const sf = subflow(t);
2749
+ field(t).forEach(_ => sf.rem(_));
2750
+ });
2751
+ } else {
2752
+ pulse.visit(pulse.MOD, t => subflow(t).mod(t));
2753
+ pulse.visit(pulse.ADD, t => subflow(t).add(t));
2754
+ pulse.visit(pulse.REM, t => subflow(t).rem(t));
2755
+ }
2756
+ if (pulse.clean()) {
2757
+ pulse.runAfter(() => this.clean());
2758
+ }
2759
+ return pulse;
2760
+ }
2761
+ });
2762
+
2763
+ /**
2764
+ * Performs a relational projection, copying selected fields from source
2765
+ * tuples to a new set of derived tuples.
2766
+ * @constructor
2767
+ * @param {object} params - The parameters for this operator.
2768
+ * @param {Array<function(object): *} params.fields - The fields to project,
2769
+ * as an array of field accessors. If unspecified, all fields will be
2770
+ * copied with names unchanged.
2771
+ * @param {Array<string>} [params.as] - Output field names for each projected
2772
+ * field. Any unspecified fields will use the field name provided by
2773
+ * the field accessor.
2774
+ */
2775
+ function Project(params) {
2776
+ Transform.call(this, null, params);
2777
+ }
2778
+ Project.Definition = {
2779
+ 'type': 'Project',
2780
+ 'metadata': {
2781
+ 'generates': true,
2782
+ 'changes': true
2783
+ },
2784
+ 'params': [{
2785
+ 'name': 'fields',
2786
+ 'type': 'field',
2787
+ 'array': true
2788
+ }, {
2789
+ 'name': 'as',
2790
+ 'type': 'string',
2791
+ 'null': true,
2792
+ 'array': true
2793
+ }]
2794
+ };
2795
+ inherits(Project, Transform, {
2796
+ transform(_, pulse) {
2797
+ const out = pulse.fork(pulse.NO_SOURCE),
2798
+ fields = _.fields,
2799
+ as = fieldNames(_.fields, _.as || []),
2800
+ derive = fields ? (s, t) => project(s, t, fields, as) : rederive;
2801
+ let lut;
2802
+ if (this.value) {
2803
+ lut = this.value;
2804
+ } else {
2805
+ pulse = pulse.addAll();
2806
+ lut = this.value = {};
2807
+ }
2808
+ pulse.visit(pulse.REM, t => {
2809
+ const id = tupleid(t);
2810
+ out.rem.push(lut[id]);
2811
+ lut[id] = null;
2812
+ });
2813
+ pulse.visit(pulse.ADD, t => {
2814
+ const dt = derive(t, ingest$1({}));
2815
+ lut[tupleid(t)] = dt;
2816
+ out.add.push(dt);
2817
+ });
2818
+ pulse.visit(pulse.MOD, t => {
2819
+ out.mod.push(derive(t, lut[tupleid(t)]));
2820
+ });
2821
+ return out;
2822
+ }
2823
+ });
2824
+ function project(s, t, fields, as) {
2825
+ for (let i = 0, n = fields.length; i < n; ++i) {
2826
+ t[as[i]] = fields[i](s);
2827
+ }
2828
+ return t;
2829
+ }
2830
+
2831
+ /**
2832
+ * Proxy the value of another operator as a pure signal value.
2833
+ * Ensures no tuples are propagated.
2834
+ * @constructor
2835
+ * @param {object} params - The parameters for this operator.
2836
+ * @param {*} params.value - The value to proxy, becomes the value of this operator.
2837
+ */
2838
+ function Proxy(params) {
2839
+ Transform.call(this, null, params);
2840
+ }
2841
+ inherits(Proxy, Transform, {
2842
+ transform(_, pulse) {
2843
+ this.value = _.value;
2844
+ return _.modified('value') ? pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS) : pulse.StopPropagation;
2845
+ }
2846
+ });
2847
+
2848
+ /**
2849
+ * Generates sample quantile values from an input data stream.
2850
+ * @constructor
2851
+ * @param {object} params - The parameters for this operator.
2852
+ * @param {function(object): *} params.field - An accessor for the data field
2853
+ * over which to calculate quantile values.
2854
+ * @param {Array<function(object): *>} [params.groupby] - An array of accessors
2855
+ * to groupby.
2856
+ * @param {Array<number>} [params.probs] - An array of probabilities in
2857
+ * the range (0, 1) for which to compute quantile values. If not specified,
2858
+ * the *step* parameter will be used.
2859
+ * @param {Array<number>} [params.step=0.01] - A probability step size for
2860
+ * sampling quantile values. All values from one-half the step size up to
2861
+ * 1 (exclusive) will be sampled. This parameter is only used if the
2862
+ * *quantiles* parameter is not provided.
2863
+ */
2864
+ function Quantile(params) {
2865
+ Transform.call(this, null, params);
2866
+ }
2867
+ Quantile.Definition = {
2868
+ 'type': 'Quantile',
2869
+ 'metadata': {
2870
+ 'generates': true,
2871
+ 'changes': true
2872
+ },
2873
+ 'params': [{
2874
+ 'name': 'groupby',
2875
+ 'type': 'field',
2876
+ 'array': true
2877
+ }, {
2878
+ 'name': 'field',
2879
+ 'type': 'field',
2880
+ 'required': true
2881
+ }, {
2882
+ 'name': 'probs',
2883
+ 'type': 'number',
2884
+ 'array': true
2885
+ }, {
2886
+ 'name': 'step',
2887
+ 'type': 'number',
2888
+ 'default': 0.01
2889
+ }, {
2890
+ 'name': 'as',
2891
+ 'type': 'string',
2892
+ 'array': true,
2893
+ 'default': ['prob', 'value']
2894
+ }]
2895
+ };
2896
+ const EPSILON = 1e-14;
2897
+ inherits(Quantile, Transform, {
2898
+ transform(_, pulse) {
2899
+ const out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS),
2900
+ as = _.as || ['prob', 'value'];
2901
+ if (this.value && !_.modified() && !pulse.changed()) {
2902
+ out.source = this.value;
2903
+ return out;
2904
+ }
2905
+ const source = pulse.materialize(pulse.SOURCE).source,
2906
+ groups = partition$1(source, _.groupby, _.field),
2907
+ names = (_.groupby || []).map(accessorName),
2908
+ values = [],
2909
+ step = _.step || 0.01,
2910
+ p = _.probs || range(step / 2, 1 - EPSILON, step),
2911
+ n = p.length;
2912
+ groups.forEach(g => {
2913
+ const q = quantiles(g, p);
2914
+ for (let i = 0; i < n; ++i) {
2915
+ const t = {};
2916
+ for (let i = 0; i < names.length; ++i) {
2917
+ t[names[i]] = g.dims[i];
2918
+ }
2919
+ t[as[0]] = p[i];
2920
+ t[as[1]] = q[i];
2921
+ values.push(ingest$1(t));
2922
+ }
2923
+ });
2924
+ if (this.value) out.rem = this.value;
2925
+ this.value = out.add = out.source = values;
2926
+ return out;
2927
+ }
2928
+ });
2929
+
2930
+ /**
2931
+ * Relays a data stream between data processing pipelines.
2932
+ * If the derive parameter is set, this transform will create derived
2933
+ * copies of observed tuples. This provides derived data streams in which
2934
+ * modifications to the tuples do not pollute an upstream data source.
2935
+ * @param {object} params - The parameters for this operator.
2936
+ * @param {number} [params.derive=false] - Boolean flag indicating if
2937
+ * the transform should make derived copies of incoming tuples.
2938
+ * @constructor
2939
+ */
2940
+ function Relay(params) {
2941
+ Transform.call(this, null, params);
2942
+ }
2943
+ inherits(Relay, Transform, {
2944
+ transform(_, pulse) {
2945
+ let out, lut;
2946
+ if (this.value) {
2947
+ lut = this.value;
2948
+ } else {
2949
+ out = pulse = pulse.addAll();
2950
+ lut = this.value = {};
2951
+ }
2952
+ if (_.derive) {
2953
+ out = pulse.fork(pulse.NO_SOURCE);
2954
+ pulse.visit(pulse.REM, t => {
2955
+ const id = tupleid(t);
2956
+ out.rem.push(lut[id]);
2957
+ lut[id] = null;
2958
+ });
2959
+ pulse.visit(pulse.ADD, t => {
2960
+ const dt = derive(t);
2961
+ lut[tupleid(t)] = dt;
2962
+ out.add.push(dt);
2963
+ });
2964
+ pulse.visit(pulse.MOD, t => {
2965
+ const dt = lut[tupleid(t)];
2966
+ for (const k in t) {
2967
+ dt[k] = t[k];
2968
+ // down stream writes may overwrite re-derived tuples
2969
+ // conservatively mark all source fields as modified
2970
+ out.modifies(k);
2971
+ }
2972
+ out.mod.push(dt);
2973
+ });
2974
+ }
2975
+ return out;
2976
+ }
2977
+ });
2978
+
2979
+ /**
2980
+ * Samples tuples passing through this operator.
2981
+ * Uses reservoir sampling to maintain a representative sample.
2982
+ * @constructor
2983
+ * @param {object} params - The parameters for this operator.
2984
+ * @param {number} [params.size=1000] - The maximum number of samples.
2985
+ */
2986
+ function Sample(params) {
2987
+ Transform.call(this, [], params);
2988
+ this.count = 0;
2989
+ }
2990
+ Sample.Definition = {
2991
+ 'type': 'Sample',
2992
+ 'metadata': {},
2993
+ 'params': [{
2994
+ 'name': 'size',
2995
+ 'type': 'number',
2996
+ 'default': 1000
2997
+ }]
2998
+ };
2999
+ inherits(Sample, Transform, {
3000
+ transform(_, pulse) {
3001
+ const out = pulse.fork(pulse.NO_SOURCE),
3002
+ mod = _.modified('size'),
3003
+ num = _.size,
3004
+ map = this.value.reduce((m, t) => (m[tupleid(t)] = 1, m), {});
3005
+ let res = this.value,
3006
+ cnt = this.count,
3007
+ cap = 0;
3008
+
3009
+ // sample reservoir update function
3010
+ function update(t) {
3011
+ let p, idx;
3012
+ if (res.length < num) {
3013
+ res.push(t);
3014
+ } else {
3015
+ idx = ~~((cnt + 1) * random());
3016
+ if (idx < res.length && idx >= cap) {
3017
+ p = res[idx];
3018
+ if (map[tupleid(p)]) out.rem.push(p); // eviction
3019
+ res[idx] = t;
3020
+ }
3021
+ }
3022
+ ++cnt;
3023
+ }
3024
+ if (pulse.rem.length) {
3025
+ // find all tuples that should be removed, add to output
3026
+ pulse.visit(pulse.REM, t => {
3027
+ const id = tupleid(t);
3028
+ if (map[id]) {
3029
+ map[id] = -1;
3030
+ out.rem.push(t);
3031
+ }
3032
+ --cnt;
3033
+ });
3034
+
3035
+ // filter removed tuples out of the sample reservoir
3036
+ res = res.filter(t => map[tupleid(t)] !== -1);
3037
+ }
3038
+ if ((pulse.rem.length || mod) && res.length < num && pulse.source) {
3039
+ // replenish sample if backing data source is available
3040
+ cap = cnt = res.length;
3041
+ pulse.visit(pulse.SOURCE, t => {
3042
+ // update, but skip previously sampled tuples
3043
+ if (!map[tupleid(t)]) update(t);
3044
+ });
3045
+ cap = -1;
3046
+ }
3047
+ if (mod && res.length > num) {
3048
+ const n = res.length - num;
3049
+ for (let i = 0; i < n; ++i) {
3050
+ map[tupleid(res[i])] = -1;
3051
+ out.rem.push(res[i]);
3052
+ }
3053
+ res = res.slice(n);
3054
+ }
3055
+ if (pulse.mod.length) {
3056
+ // propagate modified tuples in the sample reservoir
3057
+ pulse.visit(pulse.MOD, t => {
3058
+ if (map[tupleid(t)]) out.mod.push(t);
3059
+ });
3060
+ }
3061
+ if (pulse.add.length) {
3062
+ // update sample reservoir
3063
+ pulse.visit(pulse.ADD, update);
3064
+ }
3065
+ if (pulse.add.length || cap < 0) {
3066
+ // output newly added tuples
3067
+ out.add = res.filter(t => !map[tupleid(t)]);
3068
+ }
3069
+ this.count = cnt;
3070
+ this.value = out.source = res;
3071
+ return out;
3072
+ }
3073
+ });
3074
+
3075
+ /**
3076
+ * Generates data tuples for a specified sequence range of numbers.
3077
+ * @constructor
3078
+ * @param {object} params - The parameters for this operator.
3079
+ * @param {number} params.start - The first number in the sequence.
3080
+ * @param {number} params.stop - The last number (exclusive) in the sequence.
3081
+ * @param {number} [params.step=1] - The step size between numbers in the sequence.
3082
+ */
3083
+ function Sequence(params) {
3084
+ Transform.call(this, null, params);
3085
+ }
3086
+ Sequence.Definition = {
3087
+ 'type': 'Sequence',
3088
+ 'metadata': {
3089
+ 'generates': true,
3090
+ 'changes': true
3091
+ },
3092
+ 'params': [{
3093
+ 'name': 'start',
3094
+ 'type': 'number',
3095
+ 'required': true
3096
+ }, {
3097
+ 'name': 'stop',
3098
+ 'type': 'number',
3099
+ 'required': true
3100
+ }, {
3101
+ 'name': 'step',
3102
+ 'type': 'number',
3103
+ 'default': 1
3104
+ }, {
3105
+ 'name': 'as',
3106
+ 'type': 'string',
3107
+ 'default': 'data'
3108
+ }]
3109
+ };
3110
+ inherits(Sequence, Transform, {
3111
+ transform(_, pulse) {
3112
+ if (this.value && !_.modified()) return;
3113
+ const out = pulse.materialize().fork(pulse.MOD),
3114
+ as = _.as || 'data';
3115
+ out.rem = this.value ? pulse.rem.concat(this.value) : pulse.rem;
3116
+ this.value = range(_.start, _.stop, _.step || 1).map(v => {
3117
+ const t = {};
3118
+ t[as] = v;
3119
+ return ingest$1(t);
3120
+ });
3121
+ out.add = pulse.add.concat(this.value);
3122
+ return out;
3123
+ }
3124
+ });
3125
+
3126
+ /**
3127
+ * Propagates a new pulse without any tuples so long as the input
3128
+ * pulse contains some added, removed or modified tuples.
3129
+ * @param {object} params - The parameters for this operator.
3130
+ * @constructor
3131
+ */
3132
+ function Sieve(params) {
3133
+ Transform.call(this, null, params);
3134
+ this.modified(true); // always treat as modified
3135
+ }
3136
+ inherits(Sieve, Transform, {
3137
+ transform(_, pulse) {
3138
+ this.value = pulse.source;
3139
+ return pulse.changed() ? pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS) : pulse.StopPropagation;
3140
+ }
3141
+ });
3142
+
3143
+ /**
3144
+ * Discretize dates to specific time units.
3145
+ * @constructor
3146
+ * @param {object} params - The parameters for this operator.
3147
+ * @param {function(object): *} params.field - The data field containing date/time values.
3148
+ */
3149
+ function TimeUnit(params) {
3150
+ Transform.call(this, null, params);
3151
+ }
3152
+ const OUTPUT = ['unit0', 'unit1'];
3153
+ TimeUnit.Definition = {
3154
+ 'type': 'TimeUnit',
3155
+ 'metadata': {
3156
+ 'modifies': true
3157
+ },
3158
+ 'params': [{
3159
+ 'name': 'field',
3160
+ 'type': 'field',
3161
+ 'required': true
3162
+ }, {
3163
+ 'name': 'interval',
3164
+ 'type': 'boolean',
3165
+ 'default': true
3166
+ }, {
3167
+ 'name': 'units',
3168
+ 'type': 'enum',
3169
+ 'values': TIME_UNITS,
3170
+ 'array': true
3171
+ }, {
3172
+ 'name': 'step',
3173
+ 'type': 'number',
3174
+ 'default': 1
3175
+ }, {
3176
+ 'name': 'maxbins',
3177
+ 'type': 'number',
3178
+ 'default': 40
3179
+ }, {
3180
+ 'name': 'extent',
3181
+ 'type': 'date',
3182
+ 'array': true
3183
+ }, {
3184
+ 'name': 'timezone',
3185
+ 'type': 'enum',
3186
+ 'default': 'local',
3187
+ 'values': ['local', 'utc']
3188
+ }, {
3189
+ 'name': 'as',
3190
+ 'type': 'string',
3191
+ 'array': true,
3192
+ 'length': 2,
3193
+ 'default': OUTPUT
3194
+ }]
3195
+ };
3196
+ inherits(TimeUnit, Transform, {
3197
+ transform(_, pulse) {
3198
+ const field = _.field,
3199
+ band = _.interval !== false,
3200
+ utc = _.timezone === 'utc',
3201
+ floor = this._floor(_, pulse),
3202
+ offset = (utc ? utcInterval : timeInterval)(floor.unit).offset,
3203
+ as = _.as || OUTPUT,
3204
+ u0 = as[0],
3205
+ u1 = as[1],
3206
+ step = floor.step;
3207
+ let min = floor.start || Infinity,
3208
+ max = floor.stop || -Infinity,
3209
+ flag = pulse.ADD;
3210
+ if (_.modified() || pulse.changed(pulse.REM) || pulse.modified(accessorFields(field))) {
3211
+ pulse = pulse.reflow(true);
3212
+ flag = pulse.SOURCE;
3213
+ min = Infinity;
3214
+ max = -Infinity;
3215
+ }
3216
+ pulse.visit(flag, t => {
3217
+ const v = field(t);
3218
+ let a, b;
3219
+ if (v == null) {
3220
+ t[u0] = null;
3221
+ if (band) t[u1] = null;
3222
+ } else {
3223
+ t[u0] = a = b = floor(v);
3224
+ if (band) t[u1] = b = offset(a, step);
3225
+ if (a < min) min = a;
3226
+ if (b > max) max = b;
3227
+ }
3228
+ });
3229
+ floor.start = min;
3230
+ floor.stop = max;
3231
+ return pulse.modifies(band ? as : u0);
3232
+ },
3233
+ _floor(_, pulse) {
3234
+ const utc = _.timezone === 'utc';
3235
+
3236
+ // get parameters
3237
+ const {
3238
+ units,
3239
+ step
3240
+ } = _.units ? {
3241
+ units: _.units,
3242
+ step: _.step || 1
3243
+ } : bin$1({
3244
+ extent: _.extent || extent(pulse.materialize(pulse.SOURCE).source, _.field),
3245
+ maxbins: _.maxbins
3246
+ });
3247
+
3248
+ // check / standardize time units
3249
+ const tunits = timeUnits(units),
3250
+ prev = this.value || {},
3251
+ floor = (utc ? utcFloor : timeFloor)(tunits, step);
3252
+ floor.unit = peek(tunits);
3253
+ floor.units = tunits;
3254
+ floor.step = step;
3255
+ floor.start = prev.start;
3256
+ floor.stop = prev.stop;
3257
+ return this.value = floor;
3258
+ }
3259
+ });
3260
+
3261
+ /**
3262
+ * An index that maps from unique, string-coerced, field values to tuples.
3263
+ * Assumes that the field serves as a unique key with no duplicate values.
3264
+ * @constructor
3265
+ * @param {object} params - The parameters for this operator.
3266
+ * @param {function(object): *} params.field - The field accessor to index.
3267
+ */
3268
+ function TupleIndex(params) {
3269
+ Transform.call(this, fastmap(), params);
3270
+ }
3271
+ inherits(TupleIndex, Transform, {
3272
+ transform(_, pulse) {
3273
+ const df = pulse.dataflow,
3274
+ field = _.field,
3275
+ index = this.value,
3276
+ set = t => index.set(field(t), t);
3277
+ let mod = true;
3278
+ if (_.modified('field') || pulse.modified(field.fields)) {
3279
+ index.clear();
3280
+ pulse.visit(pulse.SOURCE, set);
3281
+ } else if (pulse.changed()) {
3282
+ pulse.visit(pulse.REM, t => index.delete(field(t)));
3283
+ pulse.visit(pulse.ADD, set);
3284
+ } else {
3285
+ mod = false;
3286
+ }
3287
+ this.modified(mod);
3288
+ if (index.empty > df.cleanThreshold) df.runAfter(index.clean);
3289
+ return pulse.fork();
3290
+ }
3291
+ });
3292
+
3293
+ /**
3294
+ * Extracts an array of values. Assumes the source data has already been
3295
+ * reduced as needed (e.g., by an upstream Aggregate transform).
3296
+ * @constructor
3297
+ * @param {object} params - The parameters for this operator.
3298
+ * @param {function(object): *} params.field - The domain field to extract.
3299
+ * @param {function(*,*): number} [params.sort] - An optional
3300
+ * comparator function for sorting the values. The comparator will be
3301
+ * applied to backing tuples prior to value extraction.
3302
+ */
3303
+ function Values(params) {
3304
+ Transform.call(this, null, params);
3305
+ }
3306
+ inherits(Values, Transform, {
3307
+ transform(_, pulse) {
3308
+ const run = !this.value || _.modified('field') || _.modified('sort') || pulse.changed() || _.sort && pulse.modified(_.sort.fields);
3309
+ if (run) {
3310
+ this.value = (_.sort ? pulse.source.slice().sort(stableCompare(_.sort)) : pulse.source).map(_.field);
3311
+ }
3312
+ }
3313
+ });
3314
+
3315
+ function WindowOp(op, field, param, as) {
3316
+ const fn = WindowOps[op](field, param);
3317
+ return {
3318
+ init: fn.init || zero,
3319
+ update: function (w, t) {
3320
+ t[as] = fn.next(w);
3321
+ }
3322
+ };
3323
+ }
3324
+ const WindowOps = {
3325
+ row_number: function () {
3326
+ return {
3327
+ next: w => w.index + 1
3328
+ };
3329
+ },
3330
+ rank: function () {
3331
+ let rank;
3332
+ return {
3333
+ init: () => rank = 1,
3334
+ next: w => {
3335
+ const i = w.index,
3336
+ data = w.data;
3337
+ return i && w.compare(data[i - 1], data[i]) ? rank = i + 1 : rank;
3338
+ }
3339
+ };
3340
+ },
3341
+ dense_rank: function () {
3342
+ let drank;
3343
+ return {
3344
+ init: () => drank = 1,
3345
+ next: w => {
3346
+ const i = w.index,
3347
+ d = w.data;
3348
+ return i && w.compare(d[i - 1], d[i]) ? ++drank : drank;
3349
+ }
3350
+ };
3351
+ },
3352
+ percent_rank: function () {
3353
+ const rank = WindowOps.rank(),
3354
+ next = rank.next;
3355
+ return {
3356
+ init: rank.init,
3357
+ next: w => (next(w) - 1) / (w.data.length - 1)
3358
+ };
3359
+ },
3360
+ cume_dist: function () {
3361
+ let cume;
3362
+ return {
3363
+ init: () => cume = 0,
3364
+ next: w => {
3365
+ const d = w.data,
3366
+ c = w.compare;
3367
+ let i = w.index;
3368
+ if (cume < i) {
3369
+ while (i + 1 < d.length && !c(d[i], d[i + 1])) ++i;
3370
+ cume = i;
3371
+ }
3372
+ return (1 + cume) / d.length;
3373
+ }
3374
+ };
3375
+ },
3376
+ ntile: function (field, num) {
3377
+ num = +num;
3378
+ if (!(num > 0)) error('ntile num must be greater than zero.');
3379
+ const cume = WindowOps.cume_dist(),
3380
+ next = cume.next;
3381
+ return {
3382
+ init: cume.init,
3383
+ next: w => Math.ceil(num * next(w))
3384
+ };
3385
+ },
3386
+ lag: function (field, offset) {
3387
+ offset = +offset || 1;
3388
+ return {
3389
+ next: w => {
3390
+ const i = w.index - offset;
3391
+ return i >= 0 ? field(w.data[i]) : null;
3392
+ }
3393
+ };
3394
+ },
3395
+ lead: function (field, offset) {
3396
+ offset = +offset || 1;
3397
+ return {
3398
+ next: w => {
3399
+ const i = w.index + offset,
3400
+ d = w.data;
3401
+ return i < d.length ? field(d[i]) : null;
3402
+ }
3403
+ };
3404
+ },
3405
+ first_value: function (field) {
3406
+ return {
3407
+ next: w => field(w.data[w.i0])
3408
+ };
3409
+ },
3410
+ last_value: function (field) {
3411
+ return {
3412
+ next: w => field(w.data[w.i1 - 1])
3413
+ };
3414
+ },
3415
+ nth_value: function (field, nth) {
3416
+ nth = +nth;
3417
+ if (!(nth > 0)) error('nth_value nth must be greater than zero.');
3418
+ return {
3419
+ next: w => {
3420
+ const i = w.i0 + (nth - 1);
3421
+ return i < w.i1 ? field(w.data[i]) : null;
3422
+ }
3423
+ };
3424
+ },
3425
+ prev_value: function (field) {
3426
+ let prev;
3427
+ return {
3428
+ init: () => prev = null,
3429
+ next: w => {
3430
+ const v = field(w.data[w.index]);
3431
+ return v != null ? prev = v : prev;
3432
+ }
3433
+ };
3434
+ },
3435
+ next_value: function (field) {
3436
+ let v, i;
3437
+ return {
3438
+ init: () => (v = null, i = -1),
3439
+ next: w => {
3440
+ const d = w.data;
3441
+ return w.index <= i ? v : (i = find(field, d, w.index)) < 0 ? (i = d.length, v = null) : v = field(d[i]);
3442
+ }
3443
+ };
3444
+ }
3445
+ };
3446
+ function find(field, data, index) {
3447
+ for (let n = data.length; index < n; ++index) {
3448
+ const v = field(data[index]);
3449
+ if (v != null) return index;
3450
+ }
3451
+ return -1;
3452
+ }
3453
+ const ValidWindowOps = Object.keys(WindowOps);
3454
+
3455
+ function WindowState(_) {
3456
+ const ops = array(_.ops),
3457
+ fields = array(_.fields),
3458
+ params = array(_.params),
3459
+ aggregate_params = array(_.aggregate_params),
3460
+ as = array(_.as),
3461
+ outputs = this.outputs = [],
3462
+ windows = this.windows = [],
3463
+ inputs = {},
3464
+ map = {},
3465
+ counts = [],
3466
+ measures = [];
3467
+ let countOnly = true;
3468
+ function visitInputs(f) {
3469
+ array(accessorFields(f)).forEach(_ => inputs[_] = 1);
3470
+ }
3471
+ visitInputs(_.sort);
3472
+ ops.forEach((op, i) => {
3473
+ const field = fields[i],
3474
+ param = params[i],
3475
+ aggregate_param = aggregate_params[i] || null,
3476
+ mname = accessorName(field),
3477
+ name = measureName(op, mname, as[i]);
3478
+ visitInputs(field);
3479
+ outputs.push(name);
3480
+
3481
+ // Window operation
3482
+ if (has(WindowOps, op)) {
3483
+ windows.push(WindowOp(op, field, param, name));
3484
+ }
3485
+
3486
+ // Aggregate operation
3487
+ else {
3488
+ if (field == null && op !== 'count') {
3489
+ error('Null aggregate field specified.');
3490
+ }
3491
+ if (op === 'count') {
3492
+ counts.push(name);
3493
+ return;
3494
+ }
3495
+ countOnly = false;
3496
+ let m = map[mname];
3497
+ if (!m) {
3498
+ m = map[mname] = [];
3499
+ m.field = field;
3500
+ measures.push(m);
3501
+ }
3502
+ m.push(createMeasure(op, aggregate_param, name));
3503
+ }
3504
+ });
3505
+ if (counts.length || measures.length) {
3506
+ this.cell = cell(measures, counts, countOnly);
3507
+ }
3508
+ this.inputs = Object.keys(inputs);
3509
+ }
3510
+ const prototype = WindowState.prototype;
3511
+ prototype.init = function () {
3512
+ this.windows.forEach(_ => _.init());
3513
+ if (this.cell) this.cell.init();
3514
+ };
3515
+ prototype.update = function (w, t) {
3516
+ const cell = this.cell,
3517
+ wind = this.windows,
3518
+ data = w.data,
3519
+ m = wind && wind.length;
3520
+ let j;
3521
+ if (cell) {
3522
+ for (j = w.p0; j < w.i0; ++j) cell.rem(data[j]);
3523
+ for (j = w.p1; j < w.i1; ++j) cell.add(data[j]);
3524
+ cell.set(t);
3525
+ }
3526
+ for (j = 0; j < m; ++j) wind[j].update(w, t);
3527
+ };
3528
+ function cell(measures, counts, countOnly) {
3529
+ measures = measures.map(m => compileMeasures(m, m.field));
3530
+ const cell = {
3531
+ num: 0,
3532
+ agg: null,
3533
+ store: false,
3534
+ count: counts
3535
+ };
3536
+ if (!countOnly) {
3537
+ var n = measures.length,
3538
+ a = cell.agg = Array(n),
3539
+ i = 0;
3540
+ for (; i < n; ++i) a[i] = new measures[i](cell);
3541
+ }
3542
+ if (cell.store) {
3543
+ var store = cell.data = new TupleStore();
3544
+ }
3545
+ cell.add = function (t) {
3546
+ cell.num += 1;
3547
+ if (countOnly) return;
3548
+ if (store) store.add(t);
3549
+ for (let i = 0; i < n; ++i) {
3550
+ a[i].add(a[i].get(t), t);
3551
+ }
3552
+ };
3553
+ cell.rem = function (t) {
3554
+ cell.num -= 1;
3555
+ if (countOnly) return;
3556
+ if (store) store.rem(t);
3557
+ for (let i = 0; i < n; ++i) {
3558
+ a[i].rem(a[i].get(t), t);
3559
+ }
3560
+ };
3561
+ cell.set = function (t) {
3562
+ let i, n;
3563
+
3564
+ // consolidate stored values
3565
+ if (store) store.values();
3566
+
3567
+ // update tuple properties
3568
+ for (i = 0, n = counts.length; i < n; ++i) t[counts[i]] = cell.num;
3569
+ if (!countOnly) for (i = 0, n = a.length; i < n; ++i) a[i].set(t);
3570
+ };
3571
+ cell.init = function () {
3572
+ cell.num = 0;
3573
+ if (store) store.reset();
3574
+ for (let i = 0; i < n; ++i) a[i].init();
3575
+ };
3576
+ return cell;
3577
+ }
3578
+
3579
+ /**
3580
+ * Perform window calculations and write results to the input stream.
3581
+ * @constructor
3582
+ * @param {object} params - The parameters for this operator.
3583
+ * @param {function(*,*): number} [params.sort] - A comparator function for sorting tuples within a window.
3584
+ * @param {Array<function(object): *>} [params.groupby] - An array of accessors by which to partition tuples into separate windows.
3585
+ * @param {Array<string>} params.ops - An array of strings indicating window operations to perform.
3586
+ * @param {Array<function(object): *>} [params.fields] - An array of accessors
3587
+ * for data fields to use as inputs to window operations.
3588
+ * @param {Array<*>} [params.params] - An array of parameter values for window operations.
3589
+ * @param {Array<number>} [params.aggregate_params] - An optional array of parameter values for aggregation operations.
3590
+ * @param {Array<string>} [params.as] - An array of output field names for window operations.
3591
+ * @param {Array<number>} [params.frame] - Window frame definition as two-element array.
3592
+ * @param {boolean} [params.ignorePeers=false] - If true, base window frame boundaries on row
3593
+ * number alone, ignoring peers with identical sort values. If false (default),
3594
+ * the window boundaries will be adjusted to include peer values.
3595
+ */
3596
+ function Window(params) {
3597
+ Transform.call(this, {}, params);
3598
+ this._mlen = 0;
3599
+ this._mods = [];
3600
+ }
3601
+ Window.Definition = {
3602
+ 'type': 'Window',
3603
+ 'metadata': {
3604
+ 'modifies': true
3605
+ },
3606
+ 'params': [{
3607
+ 'name': 'sort',
3608
+ 'type': 'compare'
3609
+ }, {
3610
+ 'name': 'groupby',
3611
+ 'type': 'field',
3612
+ 'array': true
3613
+ }, {
3614
+ 'name': 'ops',
3615
+ 'type': 'enum',
3616
+ 'array': true,
3617
+ 'values': ValidWindowOps.concat(ValidAggregateOps)
3618
+ }, {
3619
+ 'name': 'params',
3620
+ 'type': 'number',
3621
+ 'null': true,
3622
+ 'array': true
3623
+ }, {
3624
+ 'name': 'aggregate_params',
3625
+ 'type': 'number',
3626
+ 'null': true,
3627
+ 'array': true
3628
+ }, {
3629
+ 'name': 'fields',
3630
+ 'type': 'field',
3631
+ 'null': true,
3632
+ 'array': true
3633
+ }, {
3634
+ 'name': 'as',
3635
+ 'type': 'string',
3636
+ 'null': true,
3637
+ 'array': true
3638
+ }, {
3639
+ 'name': 'frame',
3640
+ 'type': 'number',
3641
+ 'null': true,
3642
+ 'array': true,
3643
+ 'length': 2,
3644
+ 'default': [null, 0]
3645
+ }, {
3646
+ 'name': 'ignorePeers',
3647
+ 'type': 'boolean',
3648
+ 'default': false
3649
+ }]
3650
+ };
3651
+ inherits(Window, Transform, {
3652
+ transform(_, pulse) {
3653
+ this.stamp = pulse.stamp;
3654
+ const mod = _.modified(),
3655
+ cmp = stableCompare(_.sort),
3656
+ key = groupkey(_.groupby),
3657
+ group = t => this.group(key(t));
3658
+
3659
+ // initialize window state
3660
+ let state = this.state;
3661
+ if (!state || mod) {
3662
+ state = this.state = new WindowState(_);
3663
+ }
3664
+
3665
+ // partition input tuples
3666
+ if (mod || pulse.modified(state.inputs)) {
3667
+ this.value = {};
3668
+ pulse.visit(pulse.SOURCE, t => group(t).add(t));
3669
+ } else {
3670
+ pulse.visit(pulse.REM, t => group(t).remove(t));
3671
+ pulse.visit(pulse.ADD, t => group(t).add(t));
3672
+ }
3673
+
3674
+ // perform window calculations for each modified partition
3675
+ for (let i = 0, n = this._mlen; i < n; ++i) {
3676
+ processPartition(this._mods[i], state, cmp, _);
3677
+ }
3678
+ this._mlen = 0;
3679
+ this._mods = [];
3680
+
3681
+ // TODO don't reflow everything?
3682
+ return pulse.reflow(mod).modifies(state.outputs);
3683
+ },
3684
+ group(key) {
3685
+ let group = this.value[key];
3686
+ if (!group) {
3687
+ group = this.value[key] = SortedList(tupleid);
3688
+ group.stamp = -1;
3689
+ }
3690
+ if (group.stamp < this.stamp) {
3691
+ group.stamp = this.stamp;
3692
+ this._mods[this._mlen++] = group;
3693
+ }
3694
+ return group;
3695
+ }
3696
+ });
3697
+ function processPartition(list, state, cmp, _) {
3698
+ const sort = _.sort,
3699
+ range = sort && !_.ignorePeers,
3700
+ frame = _.frame || [null, 0],
3701
+ data = list.data(cmp),
3702
+ // use cmp for stable sort
3703
+ n = data.length,
3704
+ b = range ? bisector(sort) : null,
3705
+ w = {
3706
+ i0: 0,
3707
+ i1: 0,
3708
+ p0: 0,
3709
+ p1: 0,
3710
+ index: 0,
3711
+ data: data,
3712
+ compare: sort || constant(-1)
3713
+ };
3714
+ state.init();
3715
+ for (let i = 0; i < n; ++i) {
3716
+ setWindow(w, frame, i, n);
3717
+ if (range) adjustRange(w, b);
3718
+ state.update(w, data[i]);
3719
+ }
3720
+ }
3721
+ function setWindow(w, f, i, n) {
3722
+ w.p0 = w.i0;
3723
+ w.p1 = w.i1;
3724
+ w.i0 = f[0] == null ? 0 : Math.max(0, i - Math.abs(f[0]));
3725
+ w.i1 = f[1] == null ? n : Math.min(n, i + Math.abs(f[1]) + 1);
3726
+ w.index = i;
3727
+ }
3728
+
3729
+ // if frame type is 'range', adjust window for peer values
3730
+ function adjustRange(w, bisect) {
3731
+ const r0 = w.i0,
3732
+ r1 = w.i1 - 1,
3733
+ c = w.compare,
3734
+ d = w.data,
3735
+ n = d.length - 1;
3736
+ if (r0 > 0 && !c(d[r0], d[r0 - 1])) w.i0 = bisect.left(d, d[r0]);
3737
+ if (r1 < n && !c(d[r1], d[r1 + 1])) w.i1 = bisect.right(d, d[r1]);
3738
+ }
3739
+
3740
+ export { Aggregate as aggregate, Bin as bin, Collect as collect, Compare as compare, CountPattern as countpattern, Cross as cross, Density as density, DotBin as dotbin, Expression as expression, Extent as extent, Facet as facet, Field as field, Filter as filter, Flatten as flatten, Fold as fold, Formula as formula, Generate as generate, Impute as impute, JoinAggregate as joinaggregate, KDE as kde, Key as key, Load as load, Lookup as lookup, MultiExtent as multiextent, MultiValues as multivalues, Params as params, Pivot as pivot, PreFacet as prefacet, Project as project, Proxy as proxy, Quantile as quantile, Relay as relay, Sample as sample, Sequence as sequence, Sieve as sieve, Subflow as subflow, TimeUnit as timeunit, TupleIndex as tupleindex, Values as values, Window as window };