pond-ts 0.2.0 → 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 +14 -0
  2. package/dist/TimeSeries.d.ts +132 -2
  3. package/dist/TimeSeries.d.ts.map +1 -1
  4. package/dist/TimeSeries.js +745 -418
  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,56 @@
1
+ export const keep = {
2
+ outputKind: 'source',
3
+ reduce(defined) {
4
+ if (defined.length === 0)
5
+ return undefined;
6
+ const ref = defined[0];
7
+ for (let i = 1; i < defined.length; i++) {
8
+ if (defined[i] !== ref)
9
+ return undefined;
10
+ }
11
+ return ref;
12
+ },
13
+ bucketState() {
14
+ let ref;
15
+ let hasDefined = false;
16
+ let allSame = true;
17
+ return {
18
+ add(v) {
19
+ if (v === undefined)
20
+ return;
21
+ if (!hasDefined) {
22
+ ref = v;
23
+ hasDefined = true;
24
+ }
25
+ else if (v !== ref)
26
+ allSame = false;
27
+ },
28
+ snapshot() {
29
+ return hasDefined && allSame ? ref : undefined;
30
+ },
31
+ };
32
+ },
33
+ rollingState() {
34
+ const counts = new Map();
35
+ return {
36
+ add(_i, v) {
37
+ if (v === undefined)
38
+ return;
39
+ counts.set(v, (counts.get(v) ?? 0) + 1);
40
+ },
41
+ remove(_i, v) {
42
+ if (v === undefined)
43
+ return;
44
+ const c = counts.get(v) - 1;
45
+ if (c === 0)
46
+ counts.delete(v);
47
+ else
48
+ counts.set(v, c);
49
+ },
50
+ snapshot() {
51
+ return counts.size === 1 ? counts.keys().next().value : undefined;
52
+ },
53
+ };
54
+ },
55
+ };
56
+ //# sourceMappingURL=keep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keep.js","sourceRoot":"","sources":["../../src/reducers/keep.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,IAAI,GAAe;IAC9B,UAAU,EAAE,QAAQ;IACpB,MAAM,CAAC,OAAO;QACZ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;QACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG;gBAAE,OAAO,SAAS,CAAC;QAC3C,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,WAAW;QACT,IAAI,GAA4B,CAAC;QACjC,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,OAAO;YACL,GAAG,CAAC,CAAC;gBACH,IAAI,CAAC,KAAK,SAAS;oBAAE,OAAO;gBAC5B,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,GAAG,GAAG,CAAC,CAAC;oBACR,UAAU,GAAG,IAAI,CAAC;gBACpB,CAAC;qBAAM,IAAI,CAAC,KAAK,GAAG;oBAAE,OAAO,GAAG,KAAK,CAAC;YACxC,CAAC;YACD,QAAQ;gBACN,OAAO,UAAU,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;YACjD,CAAC;SACF,CAAC;IACJ,CAAC;IACD,YAAY;QACV,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;QAC9C,OAAO;YACL,GAAG,CAAC,EAAE,EAAE,CAAC;gBACP,IAAI,CAAC,KAAK,SAAS;oBAAE,OAAO;gBAC5B,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1C,CAAC;YACD,MAAM,CAAC,EAAE,EAAE,CAAC;gBACV,IAAI,CAAC,KAAK,SAAS;oBAAE,OAAO;gBAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC;gBAC7B,IAAI,CAAC,KAAK,CAAC;oBAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;;oBACzB,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxB,CAAC;YACD,QAAQ;gBACN,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;YACpE,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ReducerDef } from './types.js';
2
+ export declare const last: ReducerDef;
3
+ //# sourceMappingURL=last.d.ts.map
@@ -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":""}