@pawells/typescript-common 1.0.0

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 (311) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +148 -0
  3. package/build/array/array-chunk.d.ts +10 -0
  4. package/build/array/array-chunk.d.ts.map +1 -0
  5. package/build/array/array-chunk.js +19 -0
  6. package/build/array/array-chunk.js.map +1 -0
  7. package/build/array/array-compact.d.ts +18 -0
  8. package/build/array/array-compact.d.ts.map +1 -0
  9. package/build/array/array-compact.js +22 -0
  10. package/build/array/array-compact.js.map +1 -0
  11. package/build/array/array-contains.d.ts +9 -0
  12. package/build/array/array-contains.d.ts.map +1 -0
  13. package/build/array/array-contains.js +13 -0
  14. package/build/array/array-contains.js.map +1 -0
  15. package/build/array/array-count-by.d.ts +21 -0
  16. package/build/array/array-count-by.d.ts.map +1 -0
  17. package/build/array/array-count-by.js +29 -0
  18. package/build/array/array-count-by.js.map +1 -0
  19. package/build/array/array-difference.d.ts +25 -0
  20. package/build/array/array-difference.d.ts.map +1 -0
  21. package/build/array/array-difference.js +34 -0
  22. package/build/array/array-difference.js.map +1 -0
  23. package/build/array/array-element.d.ts +7 -0
  24. package/build/array/array-element.d.ts.map +1 -0
  25. package/build/array/array-element.js +2 -0
  26. package/build/array/array-element.js.map +1 -0
  27. package/build/array/array-filter.d.ts +37 -0
  28. package/build/array/array-filter.d.ts.map +1 -0
  29. package/build/array/array-filter.js +78 -0
  30. package/build/array/array-filter.js.map +1 -0
  31. package/build/array/array-flatten.d.ts +16 -0
  32. package/build/array/array-flatten.d.ts.map +1 -0
  33. package/build/array/array-flatten.js +20 -0
  34. package/build/array/array-flatten.js.map +1 -0
  35. package/build/array/array-group-by.d.ts +13 -0
  36. package/build/array/array-group-by.d.ts.map +1 -0
  37. package/build/array/array-group-by.js +24 -0
  38. package/build/array/array-group-by.js.map +1 -0
  39. package/build/array/array-intersection.d.ts +25 -0
  40. package/build/array/array-intersection.d.ts.map +1 -0
  41. package/build/array/array-intersection.js +39 -0
  42. package/build/array/array-intersection.js.map +1 -0
  43. package/build/array/array-partition.d.ts +19 -0
  44. package/build/array/array-partition.d.ts.map +1 -0
  45. package/build/array/array-partition.js +32 -0
  46. package/build/array/array-partition.js.map +1 -0
  47. package/build/array/array-range.d.ts +18 -0
  48. package/build/array/array-range.d.ts.map +1 -0
  49. package/build/array/array-range.js +30 -0
  50. package/build/array/array-range.js.map +1 -0
  51. package/build/array/array-sample.d.ts +29 -0
  52. package/build/array/array-sample.d.ts.map +1 -0
  53. package/build/array/array-sample.js +19 -0
  54. package/build/array/array-sample.js.map +1 -0
  55. package/build/array/array-shuffle.d.ts +8 -0
  56. package/build/array/array-shuffle.d.ts.map +1 -0
  57. package/build/array/array-shuffle.js +19 -0
  58. package/build/array/array-shuffle.js.map +1 -0
  59. package/build/array/array-sort-by.d.ts +20 -0
  60. package/build/array/array-sort-by.d.ts.map +1 -0
  61. package/build/array/array-sort-by.js +31 -0
  62. package/build/array/array-sort-by.js.map +1 -0
  63. package/build/array/array-zip.d.ts +22 -0
  64. package/build/array/array-zip.d.ts.map +1 -0
  65. package/build/array/array-zip.js +25 -0
  66. package/build/array/array-zip.js.map +1 -0
  67. package/build/array/array.test.d.ts +2 -0
  68. package/build/array/array.test.d.ts.map +1 -0
  69. package/build/array/array.test.js +347 -0
  70. package/build/array/array.test.js.map +1 -0
  71. package/build/array/index.d.ts +27 -0
  72. package/build/array/index.d.ts.map +1 -0
  73. package/build/array/index.js +25 -0
  74. package/build/array/index.js.map +1 -0
  75. package/build/array/types.d.ts +32 -0
  76. package/build/array/types.d.ts.map +1 -0
  77. package/build/array/types.js +2 -0
  78. package/build/array/types.js.map +1 -0
  79. package/build/array/unique.d.ts +8 -0
  80. package/build/array/unique.d.ts.map +1 -0
  81. package/build/array/unique.js +13 -0
  82. package/build/array/unique.js.map +1 -0
  83. package/build/enum/enum-entries.d.ts +11 -0
  84. package/build/enum/enum-entries.d.ts.map +1 -0
  85. package/build/enum/enum-entries.js +14 -0
  86. package/build/enum/enum-entries.js.map +1 -0
  87. package/build/enum/enum-key-by-value.d.ts +13 -0
  88. package/build/enum/enum-key-by-value.d.ts.map +1 -0
  89. package/build/enum/enum-key-by-value.js +21 -0
  90. package/build/enum/enum-key-by-value.js.map +1 -0
  91. package/build/enum/enum-keys.d.ts +10 -0
  92. package/build/enum/enum-keys.d.ts.map +1 -0
  93. package/build/enum/enum-keys.js +14 -0
  94. package/build/enum/enum-keys.js.map +1 -0
  95. package/build/enum/enum-safe-value.d.ts +14 -0
  96. package/build/enum/enum-safe-value.d.ts.map +1 -0
  97. package/build/enum/enum-safe-value.js +16 -0
  98. package/build/enum/enum-safe-value.js.map +1 -0
  99. package/build/enum/enum-values.d.ts +19 -0
  100. package/build/enum/enum-values.d.ts.map +1 -0
  101. package/build/enum/enum-values.js +25 -0
  102. package/build/enum/enum-values.js.map +1 -0
  103. package/build/enum/enum.test.d.ts +2 -0
  104. package/build/enum/enum.test.d.ts.map +1 -0
  105. package/build/enum/enum.test.js +122 -0
  106. package/build/enum/enum.test.js.map +1 -0
  107. package/build/enum/index.d.ts +17 -0
  108. package/build/enum/index.d.ts.map +1 -0
  109. package/build/enum/index.js +17 -0
  110. package/build/enum/index.js.map +1 -0
  111. package/build/enum/types.d.ts +9 -0
  112. package/build/enum/types.d.ts.map +1 -0
  113. package/build/enum/types.js +2 -0
  114. package/build/enum/types.js.map +1 -0
  115. package/build/enum/validate-enum-value.d.ts +13 -0
  116. package/build/enum/validate-enum-value.d.ts.map +1 -0
  117. package/build/enum/validate-enum-value.js +18 -0
  118. package/build/enum/validate-enum-value.js.map +1 -0
  119. package/build/function/compose.d.ts +37 -0
  120. package/build/function/compose.d.ts.map +1 -0
  121. package/build/function/compose.js +7 -0
  122. package/build/function/compose.js.map +1 -0
  123. package/build/function/debounce.d.ts +25 -0
  124. package/build/function/debounce.d.ts.map +1 -0
  125. package/build/function/debounce.js +37 -0
  126. package/build/function/debounce.js.map +1 -0
  127. package/build/function/function.test.d.ts +2 -0
  128. package/build/function/function.test.d.ts.map +1 -0
  129. package/build/function/function.test.js +158 -0
  130. package/build/function/function.test.js.map +1 -0
  131. package/build/function/index.d.ts +17 -0
  132. package/build/function/index.d.ts.map +1 -0
  133. package/build/function/index.js +16 -0
  134. package/build/function/index.js.map +1 -0
  135. package/build/function/memoize.d.ts +23 -0
  136. package/build/function/memoize.d.ts.map +1 -0
  137. package/build/function/memoize.js +34 -0
  138. package/build/function/memoize.js.map +1 -0
  139. package/build/function/once.d.ts +17 -0
  140. package/build/function/once.d.ts.map +1 -0
  141. package/build/function/once.js +27 -0
  142. package/build/function/once.js.map +1 -0
  143. package/build/function/sleep.d.ts +20 -0
  144. package/build/function/sleep.d.ts.map +1 -0
  145. package/build/function/sleep.js +22 -0
  146. package/build/function/sleep.js.map +1 -0
  147. package/build/function/throttle.d.ts +17 -0
  148. package/build/function/throttle.d.ts.map +1 -0
  149. package/build/function/throttle.js +37 -0
  150. package/build/function/throttle.js.map +1 -0
  151. package/build/function/types.d.ts +5 -0
  152. package/build/function/types.d.ts.map +1 -0
  153. package/build/function/types.js +2 -0
  154. package/build/function/types.js.map +1 -0
  155. package/build/index.d.ts +32 -0
  156. package/build/index.d.ts.map +1 -0
  157. package/build/index.js +51 -0
  158. package/build/index.js.map +1 -0
  159. package/build/object/assert-object.d.ts +8 -0
  160. package/build/object/assert-object.d.ts.map +1 -0
  161. package/build/object/assert-object.js +10 -0
  162. package/build/object/assert-object.js.map +1 -0
  163. package/build/object/clone.d.ts +39 -0
  164. package/build/object/clone.d.ts.map +1 -0
  165. package/build/object/clone.js +85 -0
  166. package/build/object/clone.js.map +1 -0
  167. package/build/object/equals.d.ts +44 -0
  168. package/build/object/equals.d.ts.map +1 -0
  169. package/build/object/equals.js +104 -0
  170. package/build/object/equals.js.map +1 -0
  171. package/build/object/filter-cached.d.ts +9 -0
  172. package/build/object/filter-cached.d.ts.map +1 -0
  173. package/build/object/filter-cached.js +108 -0
  174. package/build/object/filter-cached.js.map +1 -0
  175. package/build/object/filter.d.ts +85 -0
  176. package/build/object/filter.d.ts.map +1 -0
  177. package/build/object/filter.js +248 -0
  178. package/build/object/filter.js.map +1 -0
  179. package/build/object/has-circular-reference.d.ts +8 -0
  180. package/build/object/has-circular-reference.d.ts.map +1 -0
  181. package/build/object/has-circular-reference.js +40 -0
  182. package/build/object/has-circular-reference.js.map +1 -0
  183. package/build/object/hash.d.ts +20 -0
  184. package/build/object/hash.d.ts.map +1 -0
  185. package/build/object/hash.js +39 -0
  186. package/build/object/hash.js.map +1 -0
  187. package/build/object/index.d.ts +32 -0
  188. package/build/object/index.d.ts.map +1 -0
  189. package/build/object/index.js +30 -0
  190. package/build/object/index.js.map +1 -0
  191. package/build/object/key-value-pairs.d.ts +21 -0
  192. package/build/object/key-value-pairs.d.ts.map +1 -0
  193. package/build/object/key-value-pairs.js +28 -0
  194. package/build/object/key-value-pairs.js.map +1 -0
  195. package/build/object/map-cached.d.ts +9 -0
  196. package/build/object/map-cached.d.ts.map +1 -0
  197. package/build/object/map-cached.js +97 -0
  198. package/build/object/map-cached.js.map +1 -0
  199. package/build/object/map.d.ts +29 -0
  200. package/build/object/map.d.ts.map +1 -0
  201. package/build/object/map.js +40 -0
  202. package/build/object/map.js.map +1 -0
  203. package/build/object/merge.d.ts +14 -0
  204. package/build/object/merge.d.ts.map +1 -0
  205. package/build/object/merge.js +41 -0
  206. package/build/object/merge.js.map +1 -0
  207. package/build/object/object-diff.d.ts +40 -0
  208. package/build/object/object-diff.d.ts.map +1 -0
  209. package/build/object/object-diff.js +45 -0
  210. package/build/object/object-diff.js.map +1 -0
  211. package/build/object/object-flatten.d.ts +22 -0
  212. package/build/object/object-flatten.d.ts.map +1 -0
  213. package/build/object/object-flatten.js +38 -0
  214. package/build/object/object-flatten.js.map +1 -0
  215. package/build/object/object-invert.d.ts +20 -0
  216. package/build/object/object-invert.d.ts.map +1 -0
  217. package/build/object/object-invert.js +26 -0
  218. package/build/object/object-invert.js.map +1 -0
  219. package/build/object/object.test.d.ts +2 -0
  220. package/build/object/object.test.d.ts.map +1 -0
  221. package/build/object/object.test.js +432 -0
  222. package/build/object/object.test.js.map +1 -0
  223. package/build/object/omit.d.ts +8 -0
  224. package/build/object/omit.d.ts.map +1 -0
  225. package/build/object/omit.js +17 -0
  226. package/build/object/omit.js.map +1 -0
  227. package/build/object/pick.d.ts +50 -0
  228. package/build/object/pick.d.ts.map +1 -0
  229. package/build/object/pick.js +60 -0
  230. package/build/object/pick.js.map +1 -0
  231. package/build/object/property-paths.d.ts +115 -0
  232. package/build/object/property-paths.d.ts.map +1 -0
  233. package/build/object/property-paths.js +170 -0
  234. package/build/object/property-paths.js.map +1 -0
  235. package/build/object/security-utils.d.ts +59 -0
  236. package/build/object/security-utils.d.ts.map +1 -0
  237. package/build/object/security-utils.js +165 -0
  238. package/build/object/security-utils.js.map +1 -0
  239. package/build/object/sort-keys.d.ts +26 -0
  240. package/build/object/sort-keys.d.ts.map +1 -0
  241. package/build/object/sort-keys.js +52 -0
  242. package/build/object/sort-keys.js.map +1 -0
  243. package/build/object/types.d.ts +152 -0
  244. package/build/object/types.d.ts.map +1 -0
  245. package/build/object/types.js +6 -0
  246. package/build/object/types.js.map +1 -0
  247. package/build/string/case-conversion.d.ts +50 -0
  248. package/build/string/case-conversion.d.ts.map +1 -0
  249. package/build/string/case-conversion.js +94 -0
  250. package/build/string/case-conversion.js.map +1 -0
  251. package/build/string/formatting.d.ts +108 -0
  252. package/build/string/formatting.d.ts.map +1 -0
  253. package/build/string/formatting.js +171 -0
  254. package/build/string/formatting.js.map +1 -0
  255. package/build/string/index.d.ts +15 -0
  256. package/build/string/index.d.ts.map +1 -0
  257. package/build/string/index.js +14 -0
  258. package/build/string/index.js.map +1 -0
  259. package/build/string/string.test.d.ts +2 -0
  260. package/build/string/string.test.d.ts.map +1 -0
  261. package/build/string/string.test.js +321 -0
  262. package/build/string/string.test.js.map +1 -0
  263. package/build/string/transformation.d.ts +18 -0
  264. package/build/string/transformation.d.ts.map +1 -0
  265. package/build/string/transformation.js +32 -0
  266. package/build/string/transformation.js.map +1 -0
  267. package/build/string/types.d.ts +44 -0
  268. package/build/string/types.d.ts.map +1 -0
  269. package/build/string/types.js +2 -0
  270. package/build/string/types.js.map +1 -0
  271. package/build/string/validation.d.ts +18 -0
  272. package/build/string/validation.d.ts.map +1 -0
  273. package/build/string/validation.js +26 -0
  274. package/build/string/validation.js.map +1 -0
  275. package/build/time/elapsed-time/constants.d.ts +10 -0
  276. package/build/time/elapsed-time/constants.d.ts.map +1 -0
  277. package/build/time/elapsed-time/constants.js +96 -0
  278. package/build/time/elapsed-time/constants.js.map +1 -0
  279. package/build/time/elapsed-time/elapsed-time.d.ts +412 -0
  280. package/build/time/elapsed-time/elapsed-time.d.ts.map +1 -0
  281. package/build/time/elapsed-time/elapsed-time.js +652 -0
  282. package/build/time/elapsed-time/elapsed-time.js.map +1 -0
  283. package/build/time/elapsed-time/types.d.ts +150 -0
  284. package/build/time/elapsed-time/types.d.ts.map +1 -0
  285. package/build/time/elapsed-time/types.js +2 -0
  286. package/build/time/elapsed-time/types.js.map +1 -0
  287. package/build/time/elapsed-time/utils.d.ts +18 -0
  288. package/build/time/elapsed-time/utils.d.ts.map +1 -0
  289. package/build/time/elapsed-time/utils.js +24 -0
  290. package/build/time/elapsed-time/utils.js.map +1 -0
  291. package/build/time/index.d.ts +18 -0
  292. package/build/time/index.d.ts.map +1 -0
  293. package/build/time/index.js +17 -0
  294. package/build/time/index.js.map +1 -0
  295. package/build/time/stopwatch/entry-types.d.ts +13 -0
  296. package/build/time/stopwatch/entry-types.d.ts.map +1 -0
  297. package/build/time/stopwatch/entry-types.js +2 -0
  298. package/build/time/stopwatch/entry-types.js.map +1 -0
  299. package/build/time/stopwatch/entry.d.ts +80 -0
  300. package/build/time/stopwatch/entry.d.ts.map +1 -0
  301. package/build/time/stopwatch/entry.js +105 -0
  302. package/build/time/stopwatch/entry.js.map +1 -0
  303. package/build/time/stopwatch/stopwatch.d.ts +232 -0
  304. package/build/time/stopwatch/stopwatch.d.ts.map +1 -0
  305. package/build/time/stopwatch/stopwatch.js +315 -0
  306. package/build/time/stopwatch/stopwatch.js.map +1 -0
  307. package/build/time/time.test.d.ts +2 -0
  308. package/build/time/time.test.d.ts.map +1 -0
  309. package/build/time/time.test.js +211 -0
  310. package/build/time/time.test.js.map +1 -0
  311. package/package.json +63 -0
@@ -0,0 +1,232 @@
1
+ import { ElapsedTime } from '../elapsed-time/elapsed-time.js';
2
+ import { StopwatchEntry } from './entry.js';
3
+ /**
4
+ * Represents a stopwatch for measuring time intervals.
5
+ *
6
+ * A `Stopwatch` records a chronological list of {@link StopwatchEntry} timestamps
7
+ * and can be started, stopped, paused, resumed, lapped, and reset. The elapsed
8
+ * time is computed from the recorded entries rather than an active timer, so it
9
+ * is always accurate even after the stopwatch has been stopped.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * // Basic start/stop usage
14
+ * const sw = new Stopwatch();
15
+ * sw.Start();
16
+ * // ... do work ...
17
+ * sw.Stop();
18
+ * console.log(sw.Elapsed.Format('CONCISE')); // e.g. "1s 250ms"
19
+ *
20
+ * // Start immediately via constructor
21
+ * const sw2 = new Stopwatch(true);
22
+ * // ... do work ...
23
+ * console.log(sw2.Elapsed.Format('MEDIUM')); // e.g. "2 sec 300 ms"
24
+ * ```
25
+ */
26
+ export declare class Stopwatch {
27
+ private _times;
28
+ private _pausedAt;
29
+ /**
30
+ * Creates a new `Stopwatch` instance.
31
+ *
32
+ * @param startImmediately - When `true`, calls {@link Start} automatically
33
+ * so the stopwatch begins tracking time as soon as it is constructed.
34
+ * Defaults to `false`.
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * const sw = new Stopwatch(); // not yet running
39
+ * const sw2 = new Stopwatch(true); // running immediately
40
+ * ```
41
+ */
42
+ constructor(startImmediately?: boolean);
43
+ /**
44
+ * Whether the stopwatch is currently running (started and not paused/stopped).
45
+ *
46
+ * @returns `true` if the stopwatch has been started and is not currently paused or stopped.
47
+ */
48
+ get Running(): boolean;
49
+ /**
50
+ * The first entry recorded by this stopwatch (i.e. the start entry).
51
+ *
52
+ * @returns The first {@link StopwatchEntry}, or `undefined` if the stopwatch
53
+ * has never been started.
54
+ */
55
+ get First(): StopwatchEntry | undefined;
56
+ /**
57
+ * The most recently recorded entry.
58
+ *
59
+ * @returns The latest {@link StopwatchEntry}, or `undefined` if no entries
60
+ * have been recorded yet.
61
+ */
62
+ get Latest(): StopwatchEntry | undefined;
63
+ /**
64
+ * The total time elapsed since the stopwatch was first started.
65
+ *
66
+ * - While the stopwatch is **running**, this reflects the time between the
67
+ * first entry and `Date.now()`.
68
+ * - While the stopwatch is **paused or stopped**, this reflects the time
69
+ * between the first entry and the moment it was paused/stopped.
70
+ * - Returns an {@link ElapsedTime} of `0` if the stopwatch has never been started.
71
+ *
72
+ * @example
73
+ * ```typescript
74
+ * const sw = new Stopwatch(true);
75
+ * // ... 500ms later ...
76
+ * sw.Stop();
77
+ * console.log(sw.Elapsed.Format()); // "500ms"
78
+ * ```
79
+ */
80
+ get Elapsed(): ElapsedTime;
81
+ /**
82
+ * A shallow copy of all recorded {@link StopwatchEntry} objects in
83
+ * chronological order.
84
+ *
85
+ * Modifying the returned array does not affect the internal state.
86
+ */
87
+ get Times(): StopwatchEntry[];
88
+ /**
89
+ * Alias for {@link Times}. Returns a shallow copy of all recorded entries.
90
+ */
91
+ get Entries(): StopwatchEntry[];
92
+ /**
93
+ * The timestamp (milliseconds since epoch) at which the stopwatch was last
94
+ * paused or stopped, or `null` if it is currently running.
95
+ */
96
+ get PausedAt(): number | null;
97
+ /**
98
+ * Starts the stopwatch by recording an initial timestamp entry.
99
+ *
100
+ * If the stopwatch has already been started, this is a no-op and the
101
+ * existing latest entry is returned without creating a new one.
102
+ *
103
+ * @returns The start {@link StopwatchEntry} that was recorded, or `undefined`
104
+ * if the stopwatch was already running (should not happen in practice).
105
+ *
106
+ * @example
107
+ * ```typescript
108
+ * const sw = new Stopwatch();
109
+ * const entry = sw.Start();
110
+ * console.log(sw.Running); // true
111
+ * ```
112
+ */
113
+ Start(): StopwatchEntry | undefined;
114
+ /**
115
+ * Stops the stopwatch by recording a final timestamp entry.
116
+ *
117
+ * - If the stopwatch is currently running, the current time is recorded as
118
+ * the stop entry and `_pausedAt` is set to freeze the elapsed time.
119
+ * - If the stopwatch has already been stopped, the latest entry is returned
120
+ * unchanged (idempotent).
121
+ * - If the stopwatch was never started, returns `undefined`.
122
+ *
123
+ * @returns The stop {@link StopwatchEntry}, or `undefined` if the stopwatch
124
+ * had not been started.
125
+ *
126
+ * @example
127
+ * ```typescript
128
+ * const sw = new Stopwatch(true);
129
+ * // ... some work ...
130
+ * const stopEntry = sw.Stop();
131
+ * console.log(sw.Running); // false
132
+ * console.log(sw.Elapsed.Format()); // e.g. "500ms"
133
+ * ```
134
+ */
135
+ Stop(): StopwatchEntry | undefined;
136
+ /**
137
+ * Pauses the stopwatch, freezing the elapsed time at the current moment.
138
+ *
139
+ * If the stopwatch has not been started, returns `null`. Unlike {@link Stop},
140
+ * `Pause` does not record a new timestamp entry — it only sets the internal
141
+ * pause marker so that subsequent reads of {@link Elapsed} return a frozen value.
142
+ *
143
+ * @returns The latest {@link StopwatchEntry} at the time of pausing, or `null`
144
+ * if the stopwatch had not been started.
145
+ *
146
+ * @example
147
+ * ```typescript
148
+ * const sw = new Stopwatch(true);
149
+ * // ... 200ms ...
150
+ * sw.Pause();
151
+ * // ... 500ms later ...
152
+ * console.log(sw.Elapsed.Format()); // still "200ms"
153
+ * sw.Resume();
154
+ * ```
155
+ */
156
+ Pause(): StopwatchEntry | null;
157
+ /**
158
+ * Resumes a paused stopwatch by recording a new timestamp entry.
159
+ *
160
+ * If the stopwatch is not currently paused, returns `null` and has no effect.
161
+ * After resuming, elapsed-time calculations continue to accumulate from where
162
+ * they left off.
163
+ *
164
+ * @returns A new {@link StopwatchEntry} recording the resume time, or `null`
165
+ * if the stopwatch was not paused.
166
+ *
167
+ * @example
168
+ * ```typescript
169
+ * const sw = new Stopwatch(true);
170
+ * sw.Pause();
171
+ * const resumeEntry = sw.Resume();
172
+ * console.log(sw.Running); // true
173
+ * ```
174
+ */
175
+ Resume(): StopwatchEntry | null;
176
+ /**
177
+ * Records a click entry at the current moment without changing the
178
+ * running/paused state.
179
+ *
180
+ * If the stopwatch has no entries yet, the first click implicitly starts it.
181
+ * Use this for arbitrary timestamp recording or as the building block for
182
+ * {@link Lap}.
183
+ *
184
+ * @returns The newly recorded {@link StopwatchEntry}.
185
+ *
186
+ * @example
187
+ * ```typescript
188
+ * const sw = new Stopwatch(true);
189
+ * const mark = sw.Click();
190
+ * console.log(mark.Elapsed.Format()); // time since last click / start
191
+ * ```
192
+ */
193
+ Click(): StopwatchEntry;
194
+ /**
195
+ * Records a lap by clicking the stopwatch and returning the elapsed time
196
+ * since the previous entry.
197
+ *
198
+ * Internally calls {@link Click} to record a new entry, then computes the
199
+ * difference between the new entry's timestamp and the previous one.
200
+ * Returns `ElapsedTime(0)` if this is the very first entry recorded.
201
+ *
202
+ * @returns An {@link ElapsedTime} representing the lap duration.
203
+ *
204
+ * @example
205
+ * ```typescript
206
+ * const sw = new Stopwatch(true);
207
+ * // ... 300ms ...
208
+ * const lap1 = sw.Lap(); // ~300ms
209
+ * // ... 150ms ...
210
+ * const lap2 = sw.Lap(); // ~150ms
211
+ * ```
212
+ */
213
+ Lap(): ElapsedTime;
214
+ /**
215
+ * Resets the stopwatch to its initial state by clearing all recorded entries
216
+ * and removing any pause/stop marker.
217
+ *
218
+ * After calling `Reset()`, the stopwatch is in the same state as a freshly
219
+ * constructed instance. Call {@link Start} to begin timing again.
220
+ *
221
+ * @example
222
+ * ```typescript
223
+ * const sw = new Stopwatch(true);
224
+ * sw.Stop();
225
+ * sw.Reset();
226
+ * console.log(sw.Running); // false
227
+ * console.log(sw.Times); // []
228
+ * ```
229
+ */
230
+ Reset(): void;
231
+ }
232
+ //# sourceMappingURL=stopwatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stopwatch.d.ts","sourceRoot":"","sources":["../../../src/time/stopwatch/stopwatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,SAAS;IACrB,OAAO,CAAC,MAAM,CAAwB;IAEtC,OAAO,CAAC,SAAS,CAAuB;IAExC;;;;;;;;;;;;OAYG;gBACS,gBAAgB,GAAE,OAAe;IAM7C;;;;OAIG;IACH,IAAW,OAAO,IAAI,OAAO,CAE5B;IAED;;;;;OAKG;IACH,IAAW,KAAK,IAAI,cAAc,GAAG,SAAS,CAE7C;IAED;;;;;OAKG;IACH,IAAW,MAAM,IAAI,cAAc,GAAG,SAAS,CAE9C;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,IAAW,OAAO,IAAI,WAAW,CAYhC;IAED;;;;;OAKG;IACH,IAAW,KAAK,IAAI,cAAc,EAAE,CAEnC;IAED;;OAEG;IACH,IAAW,OAAO,IAAI,cAAc,EAAE,CAErC;IAED;;;OAGG;IACH,IAAW,QAAQ,IAAI,MAAM,GAAG,IAAI,CAEnC;IAED;;;;;;;;;;;;;;;OAeG;IACI,KAAK,IAAI,cAAc,GAAG,SAAS;IAU1C;;;;;;;;;;;;;;;;;;;;OAoBG;IACI,IAAI,IAAI,cAAc,GAAG,SAAS;IAkBzC;;;;;;;;;;;;;;;;;;;OAmBG;IACI,KAAK,IAAI,cAAc,GAAG,IAAI;IAQrC;;;;;;;;;;;;;;;;;OAiBG;IACI,MAAM,IAAI,cAAc,GAAG,IAAI;IAWtC;;;;;;;;;;;;;;;;OAgBG;IACI,KAAK,IAAI,cAAc;IAW9B;;;;;;;;;;;;;;;;;;OAkBG;IACI,GAAG,IAAI,WAAW;IAUzB;;;;;;;;;;;;;;;OAeG;IACI,KAAK,IAAI,IAAI;CAIpB"}
@@ -0,0 +1,315 @@
1
+ import { ElapsedTime } from '../elapsed-time/elapsed-time.js';
2
+ import { StopwatchEntry } from './entry.js';
3
+ /**
4
+ * Represents a stopwatch for measuring time intervals.
5
+ *
6
+ * A `Stopwatch` records a chronological list of {@link StopwatchEntry} timestamps
7
+ * and can be started, stopped, paused, resumed, lapped, and reset. The elapsed
8
+ * time is computed from the recorded entries rather than an active timer, so it
9
+ * is always accurate even after the stopwatch has been stopped.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * // Basic start/stop usage
14
+ * const sw = new Stopwatch();
15
+ * sw.Start();
16
+ * // ... do work ...
17
+ * sw.Stop();
18
+ * console.log(sw.Elapsed.Format('CONCISE')); // e.g. "1s 250ms"
19
+ *
20
+ * // Start immediately via constructor
21
+ * const sw2 = new Stopwatch(true);
22
+ * // ... do work ...
23
+ * console.log(sw2.Elapsed.Format('MEDIUM')); // e.g. "2 sec 300 ms"
24
+ * ```
25
+ */
26
+ export class Stopwatch {
27
+ _times = [];
28
+ _pausedAt = null;
29
+ /**
30
+ * Creates a new `Stopwatch` instance.
31
+ *
32
+ * @param startImmediately - When `true`, calls {@link Start} automatically
33
+ * so the stopwatch begins tracking time as soon as it is constructed.
34
+ * Defaults to `false`.
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * const sw = new Stopwatch(); // not yet running
39
+ * const sw2 = new Stopwatch(true); // running immediately
40
+ * ```
41
+ */
42
+ constructor(startImmediately = false) {
43
+ if (startImmediately) {
44
+ this.Start();
45
+ }
46
+ }
47
+ /**
48
+ * Whether the stopwatch is currently running (started and not paused/stopped).
49
+ *
50
+ * @returns `true` if the stopwatch has been started and is not currently paused or stopped.
51
+ */
52
+ get Running() {
53
+ return this.First !== undefined && this._pausedAt === null;
54
+ }
55
+ /**
56
+ * The first entry recorded by this stopwatch (i.e. the start entry).
57
+ *
58
+ * @returns The first {@link StopwatchEntry}, or `undefined` if the stopwatch
59
+ * has never been started.
60
+ */
61
+ get First() {
62
+ return this._times.length === 0 ? undefined : this._times[0];
63
+ }
64
+ /**
65
+ * The most recently recorded entry.
66
+ *
67
+ * @returns The latest {@link StopwatchEntry}, or `undefined` if no entries
68
+ * have been recorded yet.
69
+ */
70
+ get Latest() {
71
+ return this._times.length === 0 ? undefined : this._times[this._times.length - 1];
72
+ }
73
+ /**
74
+ * The total time elapsed since the stopwatch was first started.
75
+ *
76
+ * - While the stopwatch is **running**, this reflects the time between the
77
+ * first entry and `Date.now()`.
78
+ * - While the stopwatch is **paused or stopped**, this reflects the time
79
+ * between the first entry and the moment it was paused/stopped.
80
+ * - Returns an {@link ElapsedTime} of `0` if the stopwatch has never been started.
81
+ *
82
+ * @example
83
+ * ```typescript
84
+ * const sw = new Stopwatch(true);
85
+ * // ... 500ms later ...
86
+ * sw.Stop();
87
+ * console.log(sw.Elapsed.Format()); // "500ms"
88
+ * ```
89
+ */
90
+ get Elapsed() {
91
+ const current = Date.now();
92
+ if (!this.Latest)
93
+ return new ElapsedTime(0);
94
+ const first = this.First;
95
+ if (!first)
96
+ return new ElapsedTime(0);
97
+ if (this._pausedAt !== null) {
98
+ return new ElapsedTime(this._pausedAt - first.timestamp);
99
+ }
100
+ return new ElapsedTime(current - first.timestamp);
101
+ }
102
+ /**
103
+ * A shallow copy of all recorded {@link StopwatchEntry} objects in
104
+ * chronological order.
105
+ *
106
+ * Modifying the returned array does not affect the internal state.
107
+ */
108
+ get Times() {
109
+ return [...this._times];
110
+ }
111
+ /**
112
+ * Alias for {@link Times}. Returns a shallow copy of all recorded entries.
113
+ */
114
+ get Entries() {
115
+ return this.Times;
116
+ }
117
+ /**
118
+ * The timestamp (milliseconds since epoch) at which the stopwatch was last
119
+ * paused or stopped, or `null` if it is currently running.
120
+ */
121
+ get PausedAt() {
122
+ return this._pausedAt;
123
+ }
124
+ /**
125
+ * Starts the stopwatch by recording an initial timestamp entry.
126
+ *
127
+ * If the stopwatch has already been started, this is a no-op and the
128
+ * existing latest entry is returned without creating a new one.
129
+ *
130
+ * @returns The start {@link StopwatchEntry} that was recorded, or `undefined`
131
+ * if the stopwatch was already running (should not happen in practice).
132
+ *
133
+ * @example
134
+ * ```typescript
135
+ * const sw = new Stopwatch();
136
+ * const entry = sw.Start();
137
+ * console.log(sw.Running); // true
138
+ * ```
139
+ */
140
+ Start() {
141
+ if (this.Latest)
142
+ return this.Latest;
143
+ this._pausedAt = null;
144
+ const entry = new StopwatchEntry(Date.now(), this, this._times.length);
145
+ this._times.push(entry);
146
+ return entry;
147
+ }
148
+ /**
149
+ * Stops the stopwatch by recording a final timestamp entry.
150
+ *
151
+ * - If the stopwatch is currently running, the current time is recorded as
152
+ * the stop entry and `_pausedAt` is set to freeze the elapsed time.
153
+ * - If the stopwatch has already been stopped, the latest entry is returned
154
+ * unchanged (idempotent).
155
+ * - If the stopwatch was never started, returns `undefined`.
156
+ *
157
+ * @returns The stop {@link StopwatchEntry}, or `undefined` if the stopwatch
158
+ * had not been started.
159
+ *
160
+ * @example
161
+ * ```typescript
162
+ * const sw = new Stopwatch(true);
163
+ * // ... some work ...
164
+ * const stopEntry = sw.Stop();
165
+ * console.log(sw.Running); // false
166
+ * console.log(sw.Elapsed.Format()); // e.g. "500ms"
167
+ * ```
168
+ */
169
+ Stop() {
170
+ const latest = this.Latest;
171
+ if (!latest)
172
+ return undefined;
173
+ if (this._pausedAt === null) {
174
+ // Not stopped yet, so stop it
175
+ const current = Date.now();
176
+ this._pausedAt = current;
177
+ const entry = new StopwatchEntry(current, this, this._times.length);
178
+ this._times.push(entry);
179
+ return entry;
180
+ }
181
+ else {
182
+ // Already stopped, just return latest
183
+ return latest;
184
+ }
185
+ }
186
+ /**
187
+ * Pauses the stopwatch, freezing the elapsed time at the current moment.
188
+ *
189
+ * If the stopwatch has not been started, returns `null`. Unlike {@link Stop},
190
+ * `Pause` does not record a new timestamp entry — it only sets the internal
191
+ * pause marker so that subsequent reads of {@link Elapsed} return a frozen value.
192
+ *
193
+ * @returns The latest {@link StopwatchEntry} at the time of pausing, or `null`
194
+ * if the stopwatch had not been started.
195
+ *
196
+ * @example
197
+ * ```typescript
198
+ * const sw = new Stopwatch(true);
199
+ * // ... 200ms ...
200
+ * sw.Pause();
201
+ * // ... 500ms later ...
202
+ * console.log(sw.Elapsed.Format()); // still "200ms"
203
+ * sw.Resume();
204
+ * ```
205
+ */
206
+ Pause() {
207
+ const latest = this.Latest;
208
+ if (!latest)
209
+ return null;
210
+ this._pausedAt = Date.now();
211
+ return latest;
212
+ }
213
+ /**
214
+ * Resumes a paused stopwatch by recording a new timestamp entry.
215
+ *
216
+ * If the stopwatch is not currently paused, returns `null` and has no effect.
217
+ * After resuming, elapsed-time calculations continue to accumulate from where
218
+ * they left off.
219
+ *
220
+ * @returns A new {@link StopwatchEntry} recording the resume time, or `null`
221
+ * if the stopwatch was not paused.
222
+ *
223
+ * @example
224
+ * ```typescript
225
+ * const sw = new Stopwatch(true);
226
+ * sw.Pause();
227
+ * const resumeEntry = sw.Resume();
228
+ * console.log(sw.Running); // true
229
+ * ```
230
+ */
231
+ Resume() {
232
+ if (this._pausedAt === null)
233
+ return null;
234
+ const current = Date.now();
235
+ this._pausedAt = null;
236
+ const entry = new StopwatchEntry(current, this, this._times.length);
237
+ this._times.push(entry);
238
+ return entry;
239
+ }
240
+ /**
241
+ * Records a click entry at the current moment without changing the
242
+ * running/paused state.
243
+ *
244
+ * If the stopwatch has no entries yet, the first click implicitly starts it.
245
+ * Use this for arbitrary timestamp recording or as the building block for
246
+ * {@link Lap}.
247
+ *
248
+ * @returns The newly recorded {@link StopwatchEntry}.
249
+ *
250
+ * @example
251
+ * ```typescript
252
+ * const sw = new Stopwatch(true);
253
+ * const mark = sw.Click();
254
+ * console.log(mark.Elapsed.Format()); // time since last click / start
255
+ * ```
256
+ */
257
+ Click() {
258
+ const current = Date.now();
259
+ if (this._times.length === 0) {
260
+ // First click starts the stopwatch
261
+ this._pausedAt = null;
262
+ }
263
+ const entry = new StopwatchEntry(current, this, this._times.length);
264
+ this._times.push(entry);
265
+ return entry;
266
+ }
267
+ /**
268
+ * Records a lap by clicking the stopwatch and returning the elapsed time
269
+ * since the previous entry.
270
+ *
271
+ * Internally calls {@link Click} to record a new entry, then computes the
272
+ * difference between the new entry's timestamp and the previous one.
273
+ * Returns `ElapsedTime(0)` if this is the very first entry recorded.
274
+ *
275
+ * @returns An {@link ElapsedTime} representing the lap duration.
276
+ *
277
+ * @example
278
+ * ```typescript
279
+ * const sw = new Stopwatch(true);
280
+ * // ... 300ms ...
281
+ * const lap1 = sw.Lap(); // ~300ms
282
+ * // ... 150ms ...
283
+ * const lap2 = sw.Lap(); // ~150ms
284
+ * ```
285
+ */
286
+ Lap() {
287
+ const previousLatest = this.Latest;
288
+ const newEntry = this.Click();
289
+ if (!previousLatest) {
290
+ return new ElapsedTime(0);
291
+ }
292
+ return new ElapsedTime(newEntry.timestamp - previousLatest.timestamp);
293
+ }
294
+ /**
295
+ * Resets the stopwatch to its initial state by clearing all recorded entries
296
+ * and removing any pause/stop marker.
297
+ *
298
+ * After calling `Reset()`, the stopwatch is in the same state as a freshly
299
+ * constructed instance. Call {@link Start} to begin timing again.
300
+ *
301
+ * @example
302
+ * ```typescript
303
+ * const sw = new Stopwatch(true);
304
+ * sw.Stop();
305
+ * sw.Reset();
306
+ * console.log(sw.Running); // false
307
+ * console.log(sw.Times); // []
308
+ * ```
309
+ */
310
+ Reset() {
311
+ this._times = [];
312
+ this._pausedAt = null;
313
+ }
314
+ }
315
+ //# sourceMappingURL=stopwatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stopwatch.js","sourceRoot":"","sources":["../../../src/time/stopwatch/stopwatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=time.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.test.d.ts","sourceRoot":"","sources":["../../src/time/time.test.ts"],"names":[],"mappings":""}