@cloudcome/utils-core 1.19.1 → 1.20.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 (161) hide show
  1. package/README.md +72 -73
  2. package/dist/array.cjs +181 -125
  3. package/dist/array.cjs.map +1 -1
  4. package/dist/array.mjs +181 -133
  5. package/dist/array.mjs.map +1 -1
  6. package/dist/async.cjs +181 -171
  7. package/dist/async.cjs.map +1 -1
  8. package/dist/async.mjs +181 -174
  9. package/dist/async.mjs.map +1 -1
  10. package/dist/base64.cjs +16 -12
  11. package/dist/base64.cjs.map +1 -1
  12. package/dist/base64.mjs +17 -14
  13. package/dist/base64.mjs.map +1 -1
  14. package/dist/cache.cjs +79 -67
  15. package/dist/cache.cjs.map +1 -1
  16. package/dist/cache.d.ts +3 -3
  17. package/dist/cache.mjs +80 -71
  18. package/dist/cache.mjs.map +1 -1
  19. package/dist/color.cjs +478 -167
  20. package/dist/color.cjs.map +1 -1
  21. package/dist/color.d.ts +3 -3
  22. package/dist/color.mjs +480 -197
  23. package/dist/color.mjs.map +1 -1
  24. package/dist/crypto.cjs +474 -687
  25. package/dist/crypto.cjs.map +1 -1
  26. package/dist/crypto.mjs +476 -693
  27. package/dist/crypto.mjs.map +1 -1
  28. package/dist/date.cjs +972 -161
  29. package/dist/date.cjs.map +1 -1
  30. package/dist/date.d.ts +2 -2
  31. package/dist/date.mjs +962 -191
  32. package/dist/date.mjs.map +1 -1
  33. package/dist/dict.cjs +90 -52
  34. package/dist/dict.cjs.map +1 -1
  35. package/dist/dict.d.ts +1 -1
  36. package/dist/dict.mjs +91 -54
  37. package/dist/dict.mjs.map +1 -1
  38. package/dist/easing.cjs +104 -103
  39. package/dist/easing.cjs.map +1 -1
  40. package/dist/easing.mjs +105 -133
  41. package/dist/easing.mjs.map +1 -1
  42. package/dist/emitter.cjs +101 -96
  43. package/dist/emitter.cjs.map +1 -1
  44. package/dist/emitter.mjs +101 -97
  45. package/dist/emitter.mjs.map +1 -1
  46. package/dist/env.cjs +43 -9
  47. package/dist/env.cjs.map +1 -1
  48. package/dist/env.d.ts +1 -1
  49. package/dist/env.mjs +43 -15
  50. package/dist/env.mjs.map +1 -1
  51. package/dist/error.cjs +26 -5
  52. package/dist/error.cjs.map +1 -1
  53. package/dist/error.mjs +26 -7
  54. package/dist/error.mjs.map +1 -1
  55. package/dist/exception.cjs +38 -20
  56. package/dist/exception.cjs.map +1 -1
  57. package/dist/exception.d.ts +5 -5
  58. package/dist/exception.mjs +38 -21
  59. package/dist/exception.mjs.map +1 -1
  60. package/dist/function.cjs +128 -68
  61. package/dist/function.cjs.map +1 -1
  62. package/dist/function.mjs +128 -72
  63. package/dist/function.mjs.map +1 -1
  64. package/dist/index.cjs +8 -3
  65. package/dist/index.cjs.map +1 -1
  66. package/dist/index.mjs +9 -5
  67. package/dist/index.mjs.map +1 -1
  68. package/dist/number.cjs +10 -14
  69. package/dist/number.mjs +2 -15
  70. package/dist/object/get-set.d.ts +2 -2
  71. package/dist/object/merge.d.ts +2 -2
  72. package/dist/object.cjs +369 -106
  73. package/dist/object.cjs.map +1 -1
  74. package/dist/object.mjs +366 -115
  75. package/dist/object.mjs.map +1 -1
  76. package/dist/path.cjs +144 -55
  77. package/dist/path.cjs.map +1 -1
  78. package/dist/path.mjs +144 -62
  79. package/dist/path.mjs.map +1 -1
  80. package/dist/promise.cjs +84 -43
  81. package/dist/promise.cjs.map +1 -1
  82. package/dist/promise.mjs +85 -50
  83. package/dist/promise.mjs.map +1 -1
  84. package/dist/qs.cjs +63 -39
  85. package/dist/qs.cjs.map +1 -1
  86. package/dist/qs.mjs +64 -42
  87. package/dist/qs.mjs.map +1 -1
  88. package/dist/regexp.cjs +118 -35
  89. package/dist/regexp.cjs.map +1 -1
  90. package/dist/regexp.mjs +119 -46
  91. package/dist/regexp.mjs.map +1 -1
  92. package/dist/string.cjs +12 -15
  93. package/dist/string.mjs +2 -16
  94. package/dist/string2.cjs +378 -142
  95. package/dist/string2.cjs.map +1 -1
  96. package/dist/string2.mjs +259 -143
  97. package/dist/string2.mjs.map +1 -1
  98. package/dist/time.cjs +136 -59
  99. package/dist/time.cjs.map +1 -1
  100. package/dist/time.mjs +136 -65
  101. package/dist/time.mjs.map +1 -1
  102. package/dist/timer.cjs +122 -112
  103. package/dist/timer.cjs.map +1 -1
  104. package/dist/timer.mjs +123 -115
  105. package/dist/timer.mjs.map +1 -1
  106. package/dist/tree.cjs +207 -112
  107. package/dist/tree.cjs.map +1 -1
  108. package/dist/tree.mjs +207 -116
  109. package/dist/tree.mjs.map +1 -1
  110. package/dist/try/curry.d.ts +1 -1
  111. package/dist/try.cjs +36 -37
  112. package/dist/try.cjs.map +1 -1
  113. package/dist/try.mjs +35 -37
  114. package/dist/try.mjs.map +1 -1
  115. package/dist/type.cjs +126 -24
  116. package/dist/type.cjs.map +1 -1
  117. package/dist/type.d.ts +2 -2
  118. package/dist/type.mjs +128 -45
  119. package/dist/type.mjs.map +1 -1
  120. package/dist/types.cjs +0 -2
  121. package/dist/types.d.ts +1 -1
  122. package/dist/types.mjs +0 -2
  123. package/dist/unique.cjs +41 -38
  124. package/dist/unique.cjs.map +1 -1
  125. package/dist/unique.mjs +42 -41
  126. package/dist/unique.mjs.map +1 -1
  127. package/dist/url.cjs +39 -30
  128. package/dist/url.cjs.map +1 -1
  129. package/dist/url.mjs +40 -33
  130. package/dist/url.mjs.map +1 -1
  131. package/dist/version.cjs +51 -33
  132. package/dist/version.cjs.map +1 -1
  133. package/dist/version.mjs +51 -35
  134. package/dist/version.mjs.map +1 -1
  135. package/package.json +109 -110
  136. package/dist/const.cjs +0 -14
  137. package/dist/const.cjs.map +0 -1
  138. package/dist/const.mjs +0 -15
  139. package/dist/const.mjs.map +0 -1
  140. package/dist/core.cjs +0 -362
  141. package/dist/core.cjs.map +0 -1
  142. package/dist/core.mjs +0 -363
  143. package/dist/core.mjs.map +0 -1
  144. package/dist/crypto/md5.d.mts +0 -1
  145. package/dist/crypto/sha1.d.mts +0 -1
  146. package/dist/crypto/sha256.d.mts +0 -1
  147. package/dist/crypto/sha512.d.mts +0 -1
  148. package/dist/each.cjs +0 -18
  149. package/dist/each.cjs.map +0 -1
  150. package/dist/each.mjs +0 -19
  151. package/dist/each.mjs.map +0 -1
  152. package/dist/merge.cjs +0 -87
  153. package/dist/merge.cjs.map +0 -1
  154. package/dist/merge.mjs +0 -88
  155. package/dist/merge.mjs.map +0 -1
  156. package/dist/number.cjs.map +0 -1
  157. package/dist/number.mjs.map +0 -1
  158. package/dist/string.cjs.map +0 -1
  159. package/dist/string.mjs.map +0 -1
  160. package/dist/types.cjs.map +0 -1
  161. package/dist/types.mjs.map +0 -1
package/dist/timer.cjs CHANGED
@@ -1,119 +1,129 @@
1
- "use strict";
2
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const STATUS_READY = 0;
4
- const STATUS_START = 1;
5
- const STATUS_PAUSE = 2;
6
- const STATUS_STOP = 3;
2
+ //#region src/timer.ts
3
+ var STATUS_READY = 0;
4
+ var STATUS_START = 1;
5
+ var STATUS_PAUSE = 2;
6
+ var STATUS_STOP = 3;
7
+ /**
8
+ * 创建间隔定时器核心函数
9
+ *
10
+ * @param nextTime - 用于安排下一次执行的函数
11
+ * @param effect - 每次执行的回调函数,接收定时器状态和可选的next函数
12
+ * @returns 返回包含控制方法的对象
13
+ */
7
14
  function makeInterval(nextTime, effect) {
8
- let startAt = 0;
9
- let lastAt = 0;
10
- let stopAt = 0;
11
- let pauseAt = 0;
12
- let resumeAt = 0;
13
- let times = 0;
14
- let status = STATUS_READY;
15
- let runningTime = 0;
16
- const execute = () => {
17
- if (status >= STATUS_PAUSE) return;
18
- const now = Date.now();
19
- const intervalTime = lastAt > 0 ? now - lastAt : 0;
20
- runningTime += intervalTime;
21
- lastAt = now;
22
- const state = {
23
- times: ++times,
24
- startAt,
25
- stopAt,
26
- pauseAt,
27
- resumeAt,
28
- currentAt: now,
29
- elapsedTime: startAt > 0 ? now - startAt : 0,
30
- runningTime,
31
- intervalTime
32
- };
33
- if (effect.length === 2) {
34
- effect(state, () => {
35
- nextTime(execute);
36
- });
37
- } else {
38
- effect(state);
39
- nextTime(execute);
40
- }
41
- };
42
- const canStart = () => status === STATUS_READY;
43
- const start = () => {
44
- if (!canStart()) return;
45
- status = STATUS_START;
46
- startAt = Date.now();
47
- execute();
48
- };
49
- const canStop = () => status === STATUS_START;
50
- const stop = () => {
51
- if (!canStop()) return;
52
- status = STATUS_STOP;
53
- stopAt = Date.now();
54
- };
55
- const canPause = () => status === STATUS_START;
56
- const pause = () => {
57
- if (!canPause()) return;
58
- status = STATUS_PAUSE;
59
- pauseAt = Date.now();
60
- };
61
- const canResume = () => status === STATUS_PAUSE;
62
- const resume = () => {
63
- if (!canResume()) return;
64
- status = STATUS_START;
65
- resumeAt = Date.now();
66
- lastAt = resumeAt;
67
- execute();
68
- };
69
- return {
70
- canStart,
71
- canStop,
72
- canPause,
73
- canResume,
74
- start,
75
- stop,
76
- pause,
77
- resume,
78
- execute
79
- };
15
+ let startAt = 0;
16
+ let lastAt = 0;
17
+ let stopAt = 0;
18
+ let pauseAt = 0;
19
+ let resumeAt = 0;
20
+ let times = 0;
21
+ let status = STATUS_READY;
22
+ let runningTime = 0;
23
+ const execute = () => {
24
+ if (status >= STATUS_PAUSE) return;
25
+ const now = Date.now();
26
+ const intervalTime = lastAt > 0 ? now - lastAt : 0;
27
+ runningTime += intervalTime;
28
+ lastAt = now;
29
+ const state = {
30
+ times: ++times,
31
+ startAt,
32
+ stopAt,
33
+ pauseAt,
34
+ resumeAt,
35
+ currentAt: now,
36
+ elapsedTime: startAt > 0 ? now - startAt : 0,
37
+ runningTime,
38
+ intervalTime
39
+ };
40
+ if (effect.length === 2) effect(state, () => {
41
+ nextTime(execute);
42
+ });
43
+ else {
44
+ effect(state);
45
+ nextTime(execute);
46
+ }
47
+ };
48
+ const canStart = () => status === STATUS_READY;
49
+ const start = () => {
50
+ if (!canStart()) return;
51
+ status = STATUS_START;
52
+ startAt = Date.now();
53
+ execute();
54
+ };
55
+ const canStop = () => status === STATUS_START;
56
+ const stop = () => {
57
+ if (!canStop()) return;
58
+ status = STATUS_STOP;
59
+ stopAt = Date.now();
60
+ };
61
+ const canPause = () => status === STATUS_START;
62
+ const pause = () => {
63
+ if (!canPause()) return;
64
+ status = STATUS_PAUSE;
65
+ pauseAt = Date.now();
66
+ };
67
+ const canResume = () => status === STATUS_PAUSE;
68
+ const resume = () => {
69
+ if (!canResume()) return;
70
+ status = STATUS_START;
71
+ resumeAt = Date.now();
72
+ lastAt = resumeAt;
73
+ execute();
74
+ };
75
+ return {
76
+ canStart,
77
+ canStop,
78
+ canPause,
79
+ canResume,
80
+ start,
81
+ stop,
82
+ pause,
83
+ resume,
84
+ execute
85
+ };
80
86
  }
87
+ /**
88
+ * 创建一个基于 `setTimeout` 的间隔定时器
89
+ *
90
+ * @param callback - 每次间隔执行的回调函数,接收定时器状态和可选的 `next` 函数
91
+ * @param interval - 间隔时间,单位为毫秒
92
+ * @param options - 配置选项
93
+ * @returns {TimerHandler}
94
+ */
81
95
  function timeInterval(callback, interval, options) {
82
- let timeId;
83
- const { canStart, canStop, canPause, canResume, start, stop, pause, resume, execute } = makeInterval((call) => {
84
- timeId = setTimeout(call, interval);
85
- }, callback);
86
- return {
87
- start() {
88
- if (!canStart()) return;
89
- if (options?.leading) {
90
- start();
91
- } else {
92
- timeId = setTimeout(start, interval);
93
- }
94
- },
95
- stop() {
96
- if (!canStop()) return;
97
- if (options?.trailing) execute();
98
- clearTimeout(timeId);
99
- stop();
100
- },
101
- pause() {
102
- if (!canPause()) return;
103
- if (options?.trailing) execute();
104
- clearTimeout(timeId);
105
- pause();
106
- },
107
- resume(immediate) {
108
- if (!canResume()) return;
109
- if (immediate || options?.leading) {
110
- resume();
111
- } else {
112
- timeId = setTimeout(resume, interval);
113
- }
114
- }
115
- };
96
+ let timeId;
97
+ const { canStart, canStop, canPause, canResume, start, stop, pause, resume, execute } = makeInterval((call) => {
98
+ timeId = setTimeout(call, interval);
99
+ }, callback);
100
+ return {
101
+ start() {
102
+ if (!canStart()) return;
103
+ if (options?.leading) start();
104
+ else timeId = setTimeout(start, interval);
105
+ },
106
+ stop() {
107
+ if (!canStop()) return;
108
+ if (options?.trailing) execute();
109
+ clearTimeout(timeId);
110
+ stop();
111
+ },
112
+ pause() {
113
+ if (!canPause()) return;
114
+ if (options?.trailing) execute();
115
+ clearTimeout(timeId);
116
+ pause();
117
+ },
118
+ resume(immediate) {
119
+ if (!canResume()) return;
120
+ if (immediate || options?.leading) resume();
121
+ else timeId = setTimeout(resume, interval);
122
+ }
123
+ };
116
124
  }
125
+ //#endregion
117
126
  exports.makeInterval = makeInterval;
118
127
  exports.timeInterval = timeInterval;
119
- //# sourceMappingURL=timer.cjs.map
128
+
129
+ //# sourceMappingURL=timer.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"timer.cjs","sources":["../src/timer.ts"],"sourcesContent":["/**\n * 定时器状态接口\n */\nexport type TimerState = {\n /**\n * 执行次数\n */\n times: number;\n /**\n * 开始时间戳\n */\n startAt: number;\n /**\n * 停止时间戳\n */\n stopAt: number;\n /**\n * 暂停时间戳\n */\n pauseAt: number;\n /**\n * 恢复时间戳\n */\n resumeAt: number;\n /**\n * 当前时间戳\n */\n currentAt: number;\n /**\n * 总耗时(包括暂停时间)\n */\n elapsedTime: number;\n /**\n * 实际运行时间(不包括暂停时间)\n */\n runningTime: number;\n /**\n * 当前间隔时间\n */\n intervalTime: number;\n};\n\nexport type TimerHandler = {\n /**\n * 开始\n */\n start: () => void;\n /**\n * 暂停\n */\n pause: () => void;\n /**\n * 恢复\n */\n resume: (immediate?: boolean) => void;\n /**\n * 停止\n */\n stop: () => void;\n};\n\nconst STATUS_READY = 0;\nconst STATUS_START = 1;\nconst STATUS_PAUSE = 2;\nconst STATUS_STOP = 3;\n\n/**\n * 创建间隔定时器核心函数\n *\n * @param nextTime - 用于安排下一次执行的函数\n * @param effect - 每次执行的回调函数,接收定时器状态和可选的next函数\n * @returns 返回包含控制方法的对象\n */\nexport function makeInterval(\n nextTime: (call: () => void) => void,\n effect: (timer: TimerState, next?: () => void) => unknown,\n) {\n let startAt = 0;\n let lastAt = 0;\n let stopAt = 0;\n let pauseAt = 0;\n let resumeAt = 0;\n let times = 0;\n let status = STATUS_READY;\n let runningTime = 0;\n\n const execute = () => {\n if (status >= STATUS_PAUSE) return;\n\n const now = Date.now();\n const intervalTime = lastAt > 0 ? now - lastAt : 0;\n runningTime += intervalTime;\n lastAt = now;\n const state: TimerState = {\n times: ++times,\n startAt,\n stopAt,\n pauseAt,\n resumeAt,\n currentAt: now,\n elapsedTime: startAt > 0 ? now - startAt : 0,\n runningTime,\n intervalTime,\n };\n\n if (effect.length === 2) {\n effect(state, () => {\n nextTime(execute);\n });\n } else {\n effect(state);\n nextTime(execute);\n }\n };\n\n const canStart = () => status === STATUS_READY;\n const start = () => {\n if (!canStart()) return;\n status = STATUS_START;\n startAt = Date.now();\n execute();\n };\n\n const canStop = () => status === STATUS_START;\n const stop = () => {\n if (!canStop()) return;\n status = STATUS_STOP;\n stopAt = Date.now();\n };\n\n const canPause = () => status === STATUS_START;\n const pause = () => {\n if (!canPause()) return;\n status = STATUS_PAUSE;\n pauseAt = Date.now();\n };\n\n const canResume = () => status === STATUS_PAUSE;\n const resume = () => {\n if (!canResume()) return;\n status = STATUS_START;\n resumeAt = Date.now();\n lastAt = resumeAt;\n execute();\n };\n\n return {\n canStart,\n canStop,\n canPause,\n canResume,\n start,\n stop,\n pause,\n resume,\n execute,\n };\n}\n\nexport type TimerOptions = {\n /**\n * 是否在定时器开始时立即执行回调\n */\n leading?: boolean;\n /**\n * 是否在定时器停止时执行最后一次回调\n */\n trailing?: boolean;\n};\n\n/**\n * 创建一个基于 `setTimeout` 的间隔定时器\n *\n * @param callback - 每次间隔执行的回调函数,接收定时器状态和可选的 `next` 函数\n * @param interval - 间隔时间,单位为毫秒\n * @param options - 配置选项\n * @returns {TimerHandler}\n */\nexport function timeInterval(\n callback: (state: TimerState, next?: () => void) => unknown,\n interval: number,\n options?: TimerOptions,\n): TimerHandler {\n let timeId: number | NodeJS.Timeout;\n const { canStart, canStop, canPause, canResume, start, stop, pause, resume, execute } = makeInterval((call) => {\n timeId = setTimeout(call, interval);\n }, callback);\n\n return {\n start() {\n if (!canStart()) return;\n\n if (options?.leading) {\n start();\n } else {\n timeId = setTimeout(start, interval);\n }\n },\n\n stop() {\n if (!canStop()) return;\n if (options?.trailing) execute();\n\n clearTimeout(timeId);\n stop();\n },\n\n pause() {\n if (!canPause()) return;\n if (options?.trailing) execute();\n\n clearTimeout(timeId);\n pause();\n },\n\n resume(immediate?: boolean) {\n if (!canResume()) return;\n\n if (immediate || options?.leading) {\n resume();\n } else {\n timeId = setTimeout(resume, interval);\n }\n },\n };\n}\n"],"names":[],"mappings":";;AA6DA,MAAM,eAAe;AACrB,MAAM,eAAe;AACrB,MAAM,eAAe;AACrB,MAAM,cAAc;AASJ,SAAA,aACd,UACA,QACA;AACA,MAAI,UAAU;AACd,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,WAAW;AACf,MAAI,QAAQ;AACZ,MAAI,SAAS;AACb,MAAI,cAAc;AAElB,QAAM,UAAU,MAAM;AACpB,QAAI,UAAU,aAAc;AAEtB,UAAA,MAAM,KAAK,IAAI;AACrB,UAAM,eAAe,SAAS,IAAI,MAAM,SAAS;AAClC,mBAAA;AACN,aAAA;AACT,UAAM,QAAoB;AAAA,MACxB,OAAO,EAAE;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,aAAa,UAAU,IAAI,MAAM,UAAU;AAAA,MAC3C;AAAA,MACA;AAAA,IACF;AAEI,QAAA,OAAO,WAAW,GAAG;AACvB,aAAO,OAAO,MAAM;AAClB,iBAAS,OAAO;AAAA,MAAA,CACjB;AAAA,IAAA,OACI;AACL,aAAO,KAAK;AACZ,eAAS,OAAO;AAAA,IAAA;AAAA,EAEpB;AAEM,QAAA,WAAW,MAAM,WAAW;AAClC,QAAM,QAAQ,MAAM;AACd,QAAA,CAAC,WAAY;AACR,aAAA;AACT,cAAU,KAAK,IAAI;AACX,YAAA;AAAA,EACV;AAEM,QAAA,UAAU,MAAM,WAAW;AACjC,QAAM,OAAO,MAAM;AACb,QAAA,CAAC,UAAW;AACP,aAAA;AACT,aAAS,KAAK,IAAI;AAAA,EACpB;AAEM,QAAA,WAAW,MAAM,WAAW;AAClC,QAAM,QAAQ,MAAM;AACd,QAAA,CAAC,WAAY;AACR,aAAA;AACT,cAAU,KAAK,IAAI;AAAA,EACrB;AAEM,QAAA,YAAY,MAAM,WAAW;AACnC,QAAM,SAAS,MAAM;AACf,QAAA,CAAC,YAAa;AACT,aAAA;AACT,eAAW,KAAK,IAAI;AACX,aAAA;AACD,YAAA;AAAA,EACV;AAEO,SAAA;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAqBgB,SAAA,aACd,UACA,UACA,SACc;AACV,MAAA;AACJ,QAAM,EAAE,UAAU,SAAS,UAAU,WAAW,OAAO,MAAM,OAAO,QAAQ,QAAY,IAAA,aAAa,CAAC,SAAS;AACpG,aAAA,WAAW,MAAM,QAAQ;AAAA,KACjC,QAAQ;AAEJ,SAAA;AAAA,IACL,QAAQ;AACF,UAAA,CAAC,WAAY;AAEjB,UAAI,SAAS,SAAS;AACd,cAAA;AAAA,MAAA,OACD;AACI,iBAAA,WAAW,OAAO,QAAQ;AAAA,MAAA;AAAA,IAEvC;AAAA,IAEA,OAAO;AACD,UAAA,CAAC,UAAW;AACZ,UAAA,SAAS,SAAkB,SAAA;AAE/B,mBAAa,MAAM;AACd,WAAA;AAAA,IACP;AAAA,IAEA,QAAQ;AACF,UAAA,CAAC,WAAY;AACb,UAAA,SAAS,SAAkB,SAAA;AAE/B,mBAAa,MAAM;AACb,YAAA;AAAA,IACR;AAAA,IAEA,OAAO,WAAqB;AACtB,UAAA,CAAC,YAAa;AAEd,UAAA,aAAa,SAAS,SAAS;AAC1B,eAAA;AAAA,MAAA,OACF;AACI,iBAAA,WAAW,QAAQ,QAAQ;AAAA,MAAA;AAAA,IACtC;AAAA,EAEJ;AACF;;;"}
1
+ {"version":3,"file":"timer.cjs","names":[],"sources":["../src/timer.ts"],"sourcesContent":["/**\n * 定时器状态接口\n */\nexport type TimerState = {\n /**\n * 执行次数\n */\n times: number;\n /**\n * 开始时间戳\n */\n startAt: number;\n /**\n * 停止时间戳\n */\n stopAt: number;\n /**\n * 暂停时间戳\n */\n pauseAt: number;\n /**\n * 恢复时间戳\n */\n resumeAt: number;\n /**\n * 当前时间戳\n */\n currentAt: number;\n /**\n * 总耗时(包括暂停时间)\n */\n elapsedTime: number;\n /**\n * 实际运行时间(不包括暂停时间)\n */\n runningTime: number;\n /**\n * 当前间隔时间\n */\n intervalTime: number;\n};\n\nexport type TimerHandler = {\n /**\n * 开始\n */\n start: () => void;\n /**\n * 暂停\n */\n pause: () => void;\n /**\n * 恢复\n */\n resume: (immediate?: boolean) => void;\n /**\n * 停止\n */\n stop: () => void;\n};\n\nconst STATUS_READY = 0;\nconst STATUS_START = 1;\nconst STATUS_PAUSE = 2;\nconst STATUS_STOP = 3;\n\n/**\n * 创建间隔定时器核心函数\n *\n * @param nextTime - 用于安排下一次执行的函数\n * @param effect - 每次执行的回调函数,接收定时器状态和可选的next函数\n * @returns 返回包含控制方法的对象\n */\nexport function makeInterval(\n nextTime: (call: () => void) => void,\n effect: (timer: TimerState, next?: () => void) => unknown,\n) {\n let startAt = 0;\n let lastAt = 0;\n let stopAt = 0;\n let pauseAt = 0;\n let resumeAt = 0;\n let times = 0;\n let status = STATUS_READY;\n let runningTime = 0;\n\n const execute = () => {\n if (status >= STATUS_PAUSE) return;\n\n const now = Date.now();\n const intervalTime = lastAt > 0 ? now - lastAt : 0;\n runningTime += intervalTime;\n lastAt = now;\n const state: TimerState = {\n times: ++times,\n startAt,\n stopAt,\n pauseAt,\n resumeAt,\n currentAt: now,\n elapsedTime: startAt > 0 ? now - startAt : 0,\n runningTime,\n intervalTime,\n };\n\n if (effect.length === 2) {\n effect(state, () => {\n nextTime(execute);\n });\n } else {\n effect(state);\n nextTime(execute);\n }\n };\n\n const canStart = () => status === STATUS_READY;\n const start = () => {\n if (!canStart()) return;\n status = STATUS_START;\n startAt = Date.now();\n execute();\n };\n\n const canStop = () => status === STATUS_START;\n const stop = () => {\n if (!canStop()) return;\n status = STATUS_STOP;\n stopAt = Date.now();\n };\n\n const canPause = () => status === STATUS_START;\n const pause = () => {\n if (!canPause()) return;\n status = STATUS_PAUSE;\n pauseAt = Date.now();\n };\n\n const canResume = () => status === STATUS_PAUSE;\n const resume = () => {\n if (!canResume()) return;\n status = STATUS_START;\n resumeAt = Date.now();\n lastAt = resumeAt;\n execute();\n };\n\n return {\n canStart,\n canStop,\n canPause,\n canResume,\n start,\n stop,\n pause,\n resume,\n execute,\n };\n}\n\nexport type TimerOptions = {\n /**\n * 是否在定时器开始时立即执行回调\n */\n leading?: boolean;\n /**\n * 是否在定时器停止时执行最后一次回调\n */\n trailing?: boolean;\n};\n\n/**\n * 创建一个基于 `setTimeout` 的间隔定时器\n *\n * @param callback - 每次间隔执行的回调函数,接收定时器状态和可选的 `next` 函数\n * @param interval - 间隔时间,单位为毫秒\n * @param options - 配置选项\n * @returns {TimerHandler}\n */\nexport function timeInterval(\n callback: (state: TimerState, next?: () => void) => unknown,\n interval: number,\n options?: TimerOptions,\n): TimerHandler {\n let timeId: number | NodeJS.Timeout;\n const { canStart, canStop, canPause, canResume, start, stop, pause, resume, execute } = makeInterval((call) => {\n timeId = setTimeout(call, interval);\n }, callback);\n\n return {\n start() {\n if (!canStart()) return;\n\n if (options?.leading) {\n start();\n } else {\n timeId = setTimeout(start, interval);\n }\n },\n\n stop() {\n if (!canStop()) return;\n if (options?.trailing) execute();\n\n clearTimeout(timeId);\n stop();\n },\n\n pause() {\n if (!canPause()) return;\n if (options?.trailing) execute();\n\n clearTimeout(timeId);\n pause();\n },\n\n resume(immediate?: boolean) {\n if (!canResume()) return;\n\n if (immediate || options?.leading) {\n resume();\n } else {\n timeId = setTimeout(resume, interval);\n }\n },\n };\n}\n"],"mappings":";;AA6DA,IAAM,eAAe;AACrB,IAAM,eAAe;AACrB,IAAM,eAAe;AACrB,IAAM,cAAc;;;;;;;;AASpB,SAAgB,aACd,UACA,QACA;CACA,IAAI,UAAU;CACd,IAAI,SAAS;CACb,IAAI,SAAS;CACb,IAAI,UAAU;CACd,IAAI,WAAW;CACf,IAAI,QAAQ;CACZ,IAAI,SAAS;CACb,IAAI,cAAc;CAElB,MAAM,gBAAgB;EACpB,IAAI,UAAU,cAAc;EAE5B,MAAM,MAAM,KAAK,KAAK;EACtB,MAAM,eAAe,SAAS,IAAI,MAAM,SAAS;EACjD,eAAe;EACf,SAAS;EACT,MAAM,QAAoB;GACxB,OAAO,EAAE;GACT;GACA;GACA;GACA;GACA,WAAW;GACX,aAAa,UAAU,IAAI,MAAM,UAAU;GAC3C;GACA;GACD;EAED,IAAI,OAAO,WAAW,GACpB,OAAO,aAAa;GAClB,SAAS,QAAQ;IACjB;OACG;GACL,OAAO,MAAM;GACb,SAAS,QAAQ;;;CAIrB,MAAM,iBAAiB,WAAW;CAClC,MAAM,cAAc;EAClB,IAAI,CAAC,UAAU,EAAE;EACjB,SAAS;EACT,UAAU,KAAK,KAAK;EACpB,SAAS;;CAGX,MAAM,gBAAgB,WAAW;CACjC,MAAM,aAAa;EACjB,IAAI,CAAC,SAAS,EAAE;EAChB,SAAS;EACT,SAAS,KAAK,KAAK;;CAGrB,MAAM,iBAAiB,WAAW;CAClC,MAAM,cAAc;EAClB,IAAI,CAAC,UAAU,EAAE;EACjB,SAAS;EACT,UAAU,KAAK,KAAK;;CAGtB,MAAM,kBAAkB,WAAW;CACnC,MAAM,eAAe;EACnB,IAAI,CAAC,WAAW,EAAE;EAClB,SAAS;EACT,WAAW,KAAK,KAAK;EACrB,SAAS;EACT,SAAS;;CAGX,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;;;;;;;;;;AAsBH,SAAgB,aACd,UACA,UACA,SACc;CACd,IAAI;CACJ,MAAM,EAAE,UAAU,SAAS,UAAU,WAAW,OAAO,MAAM,OAAO,QAAQ,YAAY,cAAc,SAAS;EAC7G,SAAS,WAAW,MAAM,SAAS;IAClC,SAAS;CAEZ,OAAO;EACL,QAAQ;GACN,IAAI,CAAC,UAAU,EAAE;GAEjB,IAAI,SAAS,SACX,OAAO;QAEP,SAAS,WAAW,OAAO,SAAS;;EAIxC,OAAO;GACL,IAAI,CAAC,SAAS,EAAE;GAChB,IAAI,SAAS,UAAU,SAAS;GAEhC,aAAa,OAAO;GACpB,MAAM;;EAGR,QAAQ;GACN,IAAI,CAAC,UAAU,EAAE;GACjB,IAAI,SAAS,UAAU,SAAS;GAEhC,aAAa,OAAO;GACpB,OAAO;;EAGT,OAAO,WAAqB;GAC1B,IAAI,CAAC,WAAW,EAAE;GAElB,IAAI,aAAa,SAAS,SACxB,QAAQ;QAER,SAAS,WAAW,QAAQ,SAAS;;EAG1C"}
package/dist/timer.mjs CHANGED
@@ -1,119 +1,127 @@
1
- const STATUS_READY = 0;
2
- const STATUS_START = 1;
3
- const STATUS_PAUSE = 2;
4
- const STATUS_STOP = 3;
1
+ //#region src/timer.ts
2
+ var STATUS_READY = 0;
3
+ var STATUS_START = 1;
4
+ var STATUS_PAUSE = 2;
5
+ var STATUS_STOP = 3;
6
+ /**
7
+ * 创建间隔定时器核心函数
8
+ *
9
+ * @param nextTime - 用于安排下一次执行的函数
10
+ * @param effect - 每次执行的回调函数,接收定时器状态和可选的next函数
11
+ * @returns 返回包含控制方法的对象
12
+ */
5
13
  function makeInterval(nextTime, effect) {
6
- let startAt = 0;
7
- let lastAt = 0;
8
- let stopAt = 0;
9
- let pauseAt = 0;
10
- let resumeAt = 0;
11
- let times = 0;
12
- let status = STATUS_READY;
13
- let runningTime = 0;
14
- const execute = () => {
15
- if (status >= STATUS_PAUSE) return;
16
- const now = Date.now();
17
- const intervalTime = lastAt > 0 ? now - lastAt : 0;
18
- runningTime += intervalTime;
19
- lastAt = now;
20
- const state = {
21
- times: ++times,
22
- startAt,
23
- stopAt,
24
- pauseAt,
25
- resumeAt,
26
- currentAt: now,
27
- elapsedTime: startAt > 0 ? now - startAt : 0,
28
- runningTime,
29
- intervalTime
30
- };
31
- if (effect.length === 2) {
32
- effect(state, () => {
33
- nextTime(execute);
34
- });
35
- } else {
36
- effect(state);
37
- nextTime(execute);
38
- }
39
- };
40
- const canStart = () => status === STATUS_READY;
41
- const start = () => {
42
- if (!canStart()) return;
43
- status = STATUS_START;
44
- startAt = Date.now();
45
- execute();
46
- };
47
- const canStop = () => status === STATUS_START;
48
- const stop = () => {
49
- if (!canStop()) return;
50
- status = STATUS_STOP;
51
- stopAt = Date.now();
52
- };
53
- const canPause = () => status === STATUS_START;
54
- const pause = () => {
55
- if (!canPause()) return;
56
- status = STATUS_PAUSE;
57
- pauseAt = Date.now();
58
- };
59
- const canResume = () => status === STATUS_PAUSE;
60
- const resume = () => {
61
- if (!canResume()) return;
62
- status = STATUS_START;
63
- resumeAt = Date.now();
64
- lastAt = resumeAt;
65
- execute();
66
- };
67
- return {
68
- canStart,
69
- canStop,
70
- canPause,
71
- canResume,
72
- start,
73
- stop,
74
- pause,
75
- resume,
76
- execute
77
- };
14
+ let startAt = 0;
15
+ let lastAt = 0;
16
+ let stopAt = 0;
17
+ let pauseAt = 0;
18
+ let resumeAt = 0;
19
+ let times = 0;
20
+ let status = STATUS_READY;
21
+ let runningTime = 0;
22
+ const execute = () => {
23
+ if (status >= STATUS_PAUSE) return;
24
+ const now = Date.now();
25
+ const intervalTime = lastAt > 0 ? now - lastAt : 0;
26
+ runningTime += intervalTime;
27
+ lastAt = now;
28
+ const state = {
29
+ times: ++times,
30
+ startAt,
31
+ stopAt,
32
+ pauseAt,
33
+ resumeAt,
34
+ currentAt: now,
35
+ elapsedTime: startAt > 0 ? now - startAt : 0,
36
+ runningTime,
37
+ intervalTime
38
+ };
39
+ if (effect.length === 2) effect(state, () => {
40
+ nextTime(execute);
41
+ });
42
+ else {
43
+ effect(state);
44
+ nextTime(execute);
45
+ }
46
+ };
47
+ const canStart = () => status === STATUS_READY;
48
+ const start = () => {
49
+ if (!canStart()) return;
50
+ status = STATUS_START;
51
+ startAt = Date.now();
52
+ execute();
53
+ };
54
+ const canStop = () => status === STATUS_START;
55
+ const stop = () => {
56
+ if (!canStop()) return;
57
+ status = STATUS_STOP;
58
+ stopAt = Date.now();
59
+ };
60
+ const canPause = () => status === STATUS_START;
61
+ const pause = () => {
62
+ if (!canPause()) return;
63
+ status = STATUS_PAUSE;
64
+ pauseAt = Date.now();
65
+ };
66
+ const canResume = () => status === STATUS_PAUSE;
67
+ const resume = () => {
68
+ if (!canResume()) return;
69
+ status = STATUS_START;
70
+ resumeAt = Date.now();
71
+ lastAt = resumeAt;
72
+ execute();
73
+ };
74
+ return {
75
+ canStart,
76
+ canStop,
77
+ canPause,
78
+ canResume,
79
+ start,
80
+ stop,
81
+ pause,
82
+ resume,
83
+ execute
84
+ };
78
85
  }
86
+ /**
87
+ * 创建一个基于 `setTimeout` 的间隔定时器
88
+ *
89
+ * @param callback - 每次间隔执行的回调函数,接收定时器状态和可选的 `next` 函数
90
+ * @param interval - 间隔时间,单位为毫秒
91
+ * @param options - 配置选项
92
+ * @returns {TimerHandler}
93
+ */
79
94
  function timeInterval(callback, interval, options) {
80
- let timeId;
81
- const { canStart, canStop, canPause, canResume, start, stop, pause, resume, execute } = makeInterval((call) => {
82
- timeId = setTimeout(call, interval);
83
- }, callback);
84
- return {
85
- start() {
86
- if (!canStart()) return;
87
- if (options?.leading) {
88
- start();
89
- } else {
90
- timeId = setTimeout(start, interval);
91
- }
92
- },
93
- stop() {
94
- if (!canStop()) return;
95
- if (options?.trailing) execute();
96
- clearTimeout(timeId);
97
- stop();
98
- },
99
- pause() {
100
- if (!canPause()) return;
101
- if (options?.trailing) execute();
102
- clearTimeout(timeId);
103
- pause();
104
- },
105
- resume(immediate) {
106
- if (!canResume()) return;
107
- if (immediate || options?.leading) {
108
- resume();
109
- } else {
110
- timeId = setTimeout(resume, interval);
111
- }
112
- }
113
- };
95
+ let timeId;
96
+ const { canStart, canStop, canPause, canResume, start, stop, pause, resume, execute } = makeInterval((call) => {
97
+ timeId = setTimeout(call, interval);
98
+ }, callback);
99
+ return {
100
+ start() {
101
+ if (!canStart()) return;
102
+ if (options?.leading) start();
103
+ else timeId = setTimeout(start, interval);
104
+ },
105
+ stop() {
106
+ if (!canStop()) return;
107
+ if (options?.trailing) execute();
108
+ clearTimeout(timeId);
109
+ stop();
110
+ },
111
+ pause() {
112
+ if (!canPause()) return;
113
+ if (options?.trailing) execute();
114
+ clearTimeout(timeId);
115
+ pause();
116
+ },
117
+ resume(immediate) {
118
+ if (!canResume()) return;
119
+ if (immediate || options?.leading) resume();
120
+ else timeId = setTimeout(resume, interval);
121
+ }
122
+ };
114
123
  }
115
- export {
116
- makeInterval,
117
- timeInterval
118
- };
119
- //# sourceMappingURL=timer.mjs.map
124
+ //#endregion
125
+ export { makeInterval, timeInterval };
126
+
127
+ //# sourceMappingURL=timer.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"timer.mjs","sources":["../src/timer.ts"],"sourcesContent":["/**\n * 定时器状态接口\n */\nexport type TimerState = {\n /**\n * 执行次数\n */\n times: number;\n /**\n * 开始时间戳\n */\n startAt: number;\n /**\n * 停止时间戳\n */\n stopAt: number;\n /**\n * 暂停时间戳\n */\n pauseAt: number;\n /**\n * 恢复时间戳\n */\n resumeAt: number;\n /**\n * 当前时间戳\n */\n currentAt: number;\n /**\n * 总耗时(包括暂停时间)\n */\n elapsedTime: number;\n /**\n * 实际运行时间(不包括暂停时间)\n */\n runningTime: number;\n /**\n * 当前间隔时间\n */\n intervalTime: number;\n};\n\nexport type TimerHandler = {\n /**\n * 开始\n */\n start: () => void;\n /**\n * 暂停\n */\n pause: () => void;\n /**\n * 恢复\n */\n resume: (immediate?: boolean) => void;\n /**\n * 停止\n */\n stop: () => void;\n};\n\nconst STATUS_READY = 0;\nconst STATUS_START = 1;\nconst STATUS_PAUSE = 2;\nconst STATUS_STOP = 3;\n\n/**\n * 创建间隔定时器核心函数\n *\n * @param nextTime - 用于安排下一次执行的函数\n * @param effect - 每次执行的回调函数,接收定时器状态和可选的next函数\n * @returns 返回包含控制方法的对象\n */\nexport function makeInterval(\n nextTime: (call: () => void) => void,\n effect: (timer: TimerState, next?: () => void) => unknown,\n) {\n let startAt = 0;\n let lastAt = 0;\n let stopAt = 0;\n let pauseAt = 0;\n let resumeAt = 0;\n let times = 0;\n let status = STATUS_READY;\n let runningTime = 0;\n\n const execute = () => {\n if (status >= STATUS_PAUSE) return;\n\n const now = Date.now();\n const intervalTime = lastAt > 0 ? now - lastAt : 0;\n runningTime += intervalTime;\n lastAt = now;\n const state: TimerState = {\n times: ++times,\n startAt,\n stopAt,\n pauseAt,\n resumeAt,\n currentAt: now,\n elapsedTime: startAt > 0 ? now - startAt : 0,\n runningTime,\n intervalTime,\n };\n\n if (effect.length === 2) {\n effect(state, () => {\n nextTime(execute);\n });\n } else {\n effect(state);\n nextTime(execute);\n }\n };\n\n const canStart = () => status === STATUS_READY;\n const start = () => {\n if (!canStart()) return;\n status = STATUS_START;\n startAt = Date.now();\n execute();\n };\n\n const canStop = () => status === STATUS_START;\n const stop = () => {\n if (!canStop()) return;\n status = STATUS_STOP;\n stopAt = Date.now();\n };\n\n const canPause = () => status === STATUS_START;\n const pause = () => {\n if (!canPause()) return;\n status = STATUS_PAUSE;\n pauseAt = Date.now();\n };\n\n const canResume = () => status === STATUS_PAUSE;\n const resume = () => {\n if (!canResume()) return;\n status = STATUS_START;\n resumeAt = Date.now();\n lastAt = resumeAt;\n execute();\n };\n\n return {\n canStart,\n canStop,\n canPause,\n canResume,\n start,\n stop,\n pause,\n resume,\n execute,\n };\n}\n\nexport type TimerOptions = {\n /**\n * 是否在定时器开始时立即执行回调\n */\n leading?: boolean;\n /**\n * 是否在定时器停止时执行最后一次回调\n */\n trailing?: boolean;\n};\n\n/**\n * 创建一个基于 `setTimeout` 的间隔定时器\n *\n * @param callback - 每次间隔执行的回调函数,接收定时器状态和可选的 `next` 函数\n * @param interval - 间隔时间,单位为毫秒\n * @param options - 配置选项\n * @returns {TimerHandler}\n */\nexport function timeInterval(\n callback: (state: TimerState, next?: () => void) => unknown,\n interval: number,\n options?: TimerOptions,\n): TimerHandler {\n let timeId: number | NodeJS.Timeout;\n const { canStart, canStop, canPause, canResume, start, stop, pause, resume, execute } = makeInterval((call) => {\n timeId = setTimeout(call, interval);\n }, callback);\n\n return {\n start() {\n if (!canStart()) return;\n\n if (options?.leading) {\n start();\n } else {\n timeId = setTimeout(start, interval);\n }\n },\n\n stop() {\n if (!canStop()) return;\n if (options?.trailing) execute();\n\n clearTimeout(timeId);\n stop();\n },\n\n pause() {\n if (!canPause()) return;\n if (options?.trailing) execute();\n\n clearTimeout(timeId);\n pause();\n },\n\n resume(immediate?: boolean) {\n if (!canResume()) return;\n\n if (immediate || options?.leading) {\n resume();\n } else {\n timeId = setTimeout(resume, interval);\n }\n },\n };\n}\n"],"names":[],"mappings":"AA6DA,MAAM,eAAe;AACrB,MAAM,eAAe;AACrB,MAAM,eAAe;AACrB,MAAM,cAAc;AASJ,SAAA,aACd,UACA,QACA;AACA,MAAI,UAAU;AACd,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,WAAW;AACf,MAAI,QAAQ;AACZ,MAAI,SAAS;AACb,MAAI,cAAc;AAElB,QAAM,UAAU,MAAM;AACpB,QAAI,UAAU,aAAc;AAEtB,UAAA,MAAM,KAAK,IAAI;AACrB,UAAM,eAAe,SAAS,IAAI,MAAM,SAAS;AAClC,mBAAA;AACN,aAAA;AACT,UAAM,QAAoB;AAAA,MACxB,OAAO,EAAE;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,aAAa,UAAU,IAAI,MAAM,UAAU;AAAA,MAC3C;AAAA,MACA;AAAA,IACF;AAEI,QAAA,OAAO,WAAW,GAAG;AACvB,aAAO,OAAO,MAAM;AAClB,iBAAS,OAAO;AAAA,MAAA,CACjB;AAAA,IAAA,OACI;AACL,aAAO,KAAK;AACZ,eAAS,OAAO;AAAA,IAAA;AAAA,EAEpB;AAEM,QAAA,WAAW,MAAM,WAAW;AAClC,QAAM,QAAQ,MAAM;AACd,QAAA,CAAC,WAAY;AACR,aAAA;AACT,cAAU,KAAK,IAAI;AACX,YAAA;AAAA,EACV;AAEM,QAAA,UAAU,MAAM,WAAW;AACjC,QAAM,OAAO,MAAM;AACb,QAAA,CAAC,UAAW;AACP,aAAA;AACT,aAAS,KAAK,IAAI;AAAA,EACpB;AAEM,QAAA,WAAW,MAAM,WAAW;AAClC,QAAM,QAAQ,MAAM;AACd,QAAA,CAAC,WAAY;AACR,aAAA;AACT,cAAU,KAAK,IAAI;AAAA,EACrB;AAEM,QAAA,YAAY,MAAM,WAAW;AACnC,QAAM,SAAS,MAAM;AACf,QAAA,CAAC,YAAa;AACT,aAAA;AACT,eAAW,KAAK,IAAI;AACX,aAAA;AACD,YAAA;AAAA,EACV;AAEO,SAAA;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAqBgB,SAAA,aACd,UACA,UACA,SACc;AACV,MAAA;AACJ,QAAM,EAAE,UAAU,SAAS,UAAU,WAAW,OAAO,MAAM,OAAO,QAAQ,QAAY,IAAA,aAAa,CAAC,SAAS;AACpG,aAAA,WAAW,MAAM,QAAQ;AAAA,KACjC,QAAQ;AAEJ,SAAA;AAAA,IACL,QAAQ;AACF,UAAA,CAAC,WAAY;AAEjB,UAAI,SAAS,SAAS;AACd,cAAA;AAAA,MAAA,OACD;AACI,iBAAA,WAAW,OAAO,QAAQ;AAAA,MAAA;AAAA,IAEvC;AAAA,IAEA,OAAO;AACD,UAAA,CAAC,UAAW;AACZ,UAAA,SAAS,SAAkB,SAAA;AAE/B,mBAAa,MAAM;AACd,WAAA;AAAA,IACP;AAAA,IAEA,QAAQ;AACF,UAAA,CAAC,WAAY;AACb,UAAA,SAAS,SAAkB,SAAA;AAE/B,mBAAa,MAAM;AACb,YAAA;AAAA,IACR;AAAA,IAEA,OAAO,WAAqB;AACtB,UAAA,CAAC,YAAa;AAEd,UAAA,aAAa,SAAS,SAAS;AAC1B,eAAA;AAAA,MAAA,OACF;AACI,iBAAA,WAAW,QAAQ,QAAQ;AAAA,MAAA;AAAA,IACtC;AAAA,EAEJ;AACF;"}
1
+ {"version":3,"file":"timer.mjs","names":[],"sources":["../src/timer.ts"],"sourcesContent":["/**\n * 定时器状态接口\n */\nexport type TimerState = {\n /**\n * 执行次数\n */\n times: number;\n /**\n * 开始时间戳\n */\n startAt: number;\n /**\n * 停止时间戳\n */\n stopAt: number;\n /**\n * 暂停时间戳\n */\n pauseAt: number;\n /**\n * 恢复时间戳\n */\n resumeAt: number;\n /**\n * 当前时间戳\n */\n currentAt: number;\n /**\n * 总耗时(包括暂停时间)\n */\n elapsedTime: number;\n /**\n * 实际运行时间(不包括暂停时间)\n */\n runningTime: number;\n /**\n * 当前间隔时间\n */\n intervalTime: number;\n};\n\nexport type TimerHandler = {\n /**\n * 开始\n */\n start: () => void;\n /**\n * 暂停\n */\n pause: () => void;\n /**\n * 恢复\n */\n resume: (immediate?: boolean) => void;\n /**\n * 停止\n */\n stop: () => void;\n};\n\nconst STATUS_READY = 0;\nconst STATUS_START = 1;\nconst STATUS_PAUSE = 2;\nconst STATUS_STOP = 3;\n\n/**\n * 创建间隔定时器核心函数\n *\n * @param nextTime - 用于安排下一次执行的函数\n * @param effect - 每次执行的回调函数,接收定时器状态和可选的next函数\n * @returns 返回包含控制方法的对象\n */\nexport function makeInterval(\n nextTime: (call: () => void) => void,\n effect: (timer: TimerState, next?: () => void) => unknown,\n) {\n let startAt = 0;\n let lastAt = 0;\n let stopAt = 0;\n let pauseAt = 0;\n let resumeAt = 0;\n let times = 0;\n let status = STATUS_READY;\n let runningTime = 0;\n\n const execute = () => {\n if (status >= STATUS_PAUSE) return;\n\n const now = Date.now();\n const intervalTime = lastAt > 0 ? now - lastAt : 0;\n runningTime += intervalTime;\n lastAt = now;\n const state: TimerState = {\n times: ++times,\n startAt,\n stopAt,\n pauseAt,\n resumeAt,\n currentAt: now,\n elapsedTime: startAt > 0 ? now - startAt : 0,\n runningTime,\n intervalTime,\n };\n\n if (effect.length === 2) {\n effect(state, () => {\n nextTime(execute);\n });\n } else {\n effect(state);\n nextTime(execute);\n }\n };\n\n const canStart = () => status === STATUS_READY;\n const start = () => {\n if (!canStart()) return;\n status = STATUS_START;\n startAt = Date.now();\n execute();\n };\n\n const canStop = () => status === STATUS_START;\n const stop = () => {\n if (!canStop()) return;\n status = STATUS_STOP;\n stopAt = Date.now();\n };\n\n const canPause = () => status === STATUS_START;\n const pause = () => {\n if (!canPause()) return;\n status = STATUS_PAUSE;\n pauseAt = Date.now();\n };\n\n const canResume = () => status === STATUS_PAUSE;\n const resume = () => {\n if (!canResume()) return;\n status = STATUS_START;\n resumeAt = Date.now();\n lastAt = resumeAt;\n execute();\n };\n\n return {\n canStart,\n canStop,\n canPause,\n canResume,\n start,\n stop,\n pause,\n resume,\n execute,\n };\n}\n\nexport type TimerOptions = {\n /**\n * 是否在定时器开始时立即执行回调\n */\n leading?: boolean;\n /**\n * 是否在定时器停止时执行最后一次回调\n */\n trailing?: boolean;\n};\n\n/**\n * 创建一个基于 `setTimeout` 的间隔定时器\n *\n * @param callback - 每次间隔执行的回调函数,接收定时器状态和可选的 `next` 函数\n * @param interval - 间隔时间,单位为毫秒\n * @param options - 配置选项\n * @returns {TimerHandler}\n */\nexport function timeInterval(\n callback: (state: TimerState, next?: () => void) => unknown,\n interval: number,\n options?: TimerOptions,\n): TimerHandler {\n let timeId: number | NodeJS.Timeout;\n const { canStart, canStop, canPause, canResume, start, stop, pause, resume, execute } = makeInterval((call) => {\n timeId = setTimeout(call, interval);\n }, callback);\n\n return {\n start() {\n if (!canStart()) return;\n\n if (options?.leading) {\n start();\n } else {\n timeId = setTimeout(start, interval);\n }\n },\n\n stop() {\n if (!canStop()) return;\n if (options?.trailing) execute();\n\n clearTimeout(timeId);\n stop();\n },\n\n pause() {\n if (!canPause()) return;\n if (options?.trailing) execute();\n\n clearTimeout(timeId);\n pause();\n },\n\n resume(immediate?: boolean) {\n if (!canResume()) return;\n\n if (immediate || options?.leading) {\n resume();\n } else {\n timeId = setTimeout(resume, interval);\n }\n },\n };\n}\n"],"mappings":";AA6DA,IAAM,eAAe;AACrB,IAAM,eAAe;AACrB,IAAM,eAAe;AACrB,IAAM,cAAc;;;;;;;;AASpB,SAAgB,aACd,UACA,QACA;CACA,IAAI,UAAU;CACd,IAAI,SAAS;CACb,IAAI,SAAS;CACb,IAAI,UAAU;CACd,IAAI,WAAW;CACf,IAAI,QAAQ;CACZ,IAAI,SAAS;CACb,IAAI,cAAc;CAElB,MAAM,gBAAgB;EACpB,IAAI,UAAU,cAAc;EAE5B,MAAM,MAAM,KAAK,KAAK;EACtB,MAAM,eAAe,SAAS,IAAI,MAAM,SAAS;EACjD,eAAe;EACf,SAAS;EACT,MAAM,QAAoB;GACxB,OAAO,EAAE;GACT;GACA;GACA;GACA;GACA,WAAW;GACX,aAAa,UAAU,IAAI,MAAM,UAAU;GAC3C;GACA;GACD;EAED,IAAI,OAAO,WAAW,GACpB,OAAO,aAAa;GAClB,SAAS,QAAQ;IACjB;OACG;GACL,OAAO,MAAM;GACb,SAAS,QAAQ;;;CAIrB,MAAM,iBAAiB,WAAW;CAClC,MAAM,cAAc;EAClB,IAAI,CAAC,UAAU,EAAE;EACjB,SAAS;EACT,UAAU,KAAK,KAAK;EACpB,SAAS;;CAGX,MAAM,gBAAgB,WAAW;CACjC,MAAM,aAAa;EACjB,IAAI,CAAC,SAAS,EAAE;EAChB,SAAS;EACT,SAAS,KAAK,KAAK;;CAGrB,MAAM,iBAAiB,WAAW;CAClC,MAAM,cAAc;EAClB,IAAI,CAAC,UAAU,EAAE;EACjB,SAAS;EACT,UAAU,KAAK,KAAK;;CAGtB,MAAM,kBAAkB,WAAW;CACnC,MAAM,eAAe;EACnB,IAAI,CAAC,WAAW,EAAE;EAClB,SAAS;EACT,WAAW,KAAK,KAAK;EACrB,SAAS;EACT,SAAS;;CAGX,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;;;;;;;;;;AAsBH,SAAgB,aACd,UACA,UACA,SACc;CACd,IAAI;CACJ,MAAM,EAAE,UAAU,SAAS,UAAU,WAAW,OAAO,MAAM,OAAO,QAAQ,YAAY,cAAc,SAAS;EAC7G,SAAS,WAAW,MAAM,SAAS;IAClC,SAAS;CAEZ,OAAO;EACL,QAAQ;GACN,IAAI,CAAC,UAAU,EAAE;GAEjB,IAAI,SAAS,SACX,OAAO;QAEP,SAAS,WAAW,OAAO,SAAS;;EAIxC,OAAO;GACL,IAAI,CAAC,SAAS,EAAE;GAChB,IAAI,SAAS,UAAU,SAAS;GAEhC,aAAa,OAAO;GACpB,MAAM;;EAGR,QAAQ;GACN,IAAI,CAAC,UAAU,EAAE;GACjB,IAAI,SAAS,UAAU,SAAS;GAEhC,aAAa,OAAO;GACpB,OAAO;;EAGT,OAAO,WAAqB;GAC1B,IAAI,CAAC,WAAW,EAAE;GAElB,IAAI,aAAa,SAAS,SACxB,QAAQ;QAER,SAAS,WAAW,QAAQ,SAAS;;EAG1C"}