pond-ts 0.1.4 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +18 -0
  2. package/dist/TimeSeries.d.ts +132 -2
  3. package/dist/TimeSeries.d.ts.map +1 -1
  4. package/dist/TimeSeries.js +1044 -239
  5. package/dist/TimeSeries.js.map +1 -1
  6. package/dist/index.d.ts +1 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/reducers/avg.d.ts +3 -0
  9. package/dist/reducers/avg.d.ts.map +1 -0
  10. package/dist/reducers/avg.js +45 -0
  11. package/dist/reducers/avg.js.map +1 -0
  12. package/dist/reducers/count.d.ts +3 -0
  13. package/dist/reducers/count.d.ts.map +1 -0
  14. package/dist/reducers/count.js +35 -0
  15. package/dist/reducers/count.js.map +1 -0
  16. package/dist/reducers/difference.d.ts +3 -0
  17. package/dist/reducers/difference.d.ts.map +1 -0
  18. package/dist/reducers/difference.js +48 -0
  19. package/dist/reducers/difference.js.map +1 -0
  20. package/dist/reducers/first.d.ts +3 -0
  21. package/dist/reducers/first.d.ts.map +1 -0
  22. package/dist/reducers/first.js +23 -0
  23. package/dist/reducers/first.js.map +1 -0
  24. package/dist/reducers/index.d.ts +4 -0
  25. package/dist/reducers/index.d.ts.map +1 -0
  26. package/dist/reducers/index.js +35 -0
  27. package/dist/reducers/index.js.map +1 -0
  28. package/dist/reducers/keep.d.ts +3 -0
  29. package/dist/reducers/keep.d.ts.map +1 -0
  30. package/dist/reducers/keep.js +56 -0
  31. package/dist/reducers/keep.js.map +1 -0
  32. package/dist/reducers/last.d.ts +3 -0
  33. package/dist/reducers/last.d.ts.map +1 -0
  34. package/dist/reducers/last.js +23 -0
  35. package/dist/reducers/last.js.map +1 -0
  36. package/dist/reducers/max.d.ts +3 -0
  37. package/dist/reducers/max.d.ts.map +1 -0
  38. package/dist/reducers/max.js +25 -0
  39. package/dist/reducers/max.js.map +1 -0
  40. package/dist/reducers/median.d.ts +3 -0
  41. package/dist/reducers/median.d.ts.map +1 -0
  42. package/dist/reducers/median.js +39 -0
  43. package/dist/reducers/median.js.map +1 -0
  44. package/dist/reducers/min.d.ts +3 -0
  45. package/dist/reducers/min.d.ts.map +1 -0
  46. package/dist/reducers/min.js +25 -0
  47. package/dist/reducers/min.js.map +1 -0
  48. package/dist/reducers/percentile.d.ts +5 -0
  49. package/dist/reducers/percentile.d.ts.map +1 -0
  50. package/dist/reducers/percentile.js +56 -0
  51. package/dist/reducers/percentile.js.map +1 -0
  52. package/dist/reducers/rolling.d.ts +15 -0
  53. package/dist/reducers/rolling.d.ts.map +1 -0
  54. package/dist/reducers/rolling.js +84 -0
  55. package/dist/reducers/rolling.js.map +1 -0
  56. package/dist/reducers/stdev.d.ts +3 -0
  57. package/dist/reducers/stdev.d.ts.map +1 -0
  58. package/dist/reducers/stdev.js +58 -0
  59. package/dist/reducers/stdev.js.map +1 -0
  60. package/dist/reducers/sum.d.ts +3 -0
  61. package/dist/reducers/sum.d.ts.map +1 -0
  62. package/dist/reducers/sum.js +35 -0
  63. package/dist/reducers/sum.js.map +1 -0
  64. package/dist/reducers/types.d.ts +58 -0
  65. package/dist/reducers/types.d.ts.map +1 -0
  66. package/dist/reducers/types.js +2 -0
  67. package/dist/reducers/types.js.map +1 -0
  68. package/dist/types.d.ts +28 -4
  69. package/dist/types.d.ts.map +1 -1
  70. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"last.d.ts","sourceRoot":"","sources":["../../src/reducers/last.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,eAAO,MAAM,IAAI,EAAE,UAqBlB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { rollingOrderedEntries } from './rolling.js';
2
+ export const last = {
3
+ outputKind: 'source',
4
+ reduce(defined) {
5
+ return defined[defined.length - 1];
6
+ },
7
+ bucketState() {
8
+ let val;
9
+ return {
10
+ add(v) {
11
+ if (v !== undefined)
12
+ val = v;
13
+ },
14
+ snapshot() {
15
+ return val;
16
+ },
17
+ };
18
+ },
19
+ rollingState() {
20
+ return rollingOrderedEntries((entries) => entries[entries.length - 1]?.value);
21
+ },
22
+ };
23
+ //# sourceMappingURL=last.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"last.js","sourceRoot":"","sources":["../../src/reducers/last.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,CAAC,MAAM,IAAI,GAAe;IAC9B,UAAU,EAAE,QAAQ;IACpB,MAAM,CAAC,OAAO;QACZ,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,WAAW;QACT,IAAI,GAA4B,CAAC;QACjC,OAAO;YACL,GAAG,CAAC,CAAC;gBACH,IAAI,CAAC,KAAK,SAAS;oBAAE,GAAG,GAAG,CAAC,CAAC;YAC/B,CAAC;YACD,QAAQ;gBACN,OAAO,GAAG,CAAC;YACb,CAAC;SACF,CAAC;IACJ,CAAC;IACD,YAAY;QACV,OAAO,qBAAqB,CAC1B,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,CAChD,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ReducerDef } from './types.js';
2
+ export declare const max: ReducerDef;
3
+ //# sourceMappingURL=max.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"max.d.ts","sourceRoot":"","sources":["../../src/reducers/max.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,eAAO,MAAM,GAAG,EAAE,UAqBjB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { rollingMonotoneDeque } from './rolling.js';
2
+ export const max = {
3
+ outputKind: 'number',
4
+ reduce(_d, numeric) {
5
+ return numeric.length === 0
6
+ ? undefined
7
+ : numeric.reduce((a, b) => (a >= b ? a : b));
8
+ },
9
+ bucketState() {
10
+ let hi;
11
+ return {
12
+ add(v) {
13
+ if (typeof v === 'number' && (hi === undefined || v > hi))
14
+ hi = v;
15
+ },
16
+ snapshot() {
17
+ return hi;
18
+ },
19
+ };
20
+ },
21
+ rollingState() {
22
+ return rollingMonotoneDeque((existing, incoming) => existing >= incoming);
23
+ },
24
+ };
25
+ //# sourceMappingURL=max.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"max.js","sourceRoot":"","sources":["../../src/reducers/max.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,CAAC,MAAM,GAAG,GAAe;IAC7B,UAAU,EAAE,QAAQ;IACpB,MAAM,CAAC,EAAE,EAAE,OAAO;QAChB,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC;YACzB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,WAAW;QACT,IAAI,EAAsB,CAAC;QAC3B,OAAO;YACL,GAAG,CAAC,CAAC;gBACH,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC;oBAAE,EAAE,GAAG,CAAC,CAAC;YACpE,CAAC;YACD,QAAQ;gBACN,OAAO,EAAE,CAAC;YACZ,CAAC;SACF,CAAC;IACJ,CAAC;IACD,YAAY;QACV,OAAO,oBAAoB,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC;IAC5E,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ReducerDef } from './types.js';
2
+ export declare const median: ReducerDef;
3
+ //# sourceMappingURL=median.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"median.d.ts","sourceRoot":"","sources":["../../src/reducers/median.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,eAAO,MAAM,MAAM,EAAE,UAgCpB,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { rollingSortedArray } from './rolling.js';
2
+ import { percentileOfSorted } from './percentile.js';
3
+ export const median = {
4
+ outputKind: 'number',
5
+ reduce(_d, numeric) {
6
+ if (numeric.length === 0)
7
+ return undefined;
8
+ const sorted = numeric.slice().sort((a, b) => a - b);
9
+ return percentileOfSorted(sorted, 50);
10
+ },
11
+ bucketState() {
12
+ const collected = [];
13
+ return {
14
+ add(v) {
15
+ if (typeof v === 'number')
16
+ collected.push(v);
17
+ },
18
+ snapshot() {
19
+ if (collected.length === 0)
20
+ return undefined;
21
+ const sorted = collected.slice().sort((a, b) => a - b);
22
+ return percentileOfSorted(sorted, 50);
23
+ },
24
+ };
25
+ },
26
+ rollingState() {
27
+ const arr = rollingSortedArray();
28
+ return {
29
+ add: arr.add,
30
+ remove: arr.remove,
31
+ snapshot() {
32
+ return arr.sorted.length === 0
33
+ ? undefined
34
+ : percentileOfSorted(arr.sorted, 50);
35
+ },
36
+ };
37
+ },
38
+ };
39
+ //# sourceMappingURL=median.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"median.js","sourceRoot":"","sources":["../../src/reducers/median.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,CAAC,MAAM,MAAM,GAAe;IAChC,UAAU,EAAE,QAAQ;IACpB,MAAM,CAAC,EAAE,EAAE,OAAO;QAChB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,OAAO,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC;IACD,WAAW;QACT,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,OAAO;YACL,GAAG,CAAC,CAAC;gBACH,IAAI,OAAO,CAAC,KAAK,QAAQ;oBAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/C,CAAC;YACD,QAAQ;gBACN,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO,SAAS,CAAC;gBAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACvD,OAAO,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACxC,CAAC;SACF,CAAC;IACJ,CAAC;IACD,YAAY;QACV,MAAM,GAAG,GAAG,kBAAkB,EAAE,CAAC;QACjC,OAAO;YACL,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,QAAQ;gBACN,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;oBAC5B,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACzC,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ReducerDef } from './types.js';
2
+ export declare const min: ReducerDef;
3
+ //# sourceMappingURL=min.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"min.d.ts","sourceRoot":"","sources":["../../src/reducers/min.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,eAAO,MAAM,GAAG,EAAE,UAqBjB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { rollingMonotoneDeque } from './rolling.js';
2
+ export const min = {
3
+ outputKind: 'number',
4
+ reduce(_d, numeric) {
5
+ return numeric.length === 0
6
+ ? undefined
7
+ : numeric.reduce((a, b) => (a <= b ? a : b));
8
+ },
9
+ bucketState() {
10
+ let lo;
11
+ return {
12
+ add(v) {
13
+ if (typeof v === 'number' && (lo === undefined || v < lo))
14
+ lo = v;
15
+ },
16
+ snapshot() {
17
+ return lo;
18
+ },
19
+ };
20
+ },
21
+ rollingState() {
22
+ return rollingMonotoneDeque((existing, incoming) => existing <= incoming);
23
+ },
24
+ };
25
+ //# sourceMappingURL=min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"min.js","sourceRoot":"","sources":["../../src/reducers/min.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,CAAC,MAAM,GAAG,GAAe;IAC7B,UAAU,EAAE,QAAQ;IACpB,MAAM,CAAC,EAAE,EAAE,OAAO;QAChB,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC;YACzB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,WAAW;QACT,IAAI,EAAsB,CAAC;QAC3B,OAAO;YACL,GAAG,CAAC,CAAC;gBACH,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC;oBAAE,EAAE,GAAG,CAAC,CAAC;YACpE,CAAC;YACD,QAAQ;gBACN,OAAO,EAAE,CAAC;YACZ,CAAC;SACF,CAAC;IACJ,CAAC;IACD,YAAY;QACV,OAAO,oBAAoB,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC;IAC5E,CAAC;CACF,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ReducerDef } from './types.js';
2
+ export declare function percentileOfSorted(sorted: number[], q: number): number;
3
+ export declare function parsePercentile(op: string): number | undefined;
4
+ export declare function percentileReducer(q: number): ReducerDef;
5
+ //# sourceMappingURL=percentile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"percentile.d.ts","sourceRoot":"","sources":["../../src/reducers/percentile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAMtE;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM9D;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,CAkCvD"}
@@ -0,0 +1,56 @@
1
+ import { rollingSortedArray } from './rolling.js';
2
+ export function percentileOfSorted(sorted, q) {
3
+ const rank = (q / 100) * (sorted.length - 1);
4
+ const lo = Math.floor(rank);
5
+ const hi = Math.ceil(rank);
6
+ if (lo === hi)
7
+ return sorted[lo];
8
+ return sorted[lo] + (sorted[hi] - sorted[lo]) * (rank - lo);
9
+ }
10
+ export function parsePercentile(op) {
11
+ if (op.length > 1 && op.charCodeAt(0) === 112) {
12
+ const q = Number(op.slice(1));
13
+ if (q >= 0 && q <= 100)
14
+ return q;
15
+ }
16
+ return undefined;
17
+ }
18
+ export function percentileReducer(q) {
19
+ return {
20
+ outputKind: 'number',
21
+ reduce(_d, numeric) {
22
+ if (numeric.length === 0)
23
+ return undefined;
24
+ const sorted = numeric.slice().sort((a, b) => a - b);
25
+ return percentileOfSorted(sorted, q);
26
+ },
27
+ bucketState() {
28
+ const collected = [];
29
+ return {
30
+ add(v) {
31
+ if (typeof v === 'number')
32
+ collected.push(v);
33
+ },
34
+ snapshot() {
35
+ if (collected.length === 0)
36
+ return undefined;
37
+ const sorted = collected.slice().sort((a, b) => a - b);
38
+ return percentileOfSorted(sorted, q);
39
+ },
40
+ };
41
+ },
42
+ rollingState() {
43
+ const arr = rollingSortedArray();
44
+ return {
45
+ add: arr.add,
46
+ remove: arr.remove,
47
+ snapshot() {
48
+ return arr.sorted.length === 0
49
+ ? undefined
50
+ : percentileOfSorted(arr.sorted, q);
51
+ },
52
+ };
53
+ },
54
+ };
55
+ }
56
+ //# sourceMappingURL=percentile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"percentile.js","sourceRoot":"","sources":["../../src/reducers/percentile.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,UAAU,kBAAkB,CAAC,MAAgB,EAAE,CAAS;IAC5D,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,MAAM,CAAC,EAAE,CAAE,CAAC;IAClC,OAAO,MAAM,CAAC,EAAE,CAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAE,GAAG,MAAM,CAAC,EAAE,CAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAU;IACxC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QAC9C,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG;YAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,CAAS;IACzC,OAAO;QACL,UAAU,EAAE,QAAQ;QACpB,MAAM,CAAC,EAAE,EAAE,OAAO;YAChB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,SAAS,CAAC;YAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACrD,OAAO,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACvC,CAAC;QACD,WAAW;YACT,MAAM,SAAS,GAAa,EAAE,CAAC;YAC/B,OAAO;gBACL,GAAG,CAAC,CAAC;oBACH,IAAI,OAAO,CAAC,KAAK,QAAQ;wBAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC/C,CAAC;gBACD,QAAQ;oBACN,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;wBAAE,OAAO,SAAS,CAAC;oBAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBACvD,OAAO,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACvC,CAAC;aACF,CAAC;QACJ,CAAC;QACD,YAAY;YACV,MAAM,GAAG,GAAG,kBAAkB,EAAE,CAAC;YACjC,OAAO;gBACL,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,QAAQ;oBACN,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;wBAC5B,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACxC,CAAC;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ScalarValue } from '../types.js';
2
+ import type { RollingReducerState } from './types.js';
3
+ type RollingWindowEntry<T> = {
4
+ index: number;
5
+ value: T;
6
+ };
7
+ export declare function rollingMonotoneDeque(compare: (a: number, b: number) => boolean): RollingReducerState;
8
+ export declare function rollingOrderedEntries(pick: (entries: RollingWindowEntry<ScalarValue>[], head: number) => ScalarValue | undefined): RollingReducerState;
9
+ export declare function rollingSortedArray(): {
10
+ sorted: number[];
11
+ add(index: number, value: ScalarValue | undefined): void;
12
+ remove(index: number, value: ScalarValue | undefined): void;
13
+ };
14
+ export {};
15
+ //# sourceMappingURL=rolling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rolling.d.ts","sourceRoot":"","sources":["../../src/reducers/rolling.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,KAAK,kBAAkB,CAAC,CAAC,IAAI;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC;AAUzD,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,OAAO,GACzC,mBAAmB,CAuBrB;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,CACJ,OAAO,EAAE,kBAAkB,CAAC,WAAW,CAAC,EAAE,EAC1C,IAAI,EAAE,MAAM,KACT,WAAW,GAAG,SAAS,GAC3B,mBAAmB,CAkBrB;AAED,wBAAgB,kBAAkB,IAAI;IACpC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC;IACzD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC;CAC7D,CAwBA"}
@@ -0,0 +1,84 @@
1
+ function compactEntries(entries, head) {
2
+ if (head > 0 && head * 2 >= entries.length)
3
+ return [entries.slice(head), 0];
4
+ return [entries, head];
5
+ }
6
+ export function rollingMonotoneDeque(compare) {
7
+ let entries = [];
8
+ let head = 0;
9
+ return {
10
+ add(index, value) {
11
+ if (typeof value !== 'number')
12
+ return;
13
+ while (entries.length > head) {
14
+ if (compare(entries[entries.length - 1].value, value))
15
+ break;
16
+ entries.pop();
17
+ }
18
+ entries.push({ index, value });
19
+ },
20
+ remove(index, value) {
21
+ if (typeof value !== 'number')
22
+ return;
23
+ if (entries[head]?.index === index) {
24
+ head += 1;
25
+ [entries, head] = compactEntries(entries, head);
26
+ }
27
+ },
28
+ snapshot() {
29
+ return entries[head]?.value;
30
+ },
31
+ };
32
+ }
33
+ export function rollingOrderedEntries(pick) {
34
+ let entries = [];
35
+ let head = 0;
36
+ return {
37
+ add(index, value) {
38
+ if (value !== undefined)
39
+ entries.push({ index, value });
40
+ },
41
+ remove(index, value) {
42
+ if (value === undefined)
43
+ return;
44
+ if (entries[head]?.index === index) {
45
+ head += 1;
46
+ [entries, head] = compactEntries(entries, head);
47
+ }
48
+ },
49
+ snapshot() {
50
+ return pick(entries, head);
51
+ },
52
+ };
53
+ }
54
+ export function rollingSortedArray() {
55
+ const sorted = [];
56
+ function bisect(v) {
57
+ let lo = 0;
58
+ let hi = sorted.length;
59
+ while (lo < hi) {
60
+ const mid = (lo + hi) >>> 1;
61
+ if (sorted[mid] < v)
62
+ lo = mid + 1;
63
+ else
64
+ hi = mid;
65
+ }
66
+ return lo;
67
+ }
68
+ return {
69
+ sorted,
70
+ add(_index, value) {
71
+ if (typeof value !== 'number')
72
+ return;
73
+ sorted.splice(bisect(value), 0, value);
74
+ },
75
+ remove(_index, value) {
76
+ if (typeof value !== 'number')
77
+ return;
78
+ const pos = bisect(value);
79
+ if (pos < sorted.length && sorted[pos] === value)
80
+ sorted.splice(pos, 1);
81
+ },
82
+ };
83
+ }
84
+ //# sourceMappingURL=rolling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rolling.js","sourceRoot":"","sources":["../../src/reducers/rolling.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ReducerDef } from './types.js';
2
+ export declare const stdev: ReducerDef;
3
+ //# sourceMappingURL=stdev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdev.d.ts","sourceRoot":"","sources":["../../src/reducers/stdev.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,eAAO,MAAM,KAAK,EAAE,UAsDnB,CAAC"}
@@ -0,0 +1,58 @@
1
+ export const stdev = {
2
+ outputKind: 'number',
3
+ reduce(_d, numeric) {
4
+ if (numeric.length === 0)
5
+ return undefined;
6
+ const mean = numeric.reduce((s, v) => s + v, 0) / numeric.length;
7
+ const variance = numeric.reduce((s, v) => s + (v - mean) ** 2, 0) / numeric.length;
8
+ return Math.sqrt(variance);
9
+ },
10
+ bucketState() {
11
+ let s = 0;
12
+ let sq = 0;
13
+ let n = 0;
14
+ return {
15
+ add(v) {
16
+ if (typeof v === 'number') {
17
+ s += v;
18
+ sq += v * v;
19
+ n++;
20
+ }
21
+ },
22
+ snapshot() {
23
+ if (n === 0)
24
+ return undefined;
25
+ const mean = s / n;
26
+ return Math.sqrt(sq / n - mean * mean);
27
+ },
28
+ };
29
+ },
30
+ rollingState() {
31
+ let s = 0;
32
+ let sq = 0;
33
+ let n = 0;
34
+ return {
35
+ add(_i, v) {
36
+ if (typeof v === 'number') {
37
+ s += v;
38
+ sq += v * v;
39
+ n++;
40
+ }
41
+ },
42
+ remove(_i, v) {
43
+ if (typeof v === 'number') {
44
+ s -= v;
45
+ sq -= v * v;
46
+ n--;
47
+ }
48
+ },
49
+ snapshot() {
50
+ if (n === 0)
51
+ return undefined;
52
+ const mean = s / n;
53
+ return Math.sqrt(Math.max(0, sq / n - mean * mean));
54
+ },
55
+ };
56
+ },
57
+ };
58
+ //# sourceMappingURL=stdev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdev.js","sourceRoot":"","sources":["../../src/reducers/stdev.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,KAAK,GAAe;IAC/B,UAAU,EAAE,QAAQ;IACpB,MAAM,CAAC,EAAE,EAAE,OAAO;QAChB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;QACjE,MAAM,QAAQ,GACZ,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;QACpE,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IACD,WAAW;QACT,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO;YACL,GAAG,CAAC,CAAC;gBACH,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;oBAC1B,CAAC,IAAI,CAAC,CAAC;oBACP,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;oBACZ,CAAC,EAAE,CAAC;gBACN,CAAC;YACH,CAAC;YACD,QAAQ;gBACN,IAAI,CAAC,KAAK,CAAC;oBAAE,OAAO,SAAS,CAAC;gBAC9B,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;gBACnB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;YACzC,CAAC;SACF,CAAC;IACJ,CAAC;IACD,YAAY;QACV,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO;YACL,GAAG,CAAC,EAAE,EAAE,CAAC;gBACP,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;oBAC1B,CAAC,IAAI,CAAC,CAAC;oBACP,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;oBACZ,CAAC,EAAE,CAAC;gBACN,CAAC;YACH,CAAC;YACD,MAAM,CAAC,EAAE,EAAE,CAAC;gBACV,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;oBAC1B,CAAC,IAAI,CAAC,CAAC;oBACP,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;oBACZ,CAAC,EAAE,CAAC;gBACN,CAAC;YACH,CAAC;YACD,QAAQ;gBACN,IAAI,CAAC,KAAK,CAAC;oBAAE,OAAO,SAAS,CAAC;gBAC9B,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;gBACnB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;YACtD,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ReducerDef } from './types.js';
2
+ export declare const sum: ReducerDef;
3
+ //# sourceMappingURL=sum.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sum.d.ts","sourceRoot":"","sources":["../../src/reducers/sum.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,eAAO,MAAM,GAAG,EAAE,UA8BjB,CAAC"}
@@ -0,0 +1,35 @@
1
+ export const sum = {
2
+ outputKind: 'number',
3
+ reduce(_d, numeric) {
4
+ return numeric.reduce((s, v) => s + v, 0);
5
+ },
6
+ bucketState() {
7
+ let s = 0;
8
+ return {
9
+ add(v) {
10
+ if (typeof v === 'number')
11
+ s += v;
12
+ },
13
+ snapshot() {
14
+ return s;
15
+ },
16
+ };
17
+ },
18
+ rollingState() {
19
+ let s = 0;
20
+ return {
21
+ add(_i, v) {
22
+ if (typeof v === 'number')
23
+ s += v;
24
+ },
25
+ remove(_i, v) {
26
+ if (typeof v === 'number')
27
+ s -= v;
28
+ },
29
+ snapshot() {
30
+ return s;
31
+ },
32
+ };
33
+ },
34
+ };
35
+ //# sourceMappingURL=sum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sum.js","sourceRoot":"","sources":["../../src/reducers/sum.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,GAAG,GAAe;IAC7B,UAAU,EAAE,QAAQ;IACpB,MAAM,CAAC,EAAE,EAAE,OAAO;QAChB,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,WAAW;QACT,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO;YACL,GAAG,CAAC,CAAC;gBACH,IAAI,OAAO,CAAC,KAAK,QAAQ;oBAAE,CAAC,IAAI,CAAC,CAAC;YACpC,CAAC;YACD,QAAQ;gBACN,OAAO,CAAC,CAAC;YACX,CAAC;SACF,CAAC;IACJ,CAAC;IACD,YAAY;QACV,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO;YACL,GAAG,CAAC,EAAE,EAAE,CAAC;gBACP,IAAI,OAAO,CAAC,KAAK,QAAQ;oBAAE,CAAC,IAAI,CAAC,CAAC;YACpC,CAAC;YACD,MAAM,CAAC,EAAE,EAAE,CAAC;gBACV,IAAI,OAAO,CAAC,KAAK,QAAQ;oBAAE,CAAC,IAAI,CAAC,CAAC;YACpC,CAAC;YACD,QAAQ;gBACN,OAAO,CAAC,CAAC;YACX,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,58 @@
1
+ import type { ScalarValue } from '../types.js';
2
+ /**
3
+ * Incremental state for a single column within one aggregation bucket.
4
+ * Created fresh per bucket. Values are fed in via `add()` as events are
5
+ * assigned to the bucket; `snapshot()` reads the current result without
6
+ * consuming the state.
7
+ */
8
+ export type AggregateBucketState = {
9
+ add(value: ScalarValue | undefined): void;
10
+ snapshot(): ScalarValue | undefined;
11
+ };
12
+ /**
13
+ * Incremental state for a single column within a sliding rolling window.
14
+ * Unlike `AggregateBucketState`, this must also support `remove()` so
15
+ * values can leave the window efficiently. `index` is a monotonically
16
+ * increasing event counter used to identify which value to evict.
17
+ */
18
+ export type RollingReducerState = {
19
+ add(index: number, value: ScalarValue | undefined): void;
20
+ remove(index: number, value: ScalarValue | undefined): void;
21
+ snapshot(): ScalarValue | undefined;
22
+ };
23
+ /**
24
+ * Complete definition of a named reducer. Every built-in reducer (sum,
25
+ * avg, median, etc.) implements this interface. Each definition provides
26
+ * three capabilities:
27
+ *
28
+ * - `reduce` — batch reduction over a materialized array of values.
29
+ * Used by `TimeSeries.reduce()`.
30
+ *
31
+ * - `bucketState` — factory for incremental bucket state. Used by
32
+ * `TimeSeries.aggregate()` where events stream into buckets one at a
33
+ * time. Only needs `add` + `snapshot` (values never leave a bucket).
34
+ *
35
+ * - `rollingState` — factory for incremental sliding-window state. Used
36
+ * by `TimeSeries.rolling()` where events both enter and leave the
37
+ * window. Must support `add`, `remove`, and `snapshot`.
38
+ *
39
+ * `outputKind` tells the aggregate schema builder whether the reducer
40
+ * always produces a number (`'number'`) or preserves the source column
41
+ * type (`'source'`). Numeric reducers like sum and avg use `'number'`;
42
+ * type-agnostic reducers like first, last, and keep use `'source'`.
43
+ */
44
+ export type ReducerDef = {
45
+ outputKind: 'number' | 'source';
46
+ /**
47
+ * Batch reduce over a complete value array. `defined` contains all
48
+ * non-undefined values (any type); `numeric` contains only the number
49
+ * values. Both are pre-filtered from the raw event data — reducers do
50
+ * not need to filter themselves.
51
+ */
52
+ reduce(defined: ReadonlyArray<ScalarValue>, numeric: ReadonlyArray<number>): ScalarValue | undefined;
53
+ /** Return a fresh incremental state for one aggregation bucket. */
54
+ bucketState(): AggregateBucketState;
55
+ /** Return a fresh incremental state for one rolling window column. */
56
+ rollingState(): RollingReducerState;
57
+ };
58
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/reducers/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,GAAG,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC;IAC1C,QAAQ,IAAI,WAAW,GAAG,SAAS,CAAC;CACrC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC;IACzD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC;IAC5D,QAAQ,IAAI,WAAW,GAAG,SAAS,CAAC;CACrC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAEhC;;;;;OAKG;IACH,MAAM,CACJ,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,EACnC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAC7B,WAAW,GAAG,SAAS,CAAC;IAE3B,mEAAmE;IACnE,WAAW,IAAI,oBAAoB,CAAC;IAEpC,sEAAsE;IACtE,YAAY,IAAI,mBAAmB,CAAC;CACrC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/reducers/types.ts"],"names":[],"mappings":""}
package/dist/types.d.ts CHANGED
@@ -49,10 +49,16 @@ export type TimeSeriesJsonInput<S extends SeriesSchema> = {
49
49
  schema: S;
50
50
  rows: ReadonlyArray<JsonRowForSchema<S> | JsonObjectRowForSchema<S>>;
51
51
  };
52
+ export type JsonRowFormat = 'array' | 'object';
52
53
  export type NormalizedValueForKind<K extends string> = K extends 'time' ? Time : K extends 'timeRange' ? TimeRange : K extends 'interval' ? Interval : K extends 'number' ? number : K extends 'string' ? string : K extends 'boolean' ? boolean : never;
53
54
  export type NormalizedRowForSchema<S extends readonly ColumnDef<string, string>[]> = {
54
55
  [I in keyof S]: S[I] extends ColumnDef<any, infer K> ? NormalizedValueForKind<K> : never;
55
56
  };
57
+ type NormalizedDataValueForColumn<C extends ColumnDef<string, string>> = C extends ColumnDef<any, infer K> ? K extends FirstColKind ? EventKeyForKind<K> : C['required'] extends false ? NormalizedValueForKind<K> | undefined : NormalizedValueForKind<K> : never;
58
+ export type NormalizedObjectRowForSchema<S extends SeriesSchema> = Partial<{
59
+ [C in S[number] as C['name']]: NormalizedDataValueForColumn<C>;
60
+ }>;
61
+ export type NormalizedObjectRow = Readonly<Record<string, EventKey | ScalarValue | undefined>>;
56
62
  type DataValueForColumn<C extends ColumnDef<string, string>> = C extends ColumnDef<any, infer K> ? C['required'] extends false ? NormalizedValueForKind<K> | undefined : NormalizedValueForKind<K> : never;
57
63
  type DataColumnsForSchema<S extends SeriesSchema> = S extends readonly [
58
64
  FirstColumn,
@@ -101,18 +107,28 @@ export type AlignSchema<S extends SeriesSchema> = readonly [
101
107
  ColumnDef<'interval', 'interval'>,
102
108
  ...OptionalizeColumns<ValueColumnsForSchema<S>>
103
109
  ];
104
- export type AggregateFunction = 'sum' | 'avg' | 'min' | 'max' | 'count' | 'first' | 'last';
110
+ export type AggregateFunction = 'sum' | 'avg' | 'min' | 'max' | 'count' | 'first' | 'last' | 'median' | 'stdev' | 'difference' | 'keep' | `p${number}`;
111
+ export type CustomAggregateReducer = (values: ReadonlyArray<ScalarValue | undefined>) => ScalarValue | undefined;
112
+ export type AggregateReducer = AggregateFunction | CustomAggregateReducer;
105
113
  export type RollingAlignment = 'trailing' | 'leading' | 'centered';
106
114
  export type SmoothMethod = 'ema' | 'movingAverage' | 'loess';
107
115
  export type JoinType = 'inner' | 'left' | 'right' | 'outer';
108
116
  export type JoinConflictMode = 'error' | 'prefix';
109
- type AggregateFunctionsForKind<Kind extends ScalarKind> = Kind extends 'number' ? AggregateFunction : 'count' | 'first' | 'last';
117
+ type AggregateFunctionsForKind<Kind extends ScalarKind> = Kind extends 'number' ? AggregateReducer : 'count' | 'first' | 'last' | 'keep' | CustomAggregateReducer;
110
118
  type AggregateMapEntries<S extends SeriesSchema> = {
111
119
  [C in ValueColumnsForSchema<S>[number] as C['name']]?: AggregateFunctionsForKind<C['kind']>;
112
120
  };
113
121
  export type AggregateMap<S extends SeriesSchema> = Readonly<AggregateMapEntries<S>>;
114
- type AggregateKindForColumn<Column extends ValueColumn, Op extends AggregateFunction> = Op extends 'sum' | 'avg' | 'count' ? 'number' : Column['kind'];
115
- type AggregateColumnForMap<Column extends ValueColumn, Mapping> = Column['name'] extends keyof Mapping ? Mapping[Column['name']] extends AggregateFunction ? ColumnDef<Column['name'], AggregateKindForColumn<Column, Mapping[Column['name']]>> & {
122
+ type ValueColumnByName<S extends SeriesSchema, Name extends ValueColumnsForSchema<S>[number]['name']> = Extract<ValueColumnsForSchema<S>[number], ColumnDef<Name, ScalarKind>>;
123
+ type AggregateReducerForColumn<S extends SeriesSchema, Name extends ValueColumnsForSchema<S>[number]['name']> = AggregateFunctionsForKind<ValueColumnByName<S, Name>['kind']>;
124
+ export type AggregateOutputSpec<S extends SeriesSchema, Name extends ValueColumnsForSchema<S>[number]['name'] = ValueColumnsForSchema<S>[number]['name']> = Readonly<{
125
+ from: Name;
126
+ using: AggregateReducerForColumn<S, Name>;
127
+ kind?: ScalarKind;
128
+ }>;
129
+ export type AggregateOutputMap<S extends SeriesSchema> = Readonly<Record<string, AggregateOutputSpec<S>>>;
130
+ type AggregateKindForColumn<Column extends ValueColumn, Op extends AggregateReducer> = Op extends AggregateFunction ? Op extends 'sum' | 'avg' | 'count' ? 'number' : Column['kind'] : Column['kind'];
131
+ type AggregateColumnForMap<Column extends ValueColumn, Mapping> = Column['name'] extends keyof Mapping ? Mapping[Column['name']] extends AggregateReducer ? ColumnDef<Column['name'], AggregateKindForColumn<Column, Mapping[Column['name']]>> & {
116
132
  readonly required: false;
117
133
  } : never : never;
118
134
  type AggregateColumns<Columns extends readonly ValueColumn[], Mapping> = Columns extends readonly [infer Head, ...infer Tail] ? Head extends ValueColumn ? Tail extends readonly ValueColumn[] ? Head['name'] extends keyof Mapping ? [
@@ -127,6 +143,10 @@ export type RollingSchema<S extends SeriesSchema, Mapping> = readonly [
127
143
  S[0],
128
144
  ...AggregateColumns<ValueColumnsForSchema<S>, Mapping>
129
145
  ];
146
+ type ReduceResultForMap<S extends SeriesSchema, Mapping> = {
147
+ [K in keyof Mapping & string]: ScalarValue | undefined;
148
+ };
149
+ export type ReduceResult<S extends SeriesSchema, Mapping> = ReduceResultForMap<S, Mapping>;
130
150
  export type NumericColumnNameForSchema<S extends SeriesSchema> = Extract<ValueColumnsForSchema<S>[number], ColumnDef<string, 'number'>>['name'];
131
151
  type OptionalNumberColumn<Name extends string> = ColumnDef<Name, 'number'> & {
132
152
  readonly required: false;
@@ -137,6 +157,10 @@ type ReplaceSmoothedColumn<Columns extends readonly ValueColumn[], Target extend
137
157
  ] : [Head, ...ReplaceSmoothedColumn<Tail, Target>] : [] : [] : [];
138
158
  export type SmoothSchema<S extends SeriesSchema, Target extends NumericColumnNameForSchema<S>> = readonly [S[0], ...ReplaceSmoothedColumn<ValueColumnsForSchema<S>, Target>];
139
159
  export type SmoothAppendSchema<S extends SeriesSchema, Name extends string> = readonly [S[0], ...ValueColumnsForSchema<S>, OptionalNumberColumn<Name>];
160
+ export type DiffSchema<S extends SeriesSchema, Targets extends NumericColumnNameForSchema<S>> = readonly [
161
+ S[0],
162
+ ...ReplaceSmoothedColumn<ValueColumnsForSchema<S>, Targets>
163
+ ];
140
164
  type JoinColumns<Left extends readonly ValueColumn[], Right extends readonly ValueColumn[]> = [...OptionalizeColumns<Left>, ...OptionalizeColumns<Right>];
141
165
  export type JoinSchema<Left extends SeriesSchema, Right extends SeriesSchema> = readonly [
142
166
  Left[0],