@hpcc-js/dataflow 9.6.7 → 9.6.9
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.map +1 -1
- package/dist/index.umd.cjs.map +1 -1
- package/package.json +3 -3
- package/src/__package__.ts +3 -3
- 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 +99 -99
- package/src/activities/join.ts +19 -19
- package/src/activities/map.ts +18 -18
- package/src/activities/normalize.ts +21 -21
- package/src/activities/skip.ts +18 -18
- package/src/activities/sort.ts +16 -16
- package/src/index.ts +27 -27
- 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 +233 -233
package/src/activities/concat.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { Source, IterableActivity } from "./activity.ts";
|
|
2
|
-
|
|
3
|
-
function concatGen<T = any>(concatSource: Source<T>): IterableActivity<T> {
|
|
4
|
-
return function* (source: Source<T>) {
|
|
5
|
-
yield* source;
|
|
6
|
-
yield* concatSource;
|
|
7
|
-
};
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export function concat<T = any>(concatSource: Source<T>): IterableActivity<T, T>;
|
|
11
|
-
export function concat<T>(source: Source<T>, concatSource: Source<T>): IterableIterator<T>;
|
|
12
|
-
export function concat<T = any>(s_or_n: Source<T>, concatSource?: Source<T>): IterableActivity<T, T> | IterableIterator<T> {
|
|
13
|
-
return concatSource !== undefined ? concatGen<T>(concatSource!)(s_or_n) : concatGen<T>(s_or_n);
|
|
14
|
-
}
|
|
1
|
+
import { Source, IterableActivity } from "./activity.ts";
|
|
2
|
+
|
|
3
|
+
function concatGen<T = any>(concatSource: Source<T>): IterableActivity<T> {
|
|
4
|
+
return function* (source: Source<T>) {
|
|
5
|
+
yield* source;
|
|
6
|
+
yield* concatSource;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function concat<T = any>(concatSource: Source<T>): IterableActivity<T, T>;
|
|
11
|
+
export function concat<T>(source: Source<T>, concatSource: Source<T>): IterableIterator<T>;
|
|
12
|
+
export function concat<T = any>(s_or_n: Source<T>, concatSource?: Source<T>): IterableActivity<T, T> | IterableIterator<T> {
|
|
13
|
+
return concatSource !== undefined ? concatGen<T>(concatSource!)(s_or_n) : concatGen<T>(s_or_n);
|
|
14
|
+
}
|
package/src/activities/each.ts
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { IterableActivity, Source, isSource } from "./activity.ts";
|
|
2
|
-
|
|
3
|
-
export type EachCallback<T> = (value: T, index: number) => void;
|
|
4
|
-
|
|
5
|
-
function eachGen<T = any>(callbackFn: EachCallback<T>): IterableActivity<T> {
|
|
6
|
-
return function* (source: Source<T>) {
|
|
7
|
-
let i = -1;
|
|
8
|
-
for (const item of source) {
|
|
9
|
-
callbackFn(item, ++i);
|
|
10
|
-
yield item;
|
|
11
|
-
}
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function each<T = any>(callbackFn: EachCallback<T>): IterableActivity<T>;
|
|
16
|
-
export function each<T>(source: Source<T>, callbackFn: EachCallback<T>): IterableIterator<T>;
|
|
17
|
-
export function each<T>(s_or_cb: Source<T> | EachCallback<T>, callbackFn?: EachCallback<T>): IterableActivity<T> | IterableIterator<T> {
|
|
18
|
-
return isSource(s_or_cb) ? eachGen(callbackFn!)(s_or_cb) : eachGen(s_or_cb);
|
|
19
|
-
}
|
|
1
|
+
import { IterableActivity, Source, isSource } from "./activity.ts";
|
|
2
|
+
|
|
3
|
+
export type EachCallback<T> = (value: T, index: number) => void;
|
|
4
|
+
|
|
5
|
+
function eachGen<T = any>(callbackFn: EachCallback<T>): IterableActivity<T> {
|
|
6
|
+
return function* (source: Source<T>) {
|
|
7
|
+
let i = -1;
|
|
8
|
+
for (const item of source) {
|
|
9
|
+
callbackFn(item, ++i);
|
|
10
|
+
yield item;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function each<T = any>(callbackFn: EachCallback<T>): IterableActivity<T>;
|
|
16
|
+
export function each<T>(source: Source<T>, callbackFn: EachCallback<T>): IterableIterator<T>;
|
|
17
|
+
export function each<T>(s_or_cb: Source<T> | EachCallback<T>, callbackFn?: EachCallback<T>): IterableActivity<T> | IterableIterator<T> {
|
|
18
|
+
return isSource(s_or_cb) ? eachGen(callbackFn!)(s_or_cb) : eachGen(s_or_cb);
|
|
19
|
+
}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { IterableActivity, Source } from "./activity.ts";
|
|
2
|
-
|
|
3
|
-
// Array.entries
|
|
4
|
-
function entriesGen<T = any>(): IterableActivity<T, [number, T]> {
|
|
5
|
-
return function* (source: Source<T>) {
|
|
6
|
-
let i = -1;
|
|
7
|
-
for (const item of source) {
|
|
8
|
-
yield [++i, item];
|
|
9
|
-
}
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export function entries<T = any>(): IterableActivity<T, [number, T]>;
|
|
14
|
-
export function entries<T>(source: Source<T>): IterableIterator<[number, T]>;
|
|
15
|
-
export function entries<T>(source?: Source<T>): IterableActivity<T, [number, T]> | IterableIterator<[number, T]> {
|
|
16
|
-
return source ? entriesGen<T>()(source) : entriesGen<T>();
|
|
17
|
-
}
|
|
1
|
+
import { IterableActivity, Source } from "./activity.ts";
|
|
2
|
+
|
|
3
|
+
// Array.entries
|
|
4
|
+
function entriesGen<T = any>(): IterableActivity<T, [number, T]> {
|
|
5
|
+
return function* (source: Source<T>) {
|
|
6
|
+
let i = -1;
|
|
7
|
+
for (const item of source) {
|
|
8
|
+
yield [++i, item];
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function entries<T = any>(): IterableActivity<T, [number, T]>;
|
|
14
|
+
export function entries<T>(source: Source<T>): IterableIterator<[number, T]>;
|
|
15
|
+
export function entries<T>(source?: Source<T>): IterableActivity<T, [number, T]> | IterableIterator<[number, T]> {
|
|
16
|
+
return source ? entriesGen<T>()(source) : entriesGen<T>();
|
|
17
|
+
}
|
package/src/activities/filter.ts
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { IterableActivity, Source, isSource } from "./activity.ts";
|
|
2
|
-
|
|
3
|
-
export type FilterCallback<T> = (value: T, index: number) => boolean;
|
|
4
|
-
|
|
5
|
-
function filterGen<T = any>(callbackFn: FilterCallback<T>): IterableActivity<T> {
|
|
6
|
-
return function* (source: Source<T>) {
|
|
7
|
-
let i = -1;
|
|
8
|
-
for (const item of source) {
|
|
9
|
-
if (callbackFn(item, ++i)) {
|
|
10
|
-
yield item;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function filter<T = any>(callbackFn: FilterCallback<T>): IterableActivity<T>;
|
|
17
|
-
export function filter<T>(source: Source<T>, callbackFn: FilterCallback<T>): IterableIterator<T>;
|
|
18
|
-
export function filter<T>(s_or_cb: Source<T> | FilterCallback<T>, callbackFn?: FilterCallback<T>): IterableActivity<T> | IterableIterator<T> {
|
|
19
|
-
return isSource(s_or_cb) ? filterGen(callbackFn!)(s_or_cb) : filterGen(s_or_cb);
|
|
20
|
-
}
|
|
1
|
+
import { IterableActivity, Source, isSource } from "./activity.ts";
|
|
2
|
+
|
|
3
|
+
export type FilterCallback<T> = (value: T, index: number) => boolean;
|
|
4
|
+
|
|
5
|
+
function filterGen<T = any>(callbackFn: FilterCallback<T>): IterableActivity<T> {
|
|
6
|
+
return function* (source: Source<T>) {
|
|
7
|
+
let i = -1;
|
|
8
|
+
for (const item of source) {
|
|
9
|
+
if (callbackFn(item, ++i)) {
|
|
10
|
+
yield item;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function filter<T = any>(callbackFn: FilterCallback<T>): IterableActivity<T>;
|
|
17
|
+
export function filter<T>(source: Source<T>, callbackFn: FilterCallback<T>): IterableIterator<T>;
|
|
18
|
+
export function filter<T>(s_or_cb: Source<T> | FilterCallback<T>, callbackFn?: FilterCallback<T>): IterableActivity<T> | IterableIterator<T> {
|
|
19
|
+
return isSource(s_or_cb) ? filterGen(callbackFn!)(s_or_cb) : filterGen(s_or_cb);
|
|
20
|
+
}
|
package/src/activities/first.ts
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { IterableActivity, isSource, Source } from "./activity.ts";
|
|
2
|
-
|
|
3
|
-
function firstGen<T = any>(n: number): IterableActivity<T, T> {
|
|
4
|
-
return function* (source: Source<T>) {
|
|
5
|
-
let i = 0;
|
|
6
|
-
for (const item of source) {
|
|
7
|
-
yield item;
|
|
8
|
-
if (++i >= n) {
|
|
9
|
-
break;
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function first<T = any>(n: number): IterableActivity<T, T>;
|
|
16
|
-
export function first<T>(source: Source<T>, n: number): IterableIterator<T>;
|
|
17
|
-
export function first<T = any>(s_or_n: Source<T> | number, n?: number): IterableActivity<T, T> | IterableIterator<T> {
|
|
18
|
-
if (!isSource(s_or_n)) return firstGen<T>(s_or_n);
|
|
19
|
-
return firstGen<T>(n!)(s_or_n);
|
|
20
|
-
}
|
|
1
|
+
import { IterableActivity, isSource, Source } from "./activity.ts";
|
|
2
|
+
|
|
3
|
+
function firstGen<T = any>(n: number): IterableActivity<T, T> {
|
|
4
|
+
return function* (source: Source<T>) {
|
|
5
|
+
let i = 0;
|
|
6
|
+
for (const item of source) {
|
|
7
|
+
yield item;
|
|
8
|
+
if (++i >= n) {
|
|
9
|
+
break;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function first<T = any>(n: number): IterableActivity<T, T>;
|
|
16
|
+
export function first<T>(source: Source<T>, n: number): IterableIterator<T>;
|
|
17
|
+
export function first<T = any>(s_or_n: Source<T> | number, n?: number): IterableActivity<T, T> | IterableIterator<T> {
|
|
18
|
+
if (!isSource(s_or_n)) return firstGen<T>(s_or_n);
|
|
19
|
+
return firstGen<T>(n!)(s_or_n);
|
|
20
|
+
}
|
package/src/activities/group.ts
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
import { IterableActivity, Source, isSource } from "./activity.ts";
|
|
2
|
-
|
|
3
|
-
export type GroupFn<T> = (row: T, index: number) => number | string;
|
|
4
|
-
export type GroupRow<T> = { key: string, value: T[] };
|
|
5
|
-
|
|
6
|
-
function groupGen<T = any>(groupFn: GroupFn<T>): IterableActivity<T, GroupRow<T>> {
|
|
7
|
-
return function* (source: Source<T>) {
|
|
8
|
-
let i = -1;
|
|
9
|
-
const group: { [key: string]: T[] } = {};
|
|
10
|
-
for (const row of source) {
|
|
11
|
-
const key = groupFn(row, ++i);
|
|
12
|
-
if (!group[key]) {
|
|
13
|
-
group[key] = [];
|
|
14
|
-
}
|
|
15
|
-
group[key].push(row);
|
|
16
|
-
}
|
|
17
|
-
for (const key in group) {
|
|
18
|
-
yield { key, value: group[key] };
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export function group<T>(groupByFn: GroupFn<T>): IterableActivity<T, GroupRow<T>>;
|
|
24
|
-
export function group<T>(source: Source<T>, groupByFn: GroupFn<T>): IterableIterator<GroupRow<T>>;
|
|
25
|
-
export function group<T>(s_or_gbf: Source<T> | GroupFn<T>, groupByFn?: GroupFn<T>): IterableActivity<T, GroupRow<T>> | IterableIterator<GroupRow<T>> {
|
|
26
|
-
return isSource(s_or_gbf) ? groupGen<T>(groupByFn!)(s_or_gbf) : groupGen<T>(s_or_gbf);
|
|
27
|
-
}
|
|
1
|
+
import { IterableActivity, Source, isSource } from "./activity.ts";
|
|
2
|
+
|
|
3
|
+
export type GroupFn<T> = (row: T, index: number) => number | string;
|
|
4
|
+
export type GroupRow<T> = { key: string, value: T[] };
|
|
5
|
+
|
|
6
|
+
function groupGen<T = any>(groupFn: GroupFn<T>): IterableActivity<T, GroupRow<T>> {
|
|
7
|
+
return function* (source: Source<T>) {
|
|
8
|
+
let i = -1;
|
|
9
|
+
const group: { [key: string]: T[] } = {};
|
|
10
|
+
for (const row of source) {
|
|
11
|
+
const key = groupFn(row, ++i);
|
|
12
|
+
if (!group[key]) {
|
|
13
|
+
group[key] = [];
|
|
14
|
+
}
|
|
15
|
+
group[key].push(row);
|
|
16
|
+
}
|
|
17
|
+
for (const key in group) {
|
|
18
|
+
yield { key, value: group[key] };
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function group<T>(groupByFn: GroupFn<T>): IterableActivity<T, GroupRow<T>>;
|
|
24
|
+
export function group<T>(source: Source<T>, groupByFn: GroupFn<T>): IterableIterator<GroupRow<T>>;
|
|
25
|
+
export function group<T>(s_or_gbf: Source<T> | GroupFn<T>, groupByFn?: GroupFn<T>): IterableActivity<T, GroupRow<T>> | IterableIterator<GroupRow<T>> {
|
|
26
|
+
return isSource(s_or_gbf) ? groupGen<T>(groupByFn!)(s_or_gbf) : groupGen<T>(s_or_gbf);
|
|
27
|
+
}
|
|
@@ -1,99 +1,99 @@
|
|
|
1
|
-
import { IterableActivity, Source, isSource } from "./activity.ts";
|
|
2
|
-
import { extent } from "../observers/extent.ts";
|
|
3
|
-
import { scalar } from "../observers/observer.ts";
|
|
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
|
-
/**
|
|
9
|
-
* Histogram options specifying the minimum value and bucket range (size).
|
|
10
|
-
* @property min - The minimum value for the first bucket's lower bound
|
|
11
|
-
* @property range - The size/width of each bucket (distance between bucket boundaries)
|
|
12
|
-
*/
|
|
13
|
-
export type OptionB = { min: number, range: number };
|
|
14
|
-
export type Options = OptionA | OptionB;
|
|
15
|
-
|
|
16
|
-
function isOptionA(_: Options): _ is OptionA {
|
|
17
|
-
return (_ as OptionA).buckets !== undefined;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
function histogramGen<T = any>(callbackFn: HistogramFn<T>, options: Options): IterableActivity<T, HistogramRow<T>> {
|
|
21
|
-
return function* (_source: Source<T>) {
|
|
22
|
-
let min: number;
|
|
23
|
-
let bucketSize: number;
|
|
24
|
-
|
|
25
|
-
let source;
|
|
26
|
-
if (isOptionA(options)) {
|
|
27
|
-
source = Array.isArray(_source) ? _source : [..._source];
|
|
28
|
-
const minMax = scalar(extent(callbackFn))(source);
|
|
29
|
-
if (minMax === undefined || minMax[0] === undefined || minMax[1] === undefined) {
|
|
30
|
-
// For empty sources with buckets option, generate empty buckets with NaN bounds
|
|
31
|
-
const buckets = options.buckets;
|
|
32
|
-
for (let i = 0; i < buckets; ++i) {
|
|
33
|
-
yield {
|
|
34
|
-
from: NaN,
|
|
35
|
-
to: NaN,
|
|
36
|
-
value: []
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
min = minMax[0];
|
|
42
|
-
const max = minMax[1];
|
|
43
|
-
const buckets = options.buckets;
|
|
44
|
-
bucketSize = (max - min) / buckets;
|
|
45
|
-
} else {
|
|
46
|
-
source = _source;
|
|
47
|
-
min = options.min;
|
|
48
|
-
bucketSize = options.range;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const histogram: { [key: number]: T[] } = {};
|
|
52
|
-
|
|
53
|
-
let maxBucketID = 0;
|
|
54
|
-
let hasData = false;
|
|
55
|
-
for (const row of source) {
|
|
56
|
-
hasData = true;
|
|
57
|
-
const value = callbackFn(row);
|
|
58
|
-
const bucketID = Math.floor((value - min) / bucketSize);
|
|
59
|
-
if (maxBucketID < bucketID) {
|
|
60
|
-
maxBucketID = bucketID;
|
|
61
|
-
}
|
|
62
|
-
if (histogram[bucketID] === undefined) {
|
|
63
|
-
histogram[bucketID] = [];
|
|
64
|
-
}
|
|
65
|
-
histogram[bucketID].push(row);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// If no data, return empty for OptionB (min/range)
|
|
69
|
-
if (!hasData) {
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const lastBucket = histogram[maxBucketID];
|
|
74
|
-
const from = min + maxBucketID * bucketSize;
|
|
75
|
-
|
|
76
|
-
for (let i = 0; i <= maxBucketID; ++i) {
|
|
77
|
-
// If all items in the last bucket match the "to" of the previous bucket, put them in there...
|
|
78
|
-
if (i === maxBucketID - 1 && lastBucket.every(row => from === callbackFn(row))) {
|
|
79
|
-
yield {
|
|
80
|
-
from: min + i * bucketSize,
|
|
81
|
-
to: min + (i + 1) * bucketSize,
|
|
82
|
-
value: [...(histogram[i] || []), ...lastBucket]
|
|
83
|
-
};
|
|
84
|
-
break;
|
|
85
|
-
}
|
|
86
|
-
yield {
|
|
87
|
-
from: min + i * bucketSize,
|
|
88
|
-
to: min + (i + 1) * bucketSize,
|
|
89
|
-
value: histogram[i] || []
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
export function histogram<T>(histogramByFn: HistogramFn<T>, options: Options): IterableActivity<T, HistogramRow<T>>;
|
|
96
|
-
export function histogram<T>(source: Source<T>, histogramByFn: HistogramFn<T>, options: Options): IterableIterator<HistogramRow<T>>;
|
|
97
|
-
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>> {
|
|
98
|
-
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);
|
|
99
|
-
}
|
|
1
|
+
import { IterableActivity, Source, isSource } from "./activity.ts";
|
|
2
|
+
import { extent } from "../observers/extent.ts";
|
|
3
|
+
import { scalar } from "../observers/observer.ts";
|
|
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
|
+
/**
|
|
9
|
+
* Histogram options specifying the minimum value and bucket range (size).
|
|
10
|
+
* @property min - The minimum value for the first bucket's lower bound
|
|
11
|
+
* @property range - The size/width of each bucket (distance between bucket boundaries)
|
|
12
|
+
*/
|
|
13
|
+
export type OptionB = { min: number, range: number };
|
|
14
|
+
export type Options = OptionA | OptionB;
|
|
15
|
+
|
|
16
|
+
function isOptionA(_: Options): _ is OptionA {
|
|
17
|
+
return (_ as OptionA).buckets !== undefined;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function histogramGen<T = any>(callbackFn: HistogramFn<T>, options: Options): IterableActivity<T, HistogramRow<T>> {
|
|
21
|
+
return function* (_source: Source<T>) {
|
|
22
|
+
let min: number;
|
|
23
|
+
let bucketSize: number;
|
|
24
|
+
|
|
25
|
+
let source;
|
|
26
|
+
if (isOptionA(options)) {
|
|
27
|
+
source = Array.isArray(_source) ? _source : [..._source];
|
|
28
|
+
const minMax = scalar(extent(callbackFn))(source);
|
|
29
|
+
if (minMax === undefined || minMax[0] === undefined || minMax[1] === undefined) {
|
|
30
|
+
// For empty sources with buckets option, generate empty buckets with NaN bounds
|
|
31
|
+
const buckets = options.buckets;
|
|
32
|
+
for (let i = 0; i < buckets; ++i) {
|
|
33
|
+
yield {
|
|
34
|
+
from: NaN,
|
|
35
|
+
to: NaN,
|
|
36
|
+
value: []
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
min = minMax[0];
|
|
42
|
+
const max = minMax[1];
|
|
43
|
+
const buckets = options.buckets;
|
|
44
|
+
bucketSize = (max - min) / buckets;
|
|
45
|
+
} else {
|
|
46
|
+
source = _source;
|
|
47
|
+
min = options.min;
|
|
48
|
+
bucketSize = options.range;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const histogram: { [key: number]: T[] } = {};
|
|
52
|
+
|
|
53
|
+
let maxBucketID = 0;
|
|
54
|
+
let hasData = false;
|
|
55
|
+
for (const row of source) {
|
|
56
|
+
hasData = true;
|
|
57
|
+
const value = callbackFn(row);
|
|
58
|
+
const bucketID = Math.floor((value - min) / bucketSize);
|
|
59
|
+
if (maxBucketID < bucketID) {
|
|
60
|
+
maxBucketID = bucketID;
|
|
61
|
+
}
|
|
62
|
+
if (histogram[bucketID] === undefined) {
|
|
63
|
+
histogram[bucketID] = [];
|
|
64
|
+
}
|
|
65
|
+
histogram[bucketID].push(row);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// If no data, return empty for OptionB (min/range)
|
|
69
|
+
if (!hasData) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const lastBucket = histogram[maxBucketID];
|
|
74
|
+
const from = min + maxBucketID * bucketSize;
|
|
75
|
+
|
|
76
|
+
for (let i = 0; i <= maxBucketID; ++i) {
|
|
77
|
+
// If all items in the last bucket match the "to" of the previous bucket, put them in there...
|
|
78
|
+
if (i === maxBucketID - 1 && lastBucket.every(row => from === callbackFn(row))) {
|
|
79
|
+
yield {
|
|
80
|
+
from: min + i * bucketSize,
|
|
81
|
+
to: min + (i + 1) * bucketSize,
|
|
82
|
+
value: [...(histogram[i] || []), ...lastBucket]
|
|
83
|
+
};
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
yield {
|
|
87
|
+
from: min + i * bucketSize,
|
|
88
|
+
to: min + (i + 1) * bucketSize,
|
|
89
|
+
value: histogram[i] || []
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function histogram<T>(histogramByFn: HistogramFn<T>, options: Options): IterableActivity<T, HistogramRow<T>>;
|
|
96
|
+
export function histogram<T>(source: Source<T>, histogramByFn: HistogramFn<T>, options: Options): IterableIterator<HistogramRow<T>>;
|
|
97
|
+
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>> {
|
|
98
|
+
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);
|
|
99
|
+
}
|
package/src/activities/join.ts
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { IterableActivity, Source, isSource } from "./activity.ts";
|
|
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.ts";
|
|
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
|
+
}
|
package/src/activities/map.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { IterableActivity, Source, isSource } from "./activity.ts";
|
|
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.ts";
|
|
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.ts";
|
|
2
|
-
import { extent } from "../observers/extent.ts";
|
|
3
|
-
import { scalar } from "../observers/observer.ts";
|
|
4
|
-
import { map } from "./map.ts";
|
|
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.ts";
|
|
2
|
+
import { extent } from "../observers/extent.ts";
|
|
3
|
+
import { scalar } from "../observers/observer.ts";
|
|
4
|
+
import { map } from "./map.ts";
|
|
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
|
+
}
|
package/src/activities/skip.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { IterableActivity, Source, isSource } from "./activity.ts";
|
|
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.ts";
|
|
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
|
+
}
|
package/src/activities/sort.ts
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { IterableActivity, Source, isSource } from "./activity.ts";
|
|
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.ts";
|
|
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
|
+
|