@ls-stack/utils 3.40.0 → 3.42.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 (159) hide show
  1. package/dist/arrayUtils.d.cts +70 -57
  2. package/dist/arrayUtils.d.ts +70 -57
  3. package/dist/assertions.d.cts +128 -117
  4. package/dist/assertions.d.ts +128 -117
  5. package/dist/asyncQueue.cjs +117 -112
  6. package/dist/asyncQueue.d.cts +217 -215
  7. package/dist/asyncQueue.d.ts +217 -215
  8. package/dist/asyncQueue.js +117 -112
  9. package/dist/awaitDebounce.d.cts +26 -23
  10. package/dist/awaitDebounce.d.ts +26 -23
  11. package/dist/cache.cjs +2 -1
  12. package/dist/cache.d.cts +15 -9
  13. package/dist/cache.d.ts +15 -9
  14. package/dist/cache.js +2 -1
  15. package/dist/{chunk-ADM37GSC.js → chunk-7L4KCZJJ.js} +12 -10
  16. package/dist/{chunk-KW55OTUG.js → chunk-B3KFV2MH.js} +2 -2
  17. package/dist/chunk-GMJTLFM6.js +60 -0
  18. package/dist/{chunk-GHAQOUA6.js → chunk-Y45CE75W.js} +22 -1
  19. package/dist/concurrentCalls.d.cts +8 -4
  20. package/dist/concurrentCalls.d.ts +8 -4
  21. package/dist/concurrentCalls.js +1 -1
  22. package/dist/debounce.d.cts +12 -20
  23. package/dist/debounce.d.ts +12 -20
  24. package/dist/dedent.d.cts +31 -31
  25. package/dist/dedent.d.ts +31 -31
  26. package/dist/deepEqual.d.cts +10 -9
  27. package/dist/deepEqual.d.ts +10 -9
  28. package/dist/filterObjectOrArrayKeys.d.cts +44 -19
  29. package/dist/filterObjectOrArrayKeys.d.ts +44 -19
  30. package/dist/getAutoIncrementId.d.cts +25 -23
  31. package/dist/getAutoIncrementId.d.ts +25 -23
  32. package/dist/getCompositeKey.d.cts +2 -1
  33. package/dist/getCompositeKey.d.ts +2 -1
  34. package/dist/getValueStableKey.d.cts +4 -3
  35. package/dist/getValueStableKey.d.ts +4 -3
  36. package/dist/mutationUtils.d.cts +2 -2
  37. package/dist/mutationUtils.d.ts +2 -2
  38. package/dist/objUtils.cjs +51 -2
  39. package/dist/objUtils.d.cts +8 -3
  40. package/dist/objUtils.d.ts +8 -3
  41. package/dist/objUtils.js +11 -3
  42. package/dist/parallelAsyncCalls.cjs +2 -1
  43. package/dist/parallelAsyncCalls.d.cts +5 -4
  44. package/dist/parallelAsyncCalls.d.ts +5 -4
  45. package/dist/parallelAsyncCalls.js +2 -1
  46. package/dist/retryOnError.d.cts +23 -20
  47. package/dist/retryOnError.d.ts +23 -20
  48. package/dist/runShellCmd.d.cts +40 -40
  49. package/dist/runShellCmd.d.ts +40 -40
  50. package/dist/safeJson.d.cts +6 -2
  51. package/dist/safeJson.d.ts +6 -2
  52. package/dist/saferTyping.d.cts +21 -14
  53. package/dist/saferTyping.d.ts +21 -14
  54. package/dist/shallowEqual.d.cts +1 -1
  55. package/dist/shallowEqual.d.ts +1 -1
  56. package/dist/stringUtils.cjs +2 -2
  57. package/dist/stringUtils.d.cts +6 -7
  58. package/dist/stringUtils.d.ts +6 -7
  59. package/dist/stringUtils.js +1 -1
  60. package/dist/testUtils.cjs +11 -9
  61. package/dist/testUtils.d.cts +32 -14
  62. package/dist/testUtils.d.ts +32 -14
  63. package/dist/testUtils.js +4 -3
  64. package/dist/throttle.d.cts +57 -48
  65. package/dist/throttle.d.ts +57 -48
  66. package/dist/timers.d.cts +68 -63
  67. package/dist/timers.d.ts +68 -63
  68. package/dist/tsResult.d.cts +7 -6
  69. package/dist/tsResult.d.ts +7 -6
  70. package/dist/typeGuards.d.cts +65 -64
  71. package/dist/typeGuards.d.ts +65 -64
  72. package/dist/typeUtils.d.cts +18 -4
  73. package/dist/typeUtils.d.ts +18 -4
  74. package/dist/typedStrings.d.cts +68 -57
  75. package/dist/typedStrings.d.ts +68 -57
  76. package/dist/typingFnUtils.cjs +15 -0
  77. package/dist/typingFnUtils.d.cts +34 -7
  78. package/dist/typingFnUtils.d.ts +34 -7
  79. package/dist/typingFnUtils.js +18 -35
  80. package/dist/typingTestUtils.cjs +7 -1
  81. package/dist/typingTestUtils.d.cts +52 -11
  82. package/dist/typingTestUtils.d.ts +52 -11
  83. package/dist/typingTestUtils.js +7 -1
  84. package/dist/typingUtils.d.cts +4 -1
  85. package/dist/typingUtils.d.ts +4 -1
  86. package/dist/yamlStringify.cjs +11 -9
  87. package/dist/yamlStringify.js +2 -2
  88. package/package.json +5 -1
  89. package/docs/README.md +0 -72
  90. package/docs/_media/modules.md +0 -58
  91. package/docs/arrayUtils/-internal-.md +0 -179
  92. package/docs/arrayUtils/README.md +0 -550
  93. package/docs/assertions/-internal-.md +0 -63
  94. package/docs/assertions/README.md +0 -565
  95. package/docs/asyncQueue/-internal-.md +0 -297
  96. package/docs/asyncQueue/README.md +0 -1485
  97. package/docs/awaitDebounce.md +0 -66
  98. package/docs/cache/-internal-.md +0 -168
  99. package/docs/cache/README.md +0 -360
  100. package/docs/castValues.md +0 -47
  101. package/docs/concurrentCalls/-internal-.md +0 -490
  102. package/docs/concurrentCalls/README.md +0 -299
  103. package/docs/consoleFmt.md +0 -115
  104. package/docs/conversions.md +0 -27
  105. package/docs/createThrottleController/-internal-.md +0 -73
  106. package/docs/createThrottleController/README.md +0 -31
  107. package/docs/debounce.md +0 -188
  108. package/docs/dedent/-internal-.md +0 -17
  109. package/docs/dedent/README.md +0 -204
  110. package/docs/deepEqual.md +0 -94
  111. package/docs/enhancedMap.md +0 -358
  112. package/docs/exhaustiveMatch/-internal-.md +0 -39
  113. package/docs/exhaustiveMatch/README.md +0 -146
  114. package/docs/filterObjectOrArrayKeys.md +0 -109
  115. package/docs/getAutoIncrementId.md +0 -93
  116. package/docs/getCompositeKey.md +0 -39
  117. package/docs/getValueStableKey.md +0 -57
  118. package/docs/hash.md +0 -31
  119. package/docs/interpolate/-internal-.md +0 -61
  120. package/docs/interpolate/README.md +0 -62
  121. package/docs/keepPrevIfUnchanged.md +0 -43
  122. package/docs/levenshtein.md +0 -93
  123. package/docs/main.md +0 -21
  124. package/docs/mathUtils.md +0 -137
  125. package/docs/modules.md +0 -58
  126. package/docs/mutationUtils.md +0 -44
  127. package/docs/objUtils.md +0 -237
  128. package/docs/parallelAsyncCalls/-internal-.md +0 -347
  129. package/docs/parallelAsyncCalls/README.md +0 -45
  130. package/docs/promiseUtils/-internal-.md +0 -69
  131. package/docs/promiseUtils/README.md +0 -31
  132. package/docs/retryOnError/-internal-.md +0 -111
  133. package/docs/retryOnError/README.md +0 -168
  134. package/docs/runShellCmd/-internal-.md +0 -111
  135. package/docs/runShellCmd/README.md +0 -201
  136. package/docs/safeJson.md +0 -51
  137. package/docs/saferTyping.md +0 -228
  138. package/docs/serializeXML.md +0 -100
  139. package/docs/shallowEqual.md +0 -33
  140. package/docs/sleep.md +0 -27
  141. package/docs/stringUtils/-internal-.md +0 -17
  142. package/docs/stringUtils/README.md +0 -270
  143. package/docs/testUtils.md +0 -382
  144. package/docs/throttle/-internal-.md +0 -47
  145. package/docs/throttle/README.md +0 -178
  146. package/docs/time.md +0 -274
  147. package/docs/timers.md +0 -256
  148. package/docs/tsResult/-internal-.md +0 -327
  149. package/docs/tsResult/README.md +0 -702
  150. package/docs/typeGuards.md +0 -399
  151. package/docs/typeUtils/-internal-.md +0 -99
  152. package/docs/typeUtils/README.md +0 -195
  153. package/docs/typeUtils.typesTest.md +0 -7
  154. package/docs/typedStrings.md +0 -458
  155. package/docs/typingFnUtils/-internal-.md +0 -43
  156. package/docs/typingFnUtils/README.md +0 -317
  157. package/docs/typingTestUtils.md +0 -172
  158. package/docs/typingUtils.md +0 -135
  159. package/docs/yamlStringify.md +0 -83
@@ -1,490 +0,0 @@
1
- [**@ls-stack/utils**](../README.md)
2
-
3
- ***
4
-
5
- [@ls-stack/utils](../modules.md) / [concurrentCalls](README.md) / \<internal\>
6
-
7
- # \<internal\>
8
-
9
- ## Classes
10
-
11
- ### ConcurrentCalls\<R, E\>
12
-
13
- Defined in: [packages/utils/src/concurrentCalls.ts:141](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L141)
14
-
15
- #### Type Parameters
16
-
17
- ##### R
18
-
19
- `R` = `unknown`
20
-
21
- ##### E
22
-
23
- `E` *extends* `ResultValidErrors` = `Error`
24
-
25
- #### Constructors
26
-
27
- ##### Constructor
28
-
29
- ```ts
30
- new ConcurrentCalls<R, E>(allowResultify): ConcurrentCalls<R, E>;
31
- ```
32
-
33
- Defined in: [packages/utils/src/concurrentCalls.ts:146](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L146)
34
-
35
- ###### Parameters
36
-
37
- ###### allowResultify
38
-
39
- `boolean`
40
-
41
- ###### Returns
42
-
43
- [`ConcurrentCalls`](#concurrentcalls)\<`R`, `E`\>
44
-
45
- #### Properties
46
-
47
- ##### allowResultify
48
-
49
- ```ts
50
- allowResultify: boolean = true;
51
- ```
52
-
53
- Defined in: [packages/utils/src/concurrentCalls.ts:144](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L144)
54
-
55
- #### Methods
56
-
57
- ##### add()
58
-
59
- ```ts
60
- add(...calls): this;
61
- ```
62
-
63
- Defined in: [packages/utils/src/concurrentCalls.ts:150](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L150)
64
-
65
- ###### Parameters
66
-
67
- ###### calls
68
-
69
- ...[`Action`](#action)\<`R`, `E`\>[]
70
-
71
- ###### Returns
72
-
73
- `this`
74
-
75
- ##### resultifyAdd()
76
-
77
- ```ts
78
- resultifyAdd(...calls): this;
79
- ```
80
-
81
- Defined in: [packages/utils/src/concurrentCalls.ts:156](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L156)
82
-
83
- ###### Parameters
84
-
85
- ###### calls
86
-
87
- ...(() => `R` \| () => `Promise`\<`R`\>)[]
88
-
89
- ###### Returns
90
-
91
- `this`
92
-
93
- ##### runAll()
94
-
95
- ```ts
96
- runAll(__namedParameters): Promise<Result<R[], E>>;
97
- ```
98
-
99
- Defined in: [packages/utils/src/concurrentCalls.ts:179](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L179)
100
-
101
- ###### Parameters
102
-
103
- ###### \_\_namedParameters
104
-
105
- [`RunProps`](#runprops) = `{}`
106
-
107
- ###### Returns
108
-
109
- `Promise`\<`Result`\<`R`[], `E`\>\>
110
-
111
- ##### runAllSettled()
112
-
113
- ```ts
114
- runAllSettled(__namedParameters): Promise<{
115
- aggregatedError: | null
116
- | ConcurrentCallsAggregateError;
117
- allFailed: boolean;
118
- failures: E[];
119
- succeeded: R[];
120
- total: number;
121
- }>;
122
- ```
123
-
124
- Defined in: [packages/utils/src/concurrentCalls.ts:211](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L211)
125
-
126
- ###### Parameters
127
-
128
- ###### \_\_namedParameters
129
-
130
- [`RunProps`](#runprops) = `{}`
131
-
132
- ###### Returns
133
-
134
- `Promise`\<\{
135
- `aggregatedError`: \| `null`
136
- \| [`ConcurrentCallsAggregateError`](README.md#concurrentcallsaggregateerror);
137
- `allFailed`: `boolean`;
138
- `failures`: `E`[];
139
- `succeeded`: `R`[];
140
- `total`: `number`;
141
- \}\>
142
-
143
- ***
144
-
145
- ### ConcurrentCallsWithMetadata\<M, R, E\>
146
-
147
- Defined in: [packages/utils/src/concurrentCalls.ts:277](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L277)
148
-
149
- #### Type Parameters
150
-
151
- ##### M
152
-
153
- `M` *extends* [`ValidMetadata`](#validmetadata)
154
-
155
- ##### R
156
-
157
- `R` = `unknown`
158
-
159
- ##### E
160
-
161
- `E` *extends* `ResultValidErrors` = `Error`
162
-
163
- #### Constructors
164
-
165
- ##### Constructor
166
-
167
- ```ts
168
- new ConcurrentCallsWithMetadata<M, R, E>(allowResultify): ConcurrentCallsWithMetadata<M, R, E>;
169
- ```
170
-
171
- Defined in: [packages/utils/src/concurrentCalls.ts:286](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L286)
172
-
173
- ###### Parameters
174
-
175
- ###### allowResultify
176
-
177
- `boolean`
178
-
179
- ###### Returns
180
-
181
- [`ConcurrentCallsWithMetadata`](#concurrentcallswithmetadata)\<`M`, `R`, `E`\>
182
-
183
- #### Properties
184
-
185
- ##### allowResultify
186
-
187
- ```ts
188
- allowResultify: boolean = true;
189
- ```
190
-
191
- Defined in: [packages/utils/src/concurrentCalls.ts:284](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L284)
192
-
193
- #### Methods
194
-
195
- ##### add()
196
-
197
- ```ts
198
- add(...calls): this;
199
- ```
200
-
201
- Defined in: [packages/utils/src/concurrentCalls.ts:290](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L290)
202
-
203
- ###### Parameters
204
-
205
- ###### calls
206
-
207
- ...`object`[]
208
-
209
- ###### Returns
210
-
211
- `this`
212
-
213
- ##### resultifyAdd()
214
-
215
- ```ts
216
- resultifyAdd(...items): this;
217
- ```
218
-
219
- Defined in: [packages/utils/src/concurrentCalls.ts:304](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L304)
220
-
221
- ###### Parameters
222
-
223
- ###### items
224
-
225
- ...`object`[]
226
-
227
- ###### Returns
228
-
229
- `this`
230
-
231
- ##### runAll()
232
-
233
- ```ts
234
- runAll(__namedParameters): Promise<Result<SucceededCall<R, M>[], FailedCall<M, E>>>;
235
- ```
236
-
237
- Defined in: [packages/utils/src/concurrentCalls.ts:330](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L330)
238
-
239
- ###### Parameters
240
-
241
- ###### \_\_namedParameters
242
-
243
- [`RunProps`](#runprops) = `{}`
244
-
245
- ###### Returns
246
-
247
- `Promise`\<`Result`\<[`SucceededCall`](#succeededcall)\<`R`, `M`\>[], [`FailedCall`](#failedcall)\<`M`, `E`\>\>\>
248
-
249
- ##### runAllSettled()
250
-
251
- ```ts
252
- runAllSettled(__namedParameters): Promise<{
253
- aggregatedError: | null
254
- | ConcurrentCallsWithMetadataAggregateError<M>;
255
- allFailed: boolean;
256
- failed: FailedCall<M, E>[];
257
- failures: FailedCall<M, E>[];
258
- results: SettledResultWithMetadata<R, M, E>[];
259
- succeeded: SucceededCall<R, M>[];
260
- total: number;
261
- }>;
262
- ```
263
-
264
- Defined in: [packages/utils/src/concurrentCalls.ts:377](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L377)
265
-
266
- ###### Parameters
267
-
268
- ###### \_\_namedParameters
269
-
270
- [`RunProps`](#runprops) = `{}`
271
-
272
- ###### Returns
273
-
274
- `Promise`\<\{
275
- `aggregatedError`: \| `null`
276
- \| [`ConcurrentCallsWithMetadataAggregateError`](README.md#concurrentcallswithmetadataaggregateerror)\<`M`\>;
277
- `allFailed`: `boolean`;
278
- `failed`: [`FailedCall`](#failedcall)\<`M`, `E`\>[];
279
- `failures`: [`FailedCall`](#failedcall)\<`M`, `E`\>[];
280
- `results`: [`SettledResultWithMetadata`](#settledresultwithmetadata)\<`R`, `M`, `E`\>[];
281
- `succeeded`: [`SucceededCall`](#succeededcall)\<`R`, `M`\>[];
282
- `total`: `number`;
283
- \}\>
284
-
285
- ## Type Aliases
286
-
287
- ### Action()\<R, E\>
288
-
289
- ```ts
290
- type Action<R, E> = () => Promise<Result<R, E>>;
291
- ```
292
-
293
- Defined in: [packages/utils/src/concurrentCalls.ts:134](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L134)
294
-
295
- #### Type Parameters
296
-
297
- ##### R
298
-
299
- `R`
300
-
301
- ##### E
302
-
303
- `E` *extends* `ResultValidErrors`
304
-
305
- #### Returns
306
-
307
- `Promise`\<`Result`\<`R`, `E`\>\>
308
-
309
- ***
310
-
311
- ### ErrorFromResult\<R\>
312
-
313
- ```ts
314
- type ErrorFromResult<R> = R extends Result<any, infer E> ? E : never;
315
- ```
316
-
317
- Defined in: [packages/utils/src/concurrentCalls.ts:480](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L480)
318
-
319
- #### Type Parameters
320
-
321
- ##### R
322
-
323
- `R`
324
-
325
- ***
326
-
327
- ### FailedCall\<M, E\>
328
-
329
- ```ts
330
- type FailedCall<M, E> = object;
331
- ```
332
-
333
- Defined in: [packages/utils/src/concurrentCalls.ts:129](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L129)
334
-
335
- #### Type Parameters
336
-
337
- ##### M
338
-
339
- `M`
340
-
341
- ##### E
342
-
343
- `E` *extends* `ResultValidErrors` = `Error`
344
-
345
- #### Properties
346
-
347
- ##### error
348
-
349
- ```ts
350
- error: E;
351
- ```
352
-
353
- Defined in: [packages/utils/src/concurrentCalls.ts:131](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L131)
354
-
355
- ##### metadata
356
-
357
- ```ts
358
- metadata: M;
359
- ```
360
-
361
- Defined in: [packages/utils/src/concurrentCalls.ts:130](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L130)
362
-
363
- ***
364
-
365
- ### RunProps
366
-
367
- ```ts
368
- type RunProps = object;
369
- ```
370
-
371
- Defined in: [packages/utils/src/concurrentCalls.ts:120](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L120)
372
-
373
- #### Properties
374
-
375
- ##### delayStart()?
376
-
377
- ```ts
378
- optional delayStart: (index) => number;
379
- ```
380
-
381
- Defined in: [packages/utils/src/concurrentCalls.ts:121](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L121)
382
-
383
- ###### Parameters
384
-
385
- ###### index
386
-
387
- `number`
388
-
389
- ###### Returns
390
-
391
- `number`
392
-
393
- ***
394
-
395
- ### SettledResultWithMetadata\<R, M, E\>
396
-
397
- ```ts
398
- type SettledResultWithMetadata<R, M, E> =
399
- | {
400
- error: false;
401
- metadata: M;
402
- ok: true;
403
- value: R;
404
- }
405
- | {
406
- error: E;
407
- metadata: M;
408
- ok: false;
409
- };
410
- ```
411
-
412
- Defined in: [packages/utils/src/concurrentCalls.ts:137](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L137)
413
-
414
- #### Type Parameters
415
-
416
- ##### R
417
-
418
- `R`
419
-
420
- ##### M
421
-
422
- `M`
423
-
424
- ##### E
425
-
426
- `E` *extends* `ResultValidErrors` = `Error`
427
-
428
- ***
429
-
430
- ### SucceededCall\<R, M\>
431
-
432
- ```ts
433
- type SucceededCall<R, M> = object;
434
- ```
435
-
436
- Defined in: [packages/utils/src/concurrentCalls.ts:125](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L125)
437
-
438
- #### Type Parameters
439
-
440
- ##### R
441
-
442
- `R`
443
-
444
- ##### M
445
-
446
- `M`
447
-
448
- #### Properties
449
-
450
- ##### metadata
451
-
452
- ```ts
453
- metadata: M;
454
- ```
455
-
456
- Defined in: [packages/utils/src/concurrentCalls.ts:127](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L127)
457
-
458
- ##### value
459
-
460
- ```ts
461
- value: R;
462
- ```
463
-
464
- Defined in: [packages/utils/src/concurrentCalls.ts:126](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L126)
465
-
466
- ***
467
-
468
- ### ValidMetadata
469
-
470
- ```ts
471
- type ValidMetadata = string | number | boolean | Record<string, unknown>;
472
- ```
473
-
474
- Defined in: [packages/utils/src/concurrentCalls.ts:118](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L118)
475
-
476
- ***
477
-
478
- ### ValueFromResult\<R\>
479
-
480
- ```ts
481
- type ValueFromResult<R> = R extends Result<infer T, any> ? T : never;
482
- ```
483
-
484
- Defined in: [packages/utils/src/concurrentCalls.ts:479](https://github.com/lucasols/utils/blob/main/packages/utils/src/concurrentCalls.ts#L479)
485
-
486
- #### Type Parameters
487
-
488
- ##### R
489
-
490
- `R`