-
-
Notifications
You must be signed in to change notification settings - Fork 150
/
interval.ts
48 lines (46 loc) · 1.18 KB
/
interval.ts
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
import type { CommonOpts } from "./api.js";
import { __optsWithID } from "./idgen.js";
import { stream } from "./stream.js";
export interface FromIntervalOpts extends CommonOpts {
/**
* If given, only the stated number of values will be emitted (in
* the `[0...num)` interval) and the stream will become inactive (or
* close) after.
*
* @defaultValue Infinity
*/
num: number;
}
/**
* Returns a {@link Stream} of monotonically increasing counter values,
* emitted at given `delay` interval and up to the optionally defined
* max value (default: ∞), after which the stream is closed.
*
* @remarks
* The stream only starts when the first subscriber becomes available.
*
* @param delay -
* @param opts -
*/
export const fromInterval = (
delay: number,
opts?: Partial<FromIntervalOpts>
) => {
opts = __optsWithID("interval", <FromIntervalOpts>{
num: Infinity,
...opts,
});
return stream<number>((stream) => {
let i = 0;
let count = opts!.num!;
stream.next(i++);
let id = setInterval(() => {
stream.next(i++);
if (--count <= 0) {
clearInterval(id);
stream.closeIn !== "never" && stream.done();
}
}, delay);
return () => clearInterval(id);
}, opts);
};