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.
- package/README.md +18 -0
- package/dist/TimeSeries.d.ts +132 -2
- package/dist/TimeSeries.d.ts.map +1 -1
- package/dist/TimeSeries.js +1044 -239
- package/dist/TimeSeries.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/reducers/avg.d.ts +3 -0
- package/dist/reducers/avg.d.ts.map +1 -0
- package/dist/reducers/avg.js +45 -0
- package/dist/reducers/avg.js.map +1 -0
- package/dist/reducers/count.d.ts +3 -0
- package/dist/reducers/count.d.ts.map +1 -0
- package/dist/reducers/count.js +35 -0
- package/dist/reducers/count.js.map +1 -0
- package/dist/reducers/difference.d.ts +3 -0
- package/dist/reducers/difference.d.ts.map +1 -0
- package/dist/reducers/difference.js +48 -0
- package/dist/reducers/difference.js.map +1 -0
- package/dist/reducers/first.d.ts +3 -0
- package/dist/reducers/first.d.ts.map +1 -0
- package/dist/reducers/first.js +23 -0
- package/dist/reducers/first.js.map +1 -0
- package/dist/reducers/index.d.ts +4 -0
- package/dist/reducers/index.d.ts.map +1 -0
- package/dist/reducers/index.js +35 -0
- package/dist/reducers/index.js.map +1 -0
- package/dist/reducers/keep.d.ts +3 -0
- package/dist/reducers/keep.d.ts.map +1 -0
- package/dist/reducers/keep.js +56 -0
- package/dist/reducers/keep.js.map +1 -0
- package/dist/reducers/last.d.ts +3 -0
- package/dist/reducers/last.d.ts.map +1 -0
- package/dist/reducers/last.js +23 -0
- package/dist/reducers/last.js.map +1 -0
- package/dist/reducers/max.d.ts +3 -0
- package/dist/reducers/max.d.ts.map +1 -0
- package/dist/reducers/max.js +25 -0
- package/dist/reducers/max.js.map +1 -0
- package/dist/reducers/median.d.ts +3 -0
- package/dist/reducers/median.d.ts.map +1 -0
- package/dist/reducers/median.js +39 -0
- package/dist/reducers/median.js.map +1 -0
- package/dist/reducers/min.d.ts +3 -0
- package/dist/reducers/min.d.ts.map +1 -0
- package/dist/reducers/min.js +25 -0
- package/dist/reducers/min.js.map +1 -0
- package/dist/reducers/percentile.d.ts +5 -0
- package/dist/reducers/percentile.d.ts.map +1 -0
- package/dist/reducers/percentile.js +56 -0
- package/dist/reducers/percentile.js.map +1 -0
- package/dist/reducers/rolling.d.ts +15 -0
- package/dist/reducers/rolling.d.ts.map +1 -0
- package/dist/reducers/rolling.js +84 -0
- package/dist/reducers/rolling.js.map +1 -0
- package/dist/reducers/stdev.d.ts +3 -0
- package/dist/reducers/stdev.d.ts.map +1 -0
- package/dist/reducers/stdev.js +58 -0
- package/dist/reducers/stdev.js.map +1 -0
- package/dist/reducers/sum.d.ts +3 -0
- package/dist/reducers/sum.d.ts.map +1 -0
- package/dist/reducers/sum.js +35 -0
- package/dist/reducers/sum.js.map +1 -0
- package/dist/reducers/types.d.ts +58 -0
- package/dist/reducers/types.d.ts.map +1 -0
- package/dist/reducers/types.js +2 -0
- package/dist/reducers/types.js.map +1 -0
- package/dist/types.d.ts +28 -4
- package/dist/types.d.ts.map +1 -1
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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' ?
|
|
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
|
|
115
|
-
type
|
|
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],
|