@hpcc-js/dataflow 9.1.0 → 9.2.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.
Files changed (67) hide show
  1. package/LICENSE +43 -43
  2. package/README.md +530 -530
  3. package/dist/index.js.map +1 -1
  4. package/dist/index.min.js +1 -1
  5. package/dist/index.min.js.map +1 -1
  6. package/lib-es6/__package__.js +2 -2
  7. package/package.json +3 -3
  8. package/src/__package__.ts +3 -3
  9. package/src/__tests__/chain.ts +85 -85
  10. package/src/__tests__/concat.ts +18 -18
  11. package/src/__tests__/count.ts +25 -25
  12. package/src/__tests__/data.ts +64 -64
  13. package/src/__tests__/deviation.ts +14 -14
  14. package/src/__tests__/distribution.ts +21 -21
  15. package/src/__tests__/each.ts +13 -13
  16. package/src/__tests__/entries.ts +14 -14
  17. package/src/__tests__/extent.ts +25 -25
  18. package/src/__tests__/filter.ts +16 -16
  19. package/src/__tests__/first.ts +15 -15
  20. package/src/__tests__/generate.ts +9 -9
  21. package/src/__tests__/group.ts +19 -19
  22. package/src/__tests__/histogram.ts +47 -47
  23. package/src/__tests__/index.ts +27 -27
  24. package/src/__tests__/join.ts +20 -20
  25. package/src/__tests__/map.ts +16 -16
  26. package/src/__tests__/max.ts +42 -42
  27. package/src/__tests__/mean.ts +11 -11
  28. package/src/__tests__/median.ts +14 -14
  29. package/src/__tests__/min.ts +42 -42
  30. package/src/__tests__/normalize.ts +14 -14
  31. package/src/__tests__/quartile.ts +14 -14
  32. package/src/__tests__/readme.ts +113 -113
  33. package/src/__tests__/reduce.ts +17 -17
  34. package/src/__tests__/skip.ts +15 -15
  35. package/src/__tests__/sort.ts +21 -21
  36. package/src/__tests__/variance.ts +14 -14
  37. package/src/activities/activity.ts +8 -8
  38. package/src/activities/concat.ts +14 -14
  39. package/src/activities/each.ts +19 -19
  40. package/src/activities/entries.ts +17 -17
  41. package/src/activities/filter.ts +20 -20
  42. package/src/activities/first.ts +20 -20
  43. package/src/activities/group.ts +27 -27
  44. package/src/activities/histogram.ts +78 -78
  45. package/src/activities/join.ts +19 -19
  46. package/src/activities/map.ts +18 -18
  47. package/src/activities/normalize.ts +21 -21
  48. package/src/activities/skip.ts +18 -18
  49. package/src/activities/sort.ts +16 -16
  50. package/src/index.ts +27 -27
  51. package/src/observers/count.ts +15 -15
  52. package/src/observers/deviation.ts +24 -24
  53. package/src/observers/distribution.ts +51 -51
  54. package/src/observers/extent.ts +24 -24
  55. package/src/observers/max.ts +24 -24
  56. package/src/observers/mean.ts +26 -26
  57. package/src/observers/median.ts +30 -30
  58. package/src/observers/min.ts +24 -24
  59. package/src/observers/observer.ts +52 -52
  60. package/src/observers/quartile.ts +43 -43
  61. package/src/observers/reduce.ts +22 -22
  62. package/src/observers/variance.ts +29 -29
  63. package/src/utils/generate.ts +6 -6
  64. package/src/utils/pipe.ts +74 -74
  65. package/types/__package__.d.ts +2 -2
  66. package/types/observers/observer.d.ts.map +1 -1
  67. package/types-3.4/__package__.d.ts +2 -2
@@ -1,78 +1,78 @@
1
- import { IterableActivity, Source, isSource } from "./activity";
2
- import { extent } from "../observers/extent";
3
- import { scalar } from "../observers/observer";
4
-
5
- export type HistogramFn<T> = (row: T) => number;
6
- export type HistogramRow<T> = { from: number, to: number, value: T[] };
7
- export type OptionA = { buckets: number };
8
- export type OptionB = { min: number, range: number };
9
- export type Options = OptionA | OptionB;
10
-
11
- function isOptionA(_: Options): _ is OptionA {
12
- return (_ as OptionA).buckets !== undefined;
13
- }
14
-
15
- function histogramGen<T = any>(callbackFn: HistogramFn<T>, options: Options): IterableActivity<T, HistogramRow<T>> {
16
- return function* (_source: Source<T>) {
17
- let min: number;
18
- let bucketSize: number;
19
-
20
- let source;
21
- if (isOptionA(options)) {
22
- source = Array.isArray(_source) ? _source : [..._source];
23
- const minMax = scalar(extent(callbackFn))(source);
24
- if (minMax === undefined) {
25
- return undefined;
26
- }
27
- min = minMax[0];
28
- const max = minMax[1];
29
- const buckets = options.buckets;
30
- bucketSize = (max - min) / buckets;
31
- } else {
32
- source = _source;
33
- min = options.min;
34
- bucketSize = options.range;
35
- }
36
-
37
- const histogram: { [key: number]: T[] } = {};
38
-
39
- let maxBucketID = 0;
40
- for (const row of source) {
41
- const value = callbackFn(row);
42
- const bucketID = Math.floor((value - min) / bucketSize);
43
- if (maxBucketID < bucketID) {
44
- maxBucketID = bucketID;
45
- }
46
- if (histogram[bucketID] === undefined) {
47
- histogram[bucketID] = [];
48
- }
49
- histogram[bucketID].push(row);
50
- }
51
-
52
- const lastBucket = histogram[maxBucketID];
53
- const from = min + maxBucketID * bucketSize;
54
-
55
- for (let i = 0; i <= maxBucketID; ++i) {
56
- // If all items in the last bucket match the "to" of the previous bucket, put them in there...
57
- if (i === maxBucketID - 1 && lastBucket.every(row => from === callbackFn(row))) {
58
- yield {
59
- from: min + i * bucketSize,
60
- to: min + (i + 1) * bucketSize,
61
- value: [...(histogram[i] || []), ...lastBucket]
62
- };
63
- break;
64
- }
65
- yield {
66
- from: min + i * bucketSize,
67
- to: min + (i + 1) * bucketSize,
68
- value: histogram[i] || []
69
- };
70
- }
71
- };
72
- }
73
-
74
- export function histogram<T>(histogramByFn: HistogramFn<T>, options: Options): IterableActivity<T, HistogramRow<T>>;
75
- export function histogram<T>(source: Source<T>, histogramByFn: HistogramFn<T>, options: Options): IterableIterator<HistogramRow<T>>;
76
- export function histogram<T>(s_or_hf: Source<T> | HistogramFn<T>, hf_or_b: HistogramFn<T> | Options, options?: Options): IterableActivity<T, HistogramRow<T>> | IterableIterator<HistogramRow<T>> {
77
- return isSource(s_or_hf) ? histogramGen<T>(hf_or_b as HistogramFn<T>, options!)(s_or_hf) : histogramGen<T>(s_or_hf as HistogramFn<T>, hf_or_b as Options);
78
- }
1
+ import { IterableActivity, Source, isSource } from "./activity";
2
+ import { extent } from "../observers/extent";
3
+ import { scalar } from "../observers/observer";
4
+
5
+ export type HistogramFn<T> = (row: T) => number;
6
+ export type HistogramRow<T> = { from: number, to: number, value: T[] };
7
+ export type OptionA = { buckets: number };
8
+ export type OptionB = { min: number, range: number };
9
+ export type Options = OptionA | OptionB;
10
+
11
+ function isOptionA(_: Options): _ is OptionA {
12
+ return (_ as OptionA).buckets !== undefined;
13
+ }
14
+
15
+ function histogramGen<T = any>(callbackFn: HistogramFn<T>, options: Options): IterableActivity<T, HistogramRow<T>> {
16
+ return function* (_source: Source<T>) {
17
+ let min: number;
18
+ let bucketSize: number;
19
+
20
+ let source;
21
+ if (isOptionA(options)) {
22
+ source = Array.isArray(_source) ? _source : [..._source];
23
+ const minMax = scalar(extent(callbackFn))(source);
24
+ if (minMax === undefined) {
25
+ return undefined;
26
+ }
27
+ min = minMax[0];
28
+ const max = minMax[1];
29
+ const buckets = options.buckets;
30
+ bucketSize = (max - min) / buckets;
31
+ } else {
32
+ source = _source;
33
+ min = options.min;
34
+ bucketSize = options.range;
35
+ }
36
+
37
+ const histogram: { [key: number]: T[] } = {};
38
+
39
+ let maxBucketID = 0;
40
+ for (const row of source) {
41
+ const value = callbackFn(row);
42
+ const bucketID = Math.floor((value - min) / bucketSize);
43
+ if (maxBucketID < bucketID) {
44
+ maxBucketID = bucketID;
45
+ }
46
+ if (histogram[bucketID] === undefined) {
47
+ histogram[bucketID] = [];
48
+ }
49
+ histogram[bucketID].push(row);
50
+ }
51
+
52
+ const lastBucket = histogram[maxBucketID];
53
+ const from = min + maxBucketID * bucketSize;
54
+
55
+ for (let i = 0; i <= maxBucketID; ++i) {
56
+ // If all items in the last bucket match the "to" of the previous bucket, put them in there...
57
+ if (i === maxBucketID - 1 && lastBucket.every(row => from === callbackFn(row))) {
58
+ yield {
59
+ from: min + i * bucketSize,
60
+ to: min + (i + 1) * bucketSize,
61
+ value: [...(histogram[i] || []), ...lastBucket]
62
+ };
63
+ break;
64
+ }
65
+ yield {
66
+ from: min + i * bucketSize,
67
+ to: min + (i + 1) * bucketSize,
68
+ value: histogram[i] || []
69
+ };
70
+ }
71
+ };
72
+ }
73
+
74
+ export function histogram<T>(histogramByFn: HistogramFn<T>, options: Options): IterableActivity<T, HistogramRow<T>>;
75
+ export function histogram<T>(source: Source<T>, histogramByFn: HistogramFn<T>, options: Options): IterableIterator<HistogramRow<T>>;
76
+ export function histogram<T>(s_or_hf: Source<T> | HistogramFn<T>, hf_or_b: HistogramFn<T> | Options, options?: Options): IterableActivity<T, HistogramRow<T>> | IterableIterator<HistogramRow<T>> {
77
+ return isSource(s_or_hf) ? histogramGen<T>(hf_or_b as HistogramFn<T>, options!)(s_or_hf) : histogramGen<T>(s_or_hf as HistogramFn<T>, hf_or_b as Options);
78
+ }
@@ -1,19 +1,19 @@
1
- import { IterableActivity, Source, isSource } from "./activity";
2
-
3
- export type JoinCallback<T, U, V> = (rowT: T, rowU: U, index: number) => V;
4
-
5
- function joinGen<T = any, U = any, V = any>(_sourceU: Source<U>, callbackFn: JoinCallback<T, U, V>): IterableActivity<T, V> {
6
- const sourceB = Array.isArray(_sourceU) ? _sourceU[Symbol.iterator]() : _sourceU;
7
- return function* (sourceT: Source<T>) {
8
- let i = -1;
9
- for (const item of sourceT) {
10
- yield callbackFn(item, sourceB.next().value, ++i);
11
- }
12
- };
13
- }
14
-
15
- export function join<T, U, V>(sourceU: Source<U>, callbackFn: JoinCallback<T, U, V>): IterableActivity<T, V>;
16
- export function join<T, U, V>(sourceU: Source<U>, callbackFn: JoinCallback<T, U, V>): IterableIterator<V>;
17
- export function join<T, U, V>(sT_or_sU: Source<T> | Source<U>, sU_or_cb: Source<U> | JoinCallback<T, U, V>, callbackFn?: JoinCallback<T, U, V>): IterableActivity<T, V> | IterableIterator<V> {
18
- return isSource(sU_or_cb) ? joinGen(sU_or_cb, callbackFn!)(sT_or_sU as Source<T>) : joinGen(sT_or_sU as Source<U>, sU_or_cb);
19
- }
1
+ import { IterableActivity, Source, isSource } from "./activity";
2
+
3
+ export type JoinCallback<T, U, V> = (rowT: T, rowU: U, index: number) => V;
4
+
5
+ function joinGen<T = any, U = any, V = any>(_sourceU: Source<U>, callbackFn: JoinCallback<T, U, V>): IterableActivity<T, V> {
6
+ const sourceB = Array.isArray(_sourceU) ? _sourceU[Symbol.iterator]() : _sourceU;
7
+ return function* (sourceT: Source<T>) {
8
+ let i = -1;
9
+ for (const item of sourceT) {
10
+ yield callbackFn(item, sourceB.next().value, ++i);
11
+ }
12
+ };
13
+ }
14
+
15
+ export function join<T, U, V>(sourceU: Source<U>, callbackFn: JoinCallback<T, U, V>): IterableActivity<T, V>;
16
+ export function join<T, U, V>(sourceU: Source<U>, callbackFn: JoinCallback<T, U, V>): IterableIterator<V>;
17
+ export function join<T, U, V>(sT_or_sU: Source<T> | Source<U>, sU_or_cb: Source<U> | JoinCallback<T, U, V>, callbackFn?: JoinCallback<T, U, V>): IterableActivity<T, V> | IterableIterator<V> {
18
+ return isSource(sU_or_cb) ? joinGen(sU_or_cb, callbackFn!)(sT_or_sU as Source<T>) : joinGen(sT_or_sU as Source<U>, sU_or_cb);
19
+ }
@@ -1,18 +1,18 @@
1
- import { IterableActivity, Source, isSource } from "./activity";
2
-
3
- export type MapCallback<T, U> = (row: T, index: number) => U;
4
-
5
- function mapGen<T = any, U = any>(callbackFn: MapCallback<T, U>): IterableActivity<T, U> {
6
- return function* (source: Source<T>) {
7
- let i = -1;
8
- for (const item of source) {
9
- yield callbackFn(item, ++i);
10
- }
11
- };
12
- }
13
-
14
- export function map<T, U>(callbackFn: MapCallback<T, U>): IterableActivity<T, U>;
15
- export function map<T, U>(source: Source<T>, callbackFn: MapCallback<T, U>): IterableIterator<U>;
16
- export function map<T, U>(s_or_cb: Source<T> | MapCallback<T, U>, callbackFn?: MapCallback<T, U>): IterableActivity<T, U> | IterableIterator<U> {
17
- return isSource(s_or_cb) ? mapGen(callbackFn!)(s_or_cb) : mapGen(s_or_cb);
18
- }
1
+ import { IterableActivity, Source, isSource } from "./activity";
2
+
3
+ export type MapCallback<T, U> = (row: T, index: number) => U;
4
+
5
+ function mapGen<T = any, U = any>(callbackFn: MapCallback<T, U>): IterableActivity<T, U> {
6
+ return function* (source: Source<T>) {
7
+ let i = -1;
8
+ for (const item of source) {
9
+ yield callbackFn(item, ++i);
10
+ }
11
+ };
12
+ }
13
+
14
+ export function map<T, U>(callbackFn: MapCallback<T, U>): IterableActivity<T, U>;
15
+ export function map<T, U>(source: Source<T>, callbackFn: MapCallback<T, U>): IterableIterator<U>;
16
+ export function map<T, U>(s_or_cb: Source<T> | MapCallback<T, U>, callbackFn?: MapCallback<T, U>): IterableActivity<T, U> | IterableIterator<U> {
17
+ return isSource(s_or_cb) ? mapGen(callbackFn!)(s_or_cb) : mapGen(s_or_cb);
18
+ }
@@ -1,21 +1,21 @@
1
- import { Source, IterableActivity, isSource } from "./activity";
2
- import { extent } from "../observers/extent";
3
- import { scalar } from "../observers/observer";
4
- import { map } from "./map";
5
-
6
- function normalizeGen(): IterableActivity<number> {
7
- const calcExtent = scalar(extent());
8
- return function* (_source: Source<number>) {
9
- const source = Array.isArray(_source) ? _source : [..._source];
10
- const range = calcExtent(source);
11
- const divisor = (range[1] - range[0]) || 1;
12
- const normalizeMap = map((row: number) => (row - range[0]) / divisor);
13
- return yield* normalizeMap(source);
14
- };
15
- }
16
-
17
- export function normalize(): IterableActivity<number>;
18
- export function normalize(source: Source<number>): IterableIterator<number>;
19
- export function normalize(s_or_undef?: Source<number>): IterableActivity<number> | IterableIterator<number> {
20
- return isSource(s_or_undef) ? normalizeGen()(s_or_undef) : normalizeGen();
21
- }
1
+ import { Source, IterableActivity, isSource } from "./activity";
2
+ import { extent } from "../observers/extent";
3
+ import { scalar } from "../observers/observer";
4
+ import { map } from "./map";
5
+
6
+ function normalizeGen(): IterableActivity<number> {
7
+ const calcExtent = scalar(extent());
8
+ return function* (_source: Source<number>) {
9
+ const source = Array.isArray(_source) ? _source : [..._source];
10
+ const range = calcExtent(source);
11
+ const divisor = (range[1] - range[0]) || 1;
12
+ const normalizeMap = map((row: number) => (row - range[0]) / divisor);
13
+ return yield* normalizeMap(source);
14
+ };
15
+ }
16
+
17
+ export function normalize(): IterableActivity<number>;
18
+ export function normalize(source: Source<number>): IterableIterator<number>;
19
+ export function normalize(s_or_undef?: Source<number>): IterableActivity<number> | IterableIterator<number> {
20
+ return isSource(s_or_undef) ? normalizeGen()(s_or_undef) : normalizeGen();
21
+ }
@@ -1,18 +1,18 @@
1
- import { IterableActivity, Source, isSource } from "./activity";
2
-
3
- function skipGen<T = any>(n: number): IterableActivity<T, T> {
4
- return function* (source: Source<T>) {
5
- let i = -1;
6
- for (const item of source) {
7
- if (++i >= n) {
8
- yield item;
9
- }
10
- }
11
- };
12
- }
13
-
14
- export function skip<T = any>(n: number): IterableActivity<T, T>;
15
- export function skip<T>(source: Source<T>, n: number): IterableIterator<T>;
16
- export function skip<T = any>(s_or_n: Source<T> | number, n?: number): IterableActivity<T, T> | IterableIterator<T> {
17
- return isSource(s_or_n) ? skipGen<T>(n!)(s_or_n) : skipGen<T>(s_or_n);
18
- }
1
+ import { IterableActivity, Source, isSource } from "./activity";
2
+
3
+ function skipGen<T = any>(n: number): IterableActivity<T, T> {
4
+ return function* (source: Source<T>) {
5
+ let i = -1;
6
+ for (const item of source) {
7
+ if (++i >= n) {
8
+ yield item;
9
+ }
10
+ }
11
+ };
12
+ }
13
+
14
+ export function skip<T = any>(n: number): IterableActivity<T, T>;
15
+ export function skip<T>(source: Source<T>, n: number): IterableIterator<T>;
16
+ export function skip<T = any>(s_or_n: Source<T> | number, n?: number): IterableActivity<T, T> | IterableIterator<T> {
17
+ return isSource(s_or_n) ? skipGen<T>(n!)(s_or_n) : skipGen<T>(s_or_n);
18
+ }
@@ -1,16 +1,16 @@
1
- import { IterableActivity, Source, isSource } from "./activity";
2
-
3
- export type SortCallback<T> = (a: T, b: T) => number;
4
-
5
- function sortGen<T = any>(compareFn?: SortCallback<T>): IterableActivity<T> {
6
- return function* (source: Source<T>) {
7
- yield* (Array.isArray(source) ? source : [...source]).sort(compareFn);
8
- };
9
- }
10
-
11
- export function sort<T = any>(callbackFn: SortCallback<T>): IterableActivity<T>;
12
- export function sort<T = any>(source: Source<T>, callbackFn: SortCallback<T>): IterableIterator<T>;
13
- export function sort<T = any>(s_or_cb: Source<T> | SortCallback<T>, callbackFn?: SortCallback<T>): IterableActivity<T> | IterableIterator<T> {
14
- return isSource(s_or_cb) ? sortGen(callbackFn!)(s_or_cb) : sortGen(s_or_cb);
15
- }
16
-
1
+ import { IterableActivity, Source, isSource } from "./activity";
2
+
3
+ export type SortCallback<T> = (a: T, b: T) => number;
4
+
5
+ function sortGen<T = any>(compareFn?: SortCallback<T>): IterableActivity<T> {
6
+ return function* (source: Source<T>) {
7
+ yield* (Array.isArray(source) ? source : [...source]).sort(compareFn);
8
+ };
9
+ }
10
+
11
+ export function sort<T = any>(callbackFn: SortCallback<T>): IterableActivity<T>;
12
+ export function sort<T = any>(source: Source<T>, callbackFn: SortCallback<T>): IterableIterator<T>;
13
+ export function sort<T = any>(s_or_cb: Source<T> | SortCallback<T>, callbackFn?: SortCallback<T>): IterableActivity<T> | IterableIterator<T> {
14
+ return isSource(s_or_cb) ? sortGen(callbackFn!)(s_or_cb) : sortGen(s_or_cb);
15
+ }
16
+
package/src/index.ts CHANGED
@@ -1,27 +1,27 @@
1
- export * from "./activities/activity";
2
- export * from "./activities/concat";
3
- export * from "./activities/each";
4
- export * from "./activities/entries";
5
- export * from "./activities/filter";
6
- export * from "./activities/first";
7
- export * from "./activities/group";
8
- export * from "./activities/histogram";
9
- export * from "./activities/join";
10
- export * from "./activities/map";
11
- export * from "./activities/normalize";
12
- export * from "./activities/skip";
13
- export * from "./activities/sort";
14
- export * from "./observers/count";
15
- export * from "./observers/deviation";
16
- export * from "./observers/distribution";
17
- export * from "./observers/extent";
18
- export * from "./observers/observer";
19
- export * from "./observers/max";
20
- export * from "./observers/mean";
21
- export * from "./observers/median";
22
- export * from "./observers/min";
23
- export * from "./observers/quartile";
24
- export * from "./observers/reduce";
25
- export * from "./observers/variance";
26
- export * from "./utils/generate";
27
- export * from "./utils/pipe";
1
+ export * from "./activities/activity";
2
+ export * from "./activities/concat";
3
+ export * from "./activities/each";
4
+ export * from "./activities/entries";
5
+ export * from "./activities/filter";
6
+ export * from "./activities/first";
7
+ export * from "./activities/group";
8
+ export * from "./activities/histogram";
9
+ export * from "./activities/join";
10
+ export * from "./activities/map";
11
+ export * from "./activities/normalize";
12
+ export * from "./activities/skip";
13
+ export * from "./activities/sort";
14
+ export * from "./observers/count";
15
+ export * from "./observers/deviation";
16
+ export * from "./observers/distribution";
17
+ export * from "./observers/extent";
18
+ export * from "./observers/observer";
19
+ export * from "./observers/max";
20
+ export * from "./observers/mean";
21
+ export * from "./observers/median";
22
+ export * from "./observers/min";
23
+ export * from "./observers/quartile";
24
+ export * from "./observers/reduce";
25
+ export * from "./observers/variance";
26
+ export * from "./utils/generate";
27
+ export * from "./utils/pipe";
@@ -1,15 +1,15 @@
1
- import { Observer } from "./observer";
2
-
3
- export function count<T = any>(): Observer<T, number> {
4
- let count: number;
5
-
6
- return {
7
- observe: (value: T, idx: number) => {
8
- if (idx === 0) {
9
- count = 0;
10
- }
11
- ++count;
12
- },
13
- peek: () => count
14
- };
15
- }
1
+ import { Observer } from "./observer";
2
+
3
+ export function count<T = any>(): Observer<T, number> {
4
+ let count: number;
5
+
6
+ return {
7
+ observe: (value: T, idx: number) => {
8
+ if (idx === 0) {
9
+ count = 0;
10
+ }
11
+ ++count;
12
+ },
13
+ peek: () => count
14
+ };
15
+ }
@@ -1,24 +1,24 @@
1
- import { variance } from "./variance";
2
- import { AccessorT, Observer, Accessor } from "./observer";
3
-
4
- function _deviation(): Observer<number, number | undefined> {
5
- const v = variance();
6
-
7
- return {
8
- observe: (value: number, idx: number) => {
9
- v.observe(value, idx);
10
- },
11
- peek: () => {
12
- const variance = v.peek();
13
- return variance !== undefined ? Math.sqrt(variance) : variance;
14
- }
15
- };
16
- }
17
-
18
- export type DeviationAccessor<T> = AccessorT<T, number>;
19
-
20
- export function deviation(): Observer<number, number | undefined>;
21
- export function deviation<T = any>(callbackFn: DeviationAccessor<T>): Observer<T, number | undefined>;
22
- export function deviation<T = any>(callbackFn?: DeviationAccessor<T>): Observer<number, number | undefined> | Observer<T, number | undefined> {
23
- return callbackFn ? Accessor(_deviation, callbackFn) : _deviation();
24
- }
1
+ import { variance } from "./variance";
2
+ import { AccessorT, Observer, Accessor } from "./observer";
3
+
4
+ function _deviation(): Observer<number, number | undefined> {
5
+ const v = variance();
6
+
7
+ return {
8
+ observe: (value: number, idx: number) => {
9
+ v.observe(value, idx);
10
+ },
11
+ peek: () => {
12
+ const variance = v.peek();
13
+ return variance !== undefined ? Math.sqrt(variance) : variance;
14
+ }
15
+ };
16
+ }
17
+
18
+ export type DeviationAccessor<T> = AccessorT<T, number>;
19
+
20
+ export function deviation(): Observer<number, number | undefined>;
21
+ export function deviation<T = any>(callbackFn: DeviationAccessor<T>): Observer<T, number | undefined>;
22
+ export function deviation<T = any>(callbackFn?: DeviationAccessor<T>): Observer<number, number | undefined> | Observer<T, number | undefined> {
23
+ return callbackFn ? Accessor(_deviation, callbackFn) : _deviation();
24
+ }
@@ -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
+ }
@@ -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
+ }