1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 | let queue = []
|
13 |
|
14 | const _runQueue = () => {
|
15 | for (let i = 0; i < queue.length; i++) {
|
16 | queue[i]()
|
17 | }
|
18 | queue = []
|
19 | }
|
20 |
|
21 |
|
22 |
|
23 |
|
24 | export const enqueue = f => {
|
25 | queue.push(f)
|
26 | if (queue.length === 1) {
|
27 | setTimeout(_runQueue, 0)
|
28 | }
|
29 | }
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 | const createTimeoutClass = clearFunction => class TT {
|
40 | |
41 |
|
42 |
|
43 | constructor (timeoutId) {
|
44 | this._ = timeoutId
|
45 | }
|
46 |
|
47 | destroy () {
|
48 | clearFunction(this._)
|
49 | }
|
50 | }
|
51 |
|
52 | const Timeout = createTimeoutClass(clearTimeout)
|
53 |
|
54 |
|
55 |
|
56 |
|
57 |
|
58 |
|
59 | export const timeout = (timeout, callback) => new Timeout(setTimeout(callback, timeout))
|
60 |
|
61 | const Interval = createTimeoutClass(clearInterval)
|
62 |
|
63 |
|
64 |
|
65 |
|
66 |
|
67 |
|
68 | export const interval = (timeout, callback) => new Interval(setInterval(callback, timeout))
|
69 |
|
70 |
|
71 | export const Animation = createTimeoutClass(arg => typeof requestAnimationFrame !== 'undefined' && cancelAnimationFrame(arg))
|
72 |
|
73 |
|
74 |
|
75 |
|
76 |
|
77 |
|
78 | export const animationFrame = cb => typeof requestAnimationFrame === 'undefined' ? timeout(0, cb) : new Animation(requestAnimationFrame(cb))
|
79 |
|
80 |
|
81 |
|
82 | const Idle = createTimeoutClass(arg => typeof cancelIdleCallback !== 'undefined' && cancelIdleCallback(arg))
|
83 |
|
84 |
|
85 |
|
86 |
|
87 |
|
88 |
|
89 |
|
90 |
|
91 |
|
92 | export const idleCallback = cb => typeof requestIdleCallback !== 'undefined' ? new Idle(requestIdleCallback(cb)) : timeout(1000, cb)
|
93 |
|
94 |
|
95 |
|
96 |
|
97 |
|
98 | export const createDebouncer = timeout => {
|
99 | let timer = -1
|
100 | return f => {
|
101 | clearTimeout(timer)
|
102 | if (f) {
|
103 | timer = (setTimeout(f, timeout))
|
104 | }
|
105 | }
|
106 | }
|