-
Notifications
You must be signed in to change notification settings - Fork 22
Expand file tree
/
Copy pathNumberIterator.ts
More file actions
69 lines (53 loc) · 1.82 KB
/
NumberIterator.ts
File metadata and controls
69 lines (53 loc) · 1.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/**
* Copyright (c) Microsoft Corporation.
*
* Licensed under the MIT license found in the
* LICENSE file in the root of this projects source tree.
*/
export const DONE: IteratorReturnResult<undefined> = { done: true, value: undefined };
export type NumberIteratorResult = IteratorResult<number, undefined>;
export type IterableNumbers = () => NumberIteratorResult;
export type NumberMapper = (para: number) => number;
export type NumberGenerator = () => NumberIterator;
const toMsMapper: NumberMapper = (x: number) => Math.floor(x * 1e3);
export class NumberIterator implements Iterator<number, undefined, undefined> {
next: IterableNumbers;
constructor(_next: IterableNumbers) {
this.next = _next;
}
[Symbol.iterator](): Iterator<number, undefined, undefined> {
return this;
}
map(fn: NumberMapper): NumberIterator {
return new NumberIterator(() => {
const cursor: NumberIteratorResult = this.next();
if (cursor.done) {
return cursor;
}
return {
done: false,
value: fn(cursor.value),
};
});
}
addNoise(factor: number = 0.1): NumberIterator {
return this.map((value: number) => value * (1 + (Math.random() - 0.5) * factor));
}
toMs(): NumberIterator {
return this.map(toMsMapper);
}
clamp(min: number, max: number): NumberIterator {
// eslint-disable-next-line no-nested-ternary
return this.map((value: number) => (value < min ? min : value > max ? max : value));
}
take(n: number): NumberIterator {
let i: number = 0;
return new NumberIterator(() => {
if (i < n) {
++i;
return this.next();
}
return DONE;
});
}
}