@hpcc-js/dataflow 8.0.1 → 8.1.1
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/LICENSE +43 -43
- package/README.md +530 -530
- package/dist/index.js +446 -446
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/lib-es6/__package__.js +3 -3
- package/lib-es6/__tests__/chain.js +48 -48
- package/lib-es6/__tests__/concat.js +16 -16
- package/lib-es6/__tests__/count.js +18 -18
- package/lib-es6/__tests__/data.js +55 -55
- package/lib-es6/__tests__/deviation.js +12 -12
- package/lib-es6/__tests__/distribution.js +18 -18
- package/lib-es6/__tests__/each.js +11 -11
- package/lib-es6/__tests__/entries.js +12 -12
- package/lib-es6/__tests__/extent.js +18 -18
- package/lib-es6/__tests__/filter.js +13 -13
- package/lib-es6/__tests__/first.js +13 -13
- package/lib-es6/__tests__/generate.js +7 -7
- package/lib-es6/__tests__/group.js +17 -17
- package/lib-es6/__tests__/histogram.js +41 -41
- package/lib-es6/__tests__/map.js +13 -13
- package/lib-es6/__tests__/max.js +29 -29
- package/lib-es6/__tests__/mean.js +9 -9
- package/lib-es6/__tests__/median.js +12 -12
- package/lib-es6/__tests__/min.js +29 -29
- package/lib-es6/__tests__/quartile.js +11 -11
- package/lib-es6/__tests__/readme.js +95 -95
- package/lib-es6/__tests__/reduce.js +14 -14
- package/lib-es6/__tests__/skip.js +13 -13
- package/lib-es6/__tests__/sort.js +18 -18
- package/lib-es6/__tests__/variance.js +12 -12
- package/lib-es6/activities/activity.js +3 -3
- package/lib-es6/activities/concat.js +9 -9
- package/lib-es6/activities/each.js +13 -13
- package/lib-es6/activities/entries.js +12 -12
- package/lib-es6/activities/filter.js +14 -14
- package/lib-es6/activities/first.js +17 -17
- package/lib-es6/activities/group.js +20 -20
- package/lib-es6/activities/histogram.js +63 -63
- package/lib-es6/activities/map.js +12 -12
- package/lib-es6/activities/skip.js +16 -16
- package/lib-es6/activities/sort.js +9 -9
- package/lib-es6/index.js +25 -25
- package/lib-es6/observers/count.js +12 -12
- package/lib-es6/observers/deviation.js +17 -17
- package/lib-es6/observers/distribution.js +35 -35
- package/lib-es6/observers/extent.js +17 -17
- package/lib-es6/observers/max.js +18 -18
- package/lib-es6/observers/mean.js +20 -20
- package/lib-es6/observers/median.js +25 -25
- package/lib-es6/observers/min.js +18 -18
- package/lib-es6/observers/observer.js +34 -34
- package/lib-es6/observers/quartile.js +37 -37
- package/lib-es6/observers/reduce.js +17 -17
- package/lib-es6/observers/variance.js +22 -22
- package/lib-es6/utils/generate.js +6 -6
- package/lib-es6/utils/pipe.js +31 -31
- package/package.json +6 -24
- package/src/__package__.ts +3 -3
- package/src/__tests__/chain.ts +85 -85
- package/src/__tests__/concat.ts +18 -18
- package/src/__tests__/count.ts +25 -25
- package/src/__tests__/data.ts +64 -64
- package/src/__tests__/deviation.ts +14 -14
- package/src/__tests__/distribution.ts +21 -21
- package/src/__tests__/each.ts +13 -13
- package/src/__tests__/entries.ts +14 -14
- package/src/__tests__/extent.ts +25 -25
- package/src/__tests__/filter.ts +16 -16
- package/src/__tests__/first.ts +15 -15
- package/src/__tests__/generate.ts +9 -9
- package/src/__tests__/group.ts +19 -19
- package/src/__tests__/histogram.ts +47 -47
- package/src/__tests__/map.ts +16 -16
- package/src/__tests__/max.ts +42 -42
- package/src/__tests__/mean.ts +11 -11
- package/src/__tests__/median.ts +14 -14
- package/src/__tests__/min.ts +42 -42
- package/src/__tests__/quartile.ts +14 -14
- package/src/__tests__/readme.ts +113 -113
- package/src/__tests__/reduce.ts +17 -17
- package/src/__tests__/skip.ts +15 -15
- package/src/__tests__/sort.ts +21 -21
- package/src/__tests__/variance.ts +14 -14
- package/src/activities/activity.ts +8 -8
- package/src/activities/concat.ts +14 -14
- package/src/activities/each.ts +19 -19
- package/src/activities/entries.ts +17 -17
- package/src/activities/filter.ts +20 -20
- package/src/activities/first.ts +20 -20
- package/src/activities/group.ts +27 -27
- package/src/activities/histogram.ts +78 -78
- package/src/activities/map.ts +18 -18
- package/src/activities/skip.ts +19 -19
- package/src/activities/sort.ts +16 -16
- package/src/index.ts +25 -25
- package/src/observers/count.ts +15 -15
- package/src/observers/deviation.ts +24 -24
- package/src/observers/distribution.ts +51 -51
- package/src/observers/extent.ts +24 -24
- package/src/observers/max.ts +24 -24
- package/src/observers/mean.ts +26 -26
- package/src/observers/median.ts +30 -30
- package/src/observers/min.ts +24 -24
- package/src/observers/observer.ts +52 -52
- package/src/observers/quartile.ts +43 -43
- package/src/observers/reduce.ts +22 -22
- package/src/observers/variance.ts +29 -29
- package/src/utils/generate.ts +6 -6
- package/src/utils/pipe.ts +74 -74
- package/types/__package__.d.ts +3 -3
- package/types/__tests__/chain.d.ts +1 -1
- package/types/__tests__/concat.d.ts +1 -1
- package/types/__tests__/count.d.ts +1 -1
- package/types/__tests__/data.d.ts +61 -61
- package/types/__tests__/deviation.d.ts +1 -1
- package/types/__tests__/distribution.d.ts +1 -1
- package/types/__tests__/each.d.ts +1 -1
- package/types/__tests__/entries.d.ts +1 -1
- package/types/__tests__/extent.d.ts +1 -1
- package/types/__tests__/filter.d.ts +1 -1
- package/types/__tests__/first.d.ts +1 -1
- package/types/__tests__/generate.d.ts +1 -1
- package/types/__tests__/group.d.ts +1 -1
- package/types/__tests__/histogram.d.ts +1 -1
- package/types/__tests__/map.d.ts +1 -1
- package/types/__tests__/max.d.ts +1 -1
- package/types/__tests__/mean.d.ts +1 -1
- package/types/__tests__/median.d.ts +1 -1
- package/types/__tests__/min.d.ts +1 -1
- package/types/__tests__/quartile.d.ts +1 -1
- package/types/__tests__/readme.d.ts +1 -1
- package/types/__tests__/reduce.d.ts +1 -1
- package/types/__tests__/skip.d.ts +1 -1
- package/types/__tests__/sort.d.ts +1 -1
- package/types/__tests__/variance.d.ts +1 -1
- package/types/activities/activity.d.ts +5 -5
- package/types/activities/concat.d.ts +3 -3
- package/types/activities/each.d.ts +4 -4
- package/types/activities/entries.d.ts +3 -3
- package/types/activities/filter.d.ts +4 -4
- package/types/activities/first.d.ts +3 -3
- package/types/activities/group.d.ts +8 -8
- package/types/activities/histogram.d.ts +17 -17
- package/types/activities/map.d.ts +4 -4
- package/types/activities/skip.d.ts +3 -3
- package/types/activities/sort.d.ts +4 -4
- package/types/index.d.ts +25 -25
- package/types/observers/count.d.ts +2 -2
- package/types/observers/deviation.d.ts +4 -4
- package/types/observers/distribution.d.ts +12 -12
- package/types/observers/extent.d.ts +4 -4
- package/types/observers/max.d.ts +4 -4
- package/types/observers/mean.d.ts +4 -4
- package/types/observers/median.d.ts +4 -4
- package/types/observers/min.d.ts +4 -4
- package/types/observers/observer.d.ts +13 -13
- package/types/observers/quartile.d.ts +5 -5
- package/types/observers/reduce.d.ts +3 -3
- package/types/observers/variance.d.ts +4 -4
- package/types/utils/generate.d.ts +1 -1
- package/types/utils/pipe.d.ts +41 -41
- package/types-3.4/__package__.d.ts +2 -2
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
import { max } from "./max";
|
|
2
|
-
import { min } from "./min";
|
|
3
|
-
import { mean } from "./mean";
|
|
4
|
-
import { variance } from "./variance";
|
|
5
|
-
import { Observer, Accessor } from "./observer";
|
|
6
|
-
|
|
7
|
-
export type DistributionCallback<T> = (row: T, currentIndex: number) => number;
|
|
8
|
-
|
|
9
|
-
export type DistributionT = {
|
|
10
|
-
min: number,
|
|
11
|
-
mean: number,
|
|
12
|
-
max: number,
|
|
13
|
-
deviation: number | undefined,
|
|
14
|
-
variance: number | undefined
|
|
15
|
-
} | undefined;
|
|
16
|
-
|
|
17
|
-
function _distribution(): Observer<number, DistributionT> {
|
|
18
|
-
const minFO = min();
|
|
19
|
-
const maxFO = max();
|
|
20
|
-
const meanFO = mean();
|
|
21
|
-
const varianceFO = variance();
|
|
22
|
-
|
|
23
|
-
return {
|
|
24
|
-
observe: (value: number, idx: number) => {
|
|
25
|
-
minFO.observe(value, idx);
|
|
26
|
-
maxFO.observe(value, idx);
|
|
27
|
-
meanFO.observe(value, idx);
|
|
28
|
-
varianceFO.observe(value, idx);
|
|
29
|
-
},
|
|
30
|
-
peek: () => {
|
|
31
|
-
const minResult = minFO.peek();
|
|
32
|
-
if (minResult === undefined) return undefined;
|
|
33
|
-
const varianceResult = varianceFO.peek();
|
|
34
|
-
return {
|
|
35
|
-
min: minResult,
|
|
36
|
-
max: maxFO.peek(),
|
|
37
|
-
mean: meanFO.peek(),
|
|
38
|
-
variance: varianceResult,
|
|
39
|
-
deviation: varianceResult !== undefined ? Math.sqrt(varianceResult) : undefined
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export type DistributionAccessor<T> = (row: T, currentIndex: number) => number;
|
|
46
|
-
|
|
47
|
-
export function distribution(): Observer<number, DistributionT>;
|
|
48
|
-
export function distribution<T = any>(callbackFn: DistributionAccessor<T>): Observer<T, DistributionT>;
|
|
49
|
-
export function distribution<T = any>(callbackFn?: DistributionAccessor<T>): Observer<number, DistributionT> | Observer<T, DistributionT> {
|
|
50
|
-
return callbackFn ? Accessor(_distribution, callbackFn) : _distribution();
|
|
51
|
-
}
|
|
1
|
+
import { max } from "./max";
|
|
2
|
+
import { min } from "./min";
|
|
3
|
+
import { mean } from "./mean";
|
|
4
|
+
import { variance } from "./variance";
|
|
5
|
+
import { Observer, Accessor } from "./observer";
|
|
6
|
+
|
|
7
|
+
export type DistributionCallback<T> = (row: T, currentIndex: number) => number;
|
|
8
|
+
|
|
9
|
+
export type DistributionT = {
|
|
10
|
+
min: number,
|
|
11
|
+
mean: number,
|
|
12
|
+
max: number,
|
|
13
|
+
deviation: number | undefined,
|
|
14
|
+
variance: number | undefined
|
|
15
|
+
} | undefined;
|
|
16
|
+
|
|
17
|
+
function _distribution(): Observer<number, DistributionT> {
|
|
18
|
+
const minFO = min();
|
|
19
|
+
const maxFO = max();
|
|
20
|
+
const meanFO = mean();
|
|
21
|
+
const varianceFO = variance();
|
|
22
|
+
|
|
23
|
+
return {
|
|
24
|
+
observe: (value: number, idx: number) => {
|
|
25
|
+
minFO.observe(value, idx);
|
|
26
|
+
maxFO.observe(value, idx);
|
|
27
|
+
meanFO.observe(value, idx);
|
|
28
|
+
varianceFO.observe(value, idx);
|
|
29
|
+
},
|
|
30
|
+
peek: () => {
|
|
31
|
+
const minResult = minFO.peek();
|
|
32
|
+
if (minResult === undefined) return undefined;
|
|
33
|
+
const varianceResult = varianceFO.peek();
|
|
34
|
+
return {
|
|
35
|
+
min: minResult,
|
|
36
|
+
max: maxFO.peek(),
|
|
37
|
+
mean: meanFO.peek(),
|
|
38
|
+
variance: varianceResult,
|
|
39
|
+
deviation: varianceResult !== undefined ? Math.sqrt(varianceResult) : undefined
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export type DistributionAccessor<T> = (row: T, currentIndex: number) => number;
|
|
46
|
+
|
|
47
|
+
export function distribution(): Observer<number, DistributionT>;
|
|
48
|
+
export function distribution<T = any>(callbackFn: DistributionAccessor<T>): Observer<T, DistributionT>;
|
|
49
|
+
export function distribution<T = any>(callbackFn?: DistributionAccessor<T>): Observer<number, DistributionT> | Observer<T, DistributionT> {
|
|
50
|
+
return callbackFn ? Accessor(_distribution, callbackFn) : _distribution();
|
|
51
|
+
}
|
package/src/observers/extent.ts
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import { AccessorT, Observer, Accessor } from "./observer";
|
|
2
|
-
import { max } from "./max";
|
|
3
|
-
import { min } from "./min";
|
|
4
|
-
|
|
5
|
-
function _extent(): Observer<number, [number, number]> {
|
|
6
|
-
const minFO = min();
|
|
7
|
-
const maxFO = max();
|
|
8
|
-
|
|
9
|
-
return {
|
|
10
|
-
observe: (value: number, idx: number) => {
|
|
11
|
-
minFO.observe(value, idx);
|
|
12
|
-
maxFO.observe(value, idx);
|
|
13
|
-
},
|
|
14
|
-
peek: () => [minFO.peek(), maxFO.peek()]
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export type ExtentAccessor<T> = AccessorT<T, number>;
|
|
19
|
-
|
|
20
|
-
export function extent(): Observer<number, [number, number]>;
|
|
21
|
-
export function extent<T = any>(callbackFn: ExtentAccessor<T>): Observer<T, [number, number]>;
|
|
22
|
-
export function extent<T = any>(callbackFn?: ExtentAccessor<T>): Observer<number, [number, number]> | Observer<T, [number, number]> {
|
|
23
|
-
return callbackFn ? Accessor(_extent, callbackFn) : _extent();
|
|
24
|
-
}
|
|
1
|
+
import { AccessorT, Observer, Accessor } from "./observer";
|
|
2
|
+
import { max } from "./max";
|
|
3
|
+
import { min } from "./min";
|
|
4
|
+
|
|
5
|
+
function _extent(): Observer<number, [number, number]> {
|
|
6
|
+
const minFO = min();
|
|
7
|
+
const maxFO = max();
|
|
8
|
+
|
|
9
|
+
return {
|
|
10
|
+
observe: (value: number, idx: number) => {
|
|
11
|
+
minFO.observe(value, idx);
|
|
12
|
+
maxFO.observe(value, idx);
|
|
13
|
+
},
|
|
14
|
+
peek: () => [minFO.peek(), maxFO.peek()]
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export type ExtentAccessor<T> = AccessorT<T, number>;
|
|
19
|
+
|
|
20
|
+
export function extent(): Observer<number, [number, number]>;
|
|
21
|
+
export function extent<T = any>(callbackFn: ExtentAccessor<T>): Observer<T, [number, number]>;
|
|
22
|
+
export function extent<T = any>(callbackFn?: ExtentAccessor<T>): Observer<number, [number, number]> | Observer<T, [number, number]> {
|
|
23
|
+
return callbackFn ? Accessor(_extent, callbackFn) : _extent();
|
|
24
|
+
}
|
package/src/observers/max.ts
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import { Observer, Accessor, AccessorT } from "./observer";
|
|
2
|
-
|
|
3
|
-
function _max(): Observer<number, number> {
|
|
4
|
-
let max: number;
|
|
5
|
-
|
|
6
|
-
return {
|
|
7
|
-
observe: (value: number, idx: number) => {
|
|
8
|
-
if (idx === 0) {
|
|
9
|
-
max = value;
|
|
10
|
-
} else if (max < value) {
|
|
11
|
-
max = value;
|
|
12
|
-
}
|
|
13
|
-
},
|
|
14
|
-
peek: () => max
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export type MaxAccessor<T> = AccessorT<T, number>;
|
|
19
|
-
|
|
20
|
-
export function max(): Observer<number, number>;
|
|
21
|
-
export function max<T = any>(callbackFn: MaxAccessor<T>): Observer<T, number>;
|
|
22
|
-
export function max<T = any>(callbackFn?: MaxAccessor<T>): Observer<number, number> | Observer<T, number> {
|
|
23
|
-
return callbackFn ? Accessor(_max, callbackFn) : _max();
|
|
24
|
-
}
|
|
1
|
+
import { Observer, Accessor, AccessorT } from "./observer";
|
|
2
|
+
|
|
3
|
+
function _max(): Observer<number, number> {
|
|
4
|
+
let max: number;
|
|
5
|
+
|
|
6
|
+
return {
|
|
7
|
+
observe: (value: number, idx: number) => {
|
|
8
|
+
if (idx === 0) {
|
|
9
|
+
max = value;
|
|
10
|
+
} else if (max < value) {
|
|
11
|
+
max = value;
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
peek: () => max
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export type MaxAccessor<T> = AccessorT<T, number>;
|
|
19
|
+
|
|
20
|
+
export function max(): Observer<number, number>;
|
|
21
|
+
export function max<T = any>(callbackFn: MaxAccessor<T>): Observer<T, number>;
|
|
22
|
+
export function max<T = any>(callbackFn?: MaxAccessor<T>): Observer<number, number> | Observer<T, number> {
|
|
23
|
+
return callbackFn ? Accessor(_max, callbackFn) : _max();
|
|
24
|
+
}
|
package/src/observers/mean.ts
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import { Observer, Accessor } from "./observer";
|
|
2
|
-
|
|
3
|
-
function _mean(): Observer<number, number> {
|
|
4
|
-
let total: number;
|
|
5
|
-
let count: number;
|
|
6
|
-
|
|
7
|
-
return {
|
|
8
|
-
observe: (value: number, idx: number) => {
|
|
9
|
-
if (idx === 0) {
|
|
10
|
-
total = value;
|
|
11
|
-
} else {
|
|
12
|
-
total += value;
|
|
13
|
-
}
|
|
14
|
-
count = idx;
|
|
15
|
-
},
|
|
16
|
-
peek: () => total / (count + 1)
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export type MeanAccessor<T> = (row: T, currentIndex: number) => number;
|
|
21
|
-
|
|
22
|
-
export function mean(): Observer<number, number>;
|
|
23
|
-
export function mean<T = any>(callbackFn: MeanAccessor<T>): Observer<T, number>;
|
|
24
|
-
export function mean<T = any>(callbackFn?: MeanAccessor<T>): Observer<number, number> | Observer<T, number> {
|
|
25
|
-
return callbackFn ? Accessor(_mean, callbackFn) : _mean();
|
|
26
|
-
}
|
|
1
|
+
import { Observer, Accessor } from "./observer";
|
|
2
|
+
|
|
3
|
+
function _mean(): Observer<number, number> {
|
|
4
|
+
let total: number;
|
|
5
|
+
let count: number;
|
|
6
|
+
|
|
7
|
+
return {
|
|
8
|
+
observe: (value: number, idx: number) => {
|
|
9
|
+
if (idx === 0) {
|
|
10
|
+
total = value;
|
|
11
|
+
} else {
|
|
12
|
+
total += value;
|
|
13
|
+
}
|
|
14
|
+
count = idx;
|
|
15
|
+
},
|
|
16
|
+
peek: () => total / (count + 1)
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export type MeanAccessor<T> = (row: T, currentIndex: number) => number;
|
|
21
|
+
|
|
22
|
+
export function mean(): Observer<number, number>;
|
|
23
|
+
export function mean<T = any>(callbackFn: MeanAccessor<T>): Observer<T, number>;
|
|
24
|
+
export function mean<T = any>(callbackFn?: MeanAccessor<T>): Observer<number, number> | Observer<T, number> {
|
|
25
|
+
return callbackFn ? Accessor(_mean, callbackFn) : _mean();
|
|
26
|
+
}
|
package/src/observers/median.ts
CHANGED
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
import { AccessorT, Observer, Accessor } from "./observer";
|
|
2
|
-
|
|
3
|
-
function _median(): Observer<number, number> {
|
|
4
|
-
let values: number[];
|
|
5
|
-
|
|
6
|
-
return {
|
|
7
|
-
observe: (value: number, idx: number) => {
|
|
8
|
-
if (idx === 0) {
|
|
9
|
-
values = [];
|
|
10
|
-
}
|
|
11
|
-
values.push(value);
|
|
12
|
-
},
|
|
13
|
-
peek: () => {
|
|
14
|
-
const sorted = values.sort((l, r) => l - r);
|
|
15
|
-
const mid = sorted.length / 2;
|
|
16
|
-
if (sorted.length % 2 === 0) {
|
|
17
|
-
return (sorted[mid - 1] + sorted[mid]) / 2;
|
|
18
|
-
} else {
|
|
19
|
-
return sorted[Math.floor(mid)];
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export type MedianAccessor<T> = AccessorT<T, number>;
|
|
26
|
-
|
|
27
|
-
export function median(): Observer<number, number>;
|
|
28
|
-
export function median<T = any>(callbackFn: MedianAccessor<T>): Observer<T, number>;
|
|
29
|
-
export function median<T = any>(callbackFn?: MedianAccessor<T>): Observer<number, number> | Observer<T, number> {
|
|
30
|
-
return callbackFn ? Accessor(_median, callbackFn) : _median();
|
|
1
|
+
import { AccessorT, Observer, Accessor } from "./observer";
|
|
2
|
+
|
|
3
|
+
function _median(): Observer<number, number> {
|
|
4
|
+
let values: number[];
|
|
5
|
+
|
|
6
|
+
return {
|
|
7
|
+
observe: (value: number, idx: number) => {
|
|
8
|
+
if (idx === 0) {
|
|
9
|
+
values = [];
|
|
10
|
+
}
|
|
11
|
+
values.push(value);
|
|
12
|
+
},
|
|
13
|
+
peek: () => {
|
|
14
|
+
const sorted = values.sort((l, r) => l - r);
|
|
15
|
+
const mid = sorted.length / 2;
|
|
16
|
+
if (sorted.length % 2 === 0) {
|
|
17
|
+
return (sorted[mid - 1] + sorted[mid]) / 2;
|
|
18
|
+
} else {
|
|
19
|
+
return sorted[Math.floor(mid)];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type MedianAccessor<T> = AccessorT<T, number>;
|
|
26
|
+
|
|
27
|
+
export function median(): Observer<number, number>;
|
|
28
|
+
export function median<T = any>(callbackFn: MedianAccessor<T>): Observer<T, number>;
|
|
29
|
+
export function median<T = any>(callbackFn?: MedianAccessor<T>): Observer<number, number> | Observer<T, number> {
|
|
30
|
+
return callbackFn ? Accessor(_median, callbackFn) : _median();
|
|
31
31
|
}
|
package/src/observers/min.ts
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import { Observer, Accessor, AccessorT } from "./observer";
|
|
2
|
-
|
|
3
|
-
function _min(): Observer<number, number> {
|
|
4
|
-
let min: number;
|
|
5
|
-
|
|
6
|
-
return {
|
|
7
|
-
observe: (value: number, idx: number) => {
|
|
8
|
-
if (idx === 0) {
|
|
9
|
-
min = value;
|
|
10
|
-
} else if (min > value) {
|
|
11
|
-
min = value;
|
|
12
|
-
}
|
|
13
|
-
},
|
|
14
|
-
peek: () => min
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export type MinAccessor<T> = AccessorT<T, number>;
|
|
19
|
-
|
|
20
|
-
export function min(): Observer<number, number>;
|
|
21
|
-
export function min<T = any>(callbackFn: MinAccessor<T>): Observer<T, number>;
|
|
22
|
-
export function min<T = any>(callbackFn?: MinAccessor<T>): Observer<number, number> | Observer<T, number> {
|
|
23
|
-
return callbackFn ? Accessor(_min, callbackFn) : _min();
|
|
24
|
-
}
|
|
1
|
+
import { Observer, Accessor, AccessorT } from "./observer";
|
|
2
|
+
|
|
3
|
+
function _min(): Observer<number, number> {
|
|
4
|
+
let min: number;
|
|
5
|
+
|
|
6
|
+
return {
|
|
7
|
+
observe: (value: number, idx: number) => {
|
|
8
|
+
if (idx === 0) {
|
|
9
|
+
min = value;
|
|
10
|
+
} else if (min > value) {
|
|
11
|
+
min = value;
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
peek: () => min
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export type MinAccessor<T> = AccessorT<T, number>;
|
|
19
|
+
|
|
20
|
+
export function min(): Observer<number, number>;
|
|
21
|
+
export function min<T = any>(callbackFn: MinAccessor<T>): Observer<T, number>;
|
|
22
|
+
export function min<T = any>(callbackFn?: MinAccessor<T>): Observer<number, number> | Observer<T, number> {
|
|
23
|
+
return callbackFn ? Accessor(_min, callbackFn) : _min();
|
|
24
|
+
}
|
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
import { Source } from "../activities/activity";
|
|
2
|
-
import { each } from "../activities/each";
|
|
3
|
-
|
|
4
|
-
export type AccessorT<T, U> = (row: T, currentIndex: number) => U;
|
|
5
|
-
|
|
6
|
-
export interface ObserverFactory<T, U> {
|
|
7
|
-
(): Observer<T, U>;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export interface Observer<T, U> {
|
|
11
|
-
observe(r: T, idx: number): void;
|
|
12
|
-
peek(): U;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function Accessor<T = any, U = any, V = any>(fof: ObserverFactory<V, U>, accesor: AccessorT<T, V>): Observer<T, U> {
|
|
16
|
-
const s = fof();
|
|
17
|
-
|
|
18
|
-
return {
|
|
19
|
-
observe: (_: T, i: number) => {
|
|
20
|
-
s.observe(accesor(_, i), i);
|
|
21
|
-
},
|
|
22
|
-
peek: s.peek
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// This is an pass through activity so a FlowObserver can be inserted into a pipeline ---
|
|
27
|
-
export function sensor<T, U = any>(s: Observer<T, U>) {
|
|
28
|
-
return each((r, i) => s.observe(r, i));
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// This converts a FlowObserver to an Activity ---
|
|
32
|
-
export function activity<T, U>(s: Observer<T, U>) {
|
|
33
|
-
return function* (source: Source<T>) {
|
|
34
|
-
let i = -1;
|
|
35
|
-
for (const row of source) {
|
|
36
|
-
s.observe(row, ++i);
|
|
37
|
-
}
|
|
38
|
-
yield s.peek();
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// This converts a FlowObserver to an ScalarActivity ---
|
|
43
|
-
export function scalar<T = any, U = any>(s: Observer<T, U>) {
|
|
44
|
-
return function (source: Source<T>) {
|
|
45
|
-
let i = -1;
|
|
46
|
-
for (const row of source) {
|
|
47
|
-
s.observe(row, ++i);
|
|
48
|
-
}
|
|
49
|
-
return s.peek();
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
|
|
1
|
+
import { Source } from "../activities/activity";
|
|
2
|
+
import { each } from "../activities/each";
|
|
3
|
+
|
|
4
|
+
export type AccessorT<T, U> = (row: T, currentIndex: number) => U;
|
|
5
|
+
|
|
6
|
+
export interface ObserverFactory<T, U> {
|
|
7
|
+
(): Observer<T, U>;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface Observer<T, U> {
|
|
11
|
+
observe(r: T, idx: number): void;
|
|
12
|
+
peek(): U;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function Accessor<T = any, U = any, V = any>(fof: ObserverFactory<V, U>, accesor: AccessorT<T, V>): Observer<T, U> {
|
|
16
|
+
const s = fof();
|
|
17
|
+
|
|
18
|
+
return {
|
|
19
|
+
observe: (_: T, i: number) => {
|
|
20
|
+
s.observe(accesor(_, i), i);
|
|
21
|
+
},
|
|
22
|
+
peek: s.peek
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// This is an pass through activity so a FlowObserver can be inserted into a pipeline ---
|
|
27
|
+
export function sensor<T, U = any>(s: Observer<T, U>) {
|
|
28
|
+
return each((r, i) => s.observe(r, i));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// This converts a FlowObserver to an Activity ---
|
|
32
|
+
export function activity<T, U>(s: Observer<T, U>) {
|
|
33
|
+
return function* (source: Source<T>) {
|
|
34
|
+
let i = -1;
|
|
35
|
+
for (const row of source) {
|
|
36
|
+
s.observe(row, ++i);
|
|
37
|
+
}
|
|
38
|
+
yield s.peek();
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// This converts a FlowObserver to an ScalarActivity ---
|
|
43
|
+
export function scalar<T = any, U = any>(s: Observer<T, U>) {
|
|
44
|
+
return function (source: Source<T>) {
|
|
45
|
+
let i = -1;
|
|
46
|
+
for (const row of source) {
|
|
47
|
+
s.observe(row, ++i);
|
|
48
|
+
}
|
|
49
|
+
return s.peek();
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
import { median } from "./median";
|
|
2
|
-
import { AccessorT, Observer, Accessor, scalar } from "./observer";
|
|
3
|
-
|
|
4
|
-
export type QuartileAccessor<T> = AccessorT<T, number>;
|
|
5
|
-
|
|
6
|
-
export type QuartileT = [number, number, number, number, number] | undefined;
|
|
7
|
-
|
|
8
|
-
function _quartile(): Observer<number, QuartileT> {
|
|
9
|
-
let values: number[];
|
|
10
|
-
|
|
11
|
-
return {
|
|
12
|
-
observe: (value: number, idx: number) => {
|
|
13
|
-
if (idx === 0) {
|
|
14
|
-
values = [];
|
|
15
|
-
}
|
|
16
|
-
values.push(value);
|
|
17
|
-
},
|
|
18
|
-
peek: () => {
|
|
19
|
-
const sorted = values.sort((l, r) => l - r);
|
|
20
|
-
const mid = sorted.length / 2;
|
|
21
|
-
let medianVal: number;
|
|
22
|
-
let lower: number[];
|
|
23
|
-
let upper: number[];
|
|
24
|
-
if (sorted.length < 2) {
|
|
25
|
-
return undefined;
|
|
26
|
-
} else if (sorted.length % 2 === 0) {
|
|
27
|
-
medianVal = (sorted[mid - 1] + sorted[mid]) / 2;
|
|
28
|
-
lower = sorted.slice(0, mid);
|
|
29
|
-
upper = sorted.slice(mid);
|
|
30
|
-
} else {
|
|
31
|
-
medianVal = sorted[Math.floor(mid)];
|
|
32
|
-
lower = sorted.slice(0, Math.floor(mid));
|
|
33
|
-
upper = sorted.slice(Math.ceil(mid));
|
|
34
|
-
}
|
|
35
|
-
return [sorted[0], scalar(median())(lower)!, medianVal, scalar(median())(upper)!, sorted[sorted.length - 1]];
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export function quartile(): Observer<number, QuartileT>;
|
|
41
|
-
export function quartile<T = any>(callbackFn: QuartileAccessor<T>): Observer<T, QuartileT>;
|
|
42
|
-
export function quartile<T = any>(callbackFn?: QuartileAccessor<T>): Observer<number, QuartileT> | Observer<T, QuartileT> {
|
|
43
|
-
return callbackFn ? Accessor(_quartile, callbackFn) : _quartile();
|
|
1
|
+
import { median } from "./median";
|
|
2
|
+
import { AccessorT, Observer, Accessor, scalar } from "./observer";
|
|
3
|
+
|
|
4
|
+
export type QuartileAccessor<T> = AccessorT<T, number>;
|
|
5
|
+
|
|
6
|
+
export type QuartileT = [number, number, number, number, number] | undefined;
|
|
7
|
+
|
|
8
|
+
function _quartile(): Observer<number, QuartileT> {
|
|
9
|
+
let values: number[];
|
|
10
|
+
|
|
11
|
+
return {
|
|
12
|
+
observe: (value: number, idx: number) => {
|
|
13
|
+
if (idx === 0) {
|
|
14
|
+
values = [];
|
|
15
|
+
}
|
|
16
|
+
values.push(value);
|
|
17
|
+
},
|
|
18
|
+
peek: () => {
|
|
19
|
+
const sorted = values.sort((l, r) => l - r);
|
|
20
|
+
const mid = sorted.length / 2;
|
|
21
|
+
let medianVal: number;
|
|
22
|
+
let lower: number[];
|
|
23
|
+
let upper: number[];
|
|
24
|
+
if (sorted.length < 2) {
|
|
25
|
+
return undefined;
|
|
26
|
+
} else if (sorted.length % 2 === 0) {
|
|
27
|
+
medianVal = (sorted[mid - 1] + sorted[mid]) / 2;
|
|
28
|
+
lower = sorted.slice(0, mid);
|
|
29
|
+
upper = sorted.slice(mid);
|
|
30
|
+
} else {
|
|
31
|
+
medianVal = sorted[Math.floor(mid)];
|
|
32
|
+
lower = sorted.slice(0, Math.floor(mid));
|
|
33
|
+
upper = sorted.slice(Math.ceil(mid));
|
|
34
|
+
}
|
|
35
|
+
return [sorted[0], scalar(median())(lower)!, medianVal, scalar(median())(upper)!, sorted[sorted.length - 1]];
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function quartile(): Observer<number, QuartileT>;
|
|
41
|
+
export function quartile<T = any>(callbackFn: QuartileAccessor<T>): Observer<T, QuartileT>;
|
|
42
|
+
export function quartile<T = any>(callbackFn?: QuartileAccessor<T>): Observer<number, QuartileT> | Observer<T, QuartileT> {
|
|
43
|
+
return callbackFn ? Accessor(_quartile, callbackFn) : _quartile();
|
|
44
44
|
}
|
package/src/observers/reduce.ts
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import { Observer } from "./observer";
|
|
2
|
-
|
|
3
|
-
export type ReduceCallback<T, U> = (previousValue: U, currentValue: T, currentIndex: number) => U;
|
|
4
|
-
|
|
5
|
-
function _reduce<T, U>(callback: ReduceCallback<T, U>, initialValue?: U): Observer<T, U> {
|
|
6
|
-
let reduced: U;
|
|
7
|
-
|
|
8
|
-
return {
|
|
9
|
-
observe: (value: T, idx: number) => {
|
|
10
|
-
if (idx === 0) {
|
|
11
|
-
reduced = initialValue === undefined ? (value as unknown as U) : callback(initialValue, value, idx);
|
|
12
|
-
} else {
|
|
13
|
-
reduced = callback(reduced, value, idx);
|
|
14
|
-
}
|
|
15
|
-
},
|
|
16
|
-
peek: () => reduced
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function reduce<T = any, U = any>(callbackFn: ReduceCallback<T, U>, initialValue?: U): Observer<T, U> {
|
|
21
|
-
return _reduce(callbackFn, initialValue);
|
|
22
|
-
}
|
|
1
|
+
import { Observer } from "./observer";
|
|
2
|
+
|
|
3
|
+
export type ReduceCallback<T, U> = (previousValue: U, currentValue: T, currentIndex: number) => U;
|
|
4
|
+
|
|
5
|
+
function _reduce<T, U>(callback: ReduceCallback<T, U>, initialValue?: U): Observer<T, U> {
|
|
6
|
+
let reduced: U;
|
|
7
|
+
|
|
8
|
+
return {
|
|
9
|
+
observe: (value: T, idx: number) => {
|
|
10
|
+
if (idx === 0) {
|
|
11
|
+
reduced = initialValue === undefined ? (value as unknown as U) : callback(initialValue, value, idx);
|
|
12
|
+
} else {
|
|
13
|
+
reduced = callback(reduced, value, idx);
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
peek: () => reduced
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function reduce<T = any, U = any>(callbackFn: ReduceCallback<T, U>, initialValue?: U): Observer<T, U> {
|
|
21
|
+
return _reduce(callbackFn, initialValue);
|
|
22
|
+
}
|