@vielzeug/toolkit 1.0.14 → 1.1.2

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 (70) hide show
  1. package/dist/async/attempt.cjs.map +1 -0
  2. package/dist/async/attempt.js.map +1 -0
  3. package/dist/async/defer.cjs +2 -0
  4. package/dist/async/defer.cjs.map +1 -0
  5. package/dist/async/defer.js +10 -0
  6. package/dist/async/defer.js.map +1 -0
  7. package/dist/async/delay.cjs.map +1 -0
  8. package/dist/async/delay.js.map +1 -0
  9. package/dist/async/parallel.cjs.map +1 -0
  10. package/dist/async/parallel.js.map +1 -0
  11. package/dist/async/pool.cjs +2 -0
  12. package/dist/async/pool.cjs.map +1 -0
  13. package/dist/async/pool.js +22 -0
  14. package/dist/async/pool.js.map +1 -0
  15. package/dist/async/predict.cjs.map +1 -0
  16. package/dist/async/predict.js.map +1 -0
  17. package/dist/async/queue.cjs +2 -0
  18. package/dist/async/queue.cjs.map +1 -0
  19. package/dist/async/queue.js +57 -0
  20. package/dist/async/queue.js.map +1 -0
  21. package/dist/async/race.cjs +2 -0
  22. package/dist/async/race.cjs.map +1 -0
  23. package/dist/async/race.js +8 -0
  24. package/dist/async/race.js.map +1 -0
  25. package/dist/async/retry.cjs.map +1 -0
  26. package/dist/{function → async}/retry.js +4 -4
  27. package/dist/async/retry.js.map +1 -0
  28. package/dist/async/sleep.cjs +2 -0
  29. package/dist/async/sleep.cjs.map +1 -0
  30. package/dist/{function → async}/sleep.js +1 -1
  31. package/dist/async/sleep.js.map +1 -0
  32. package/dist/async/waitFor.cjs +2 -0
  33. package/dist/async/waitFor.cjs.map +1 -0
  34. package/dist/async/waitFor.js +37 -0
  35. package/dist/async/waitFor.js.map +1 -0
  36. package/dist/index.cjs +1 -1
  37. package/dist/index.d.ts +175 -0
  38. package/dist/index.js +242 -230
  39. package/dist/index.js.map +1 -1
  40. package/dist/logit/dist/logit.cjs +1 -1
  41. package/dist/logit/dist/logit.cjs.map +1 -1
  42. package/dist/logit/dist/logit.js +147 -64
  43. package/dist/logit/dist/logit.js.map +1 -1
  44. package/dist/object/cache.cjs +2 -0
  45. package/dist/object/cache.cjs.map +1 -0
  46. package/dist/object/cache.js +63 -0
  47. package/dist/object/cache.js.map +1 -0
  48. package/package.json +1 -1
  49. package/dist/function/attempt.cjs.map +0 -1
  50. package/dist/function/attempt.js.map +0 -1
  51. package/dist/function/delay.cjs.map +0 -1
  52. package/dist/function/delay.js.map +0 -1
  53. package/dist/function/parallel.cjs.map +0 -1
  54. package/dist/function/parallel.js.map +0 -1
  55. package/dist/function/predict.cjs.map +0 -1
  56. package/dist/function/predict.js.map +0 -1
  57. package/dist/function/retry.cjs.map +0 -1
  58. package/dist/function/retry.js.map +0 -1
  59. package/dist/function/sleep.cjs +0 -2
  60. package/dist/function/sleep.cjs.map +0 -1
  61. package/dist/function/sleep.js.map +0 -1
  62. /package/dist/{function → async}/attempt.cjs +0 -0
  63. /package/dist/{function → async}/attempt.js +0 -0
  64. /package/dist/{function → async}/delay.cjs +0 -0
  65. /package/dist/{function → async}/delay.js +0 -0
  66. /package/dist/{function → async}/parallel.cjs +0 -0
  67. /package/dist/{function → async}/parallel.js +0 -0
  68. /package/dist/{function → async}/predict.cjs +0 -0
  69. /package/dist/{function → async}/predict.js +0 -0
  70. /package/dist/{function → async}/retry.cjs +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attempt.cjs","sources":["../../src/async/attempt.ts"],"sourcesContent":["import { Logit } from '@vielzeug/logit';\nimport type { Fn } from '../types';\nimport { predict } from './predict';\nimport { retry } from './retry';\n\ntype AttemptOptions = {\n identifier?: string;\n retries?: number;\n silent?: boolean;\n timeout?: number;\n};\n\n/**\n * Attempts to execute a function with advanced error handling and retry logic.\n *\n * @example\n * ```ts\n * const unreliableFunction = async () => {\n * if (Math.random() < 0.7) throw new Error ('Random failure');\n * return 'Success!';\n * };\n *\n * await attempt(\n * unreliableFunction,\n * { retries: 3, silent: false, timeout: 5000 }); // Success! (or undefined if all attempts failed)\n * ```\n *\n * @param fn - The function to be executed.\n * @param [options] - Configuration options for the attempt.\n * @param [options.identifier] - Custom identifier for logging purposes.\n * @param [options.retries=0] - Number of retry attempts if the function fails.\n * @param [options.silent=false] - If true, suppresses error logging.\n * @param [options.timeout=7000] - Timeout in milliseconds for function execution.\n *\n * @returns The result of the function or undefined if it failed.\n */\nexport async function attempt<T extends Fn, R = Awaited<ReturnType<T>>>(\n fn: T,\n { silent = false, retries = 0, timeout = 7000, identifier = fn.name || 'anonymous function' }: AttemptOptions = {},\n): Promise<R | undefined> {\n try {\n return await retry(() => predict<R>(() => fn(), { timeout }), { times: retries + 1 });\n } catch (err) {\n if (!silent) {\n Logit.error(`attempt(${identifier}) -> all attempts failed`, { cause: err });\n }\n return undefined;\n }\n}\n"],"names":["attempt","fn","silent","retries","timeout","identifier","retry","predict","err","Logit"],"mappings":"+KAoCA,eAAsBA,EACpBC,EACA,CAAE,OAAAC,EAAS,GAAO,QAAAC,EAAU,EAAG,QAAAC,EAAU,IAAM,WAAAC,EAAaJ,EAAG,MAAQ,oBAAA,EAAyC,CAAA,EACxF,CACxB,GAAI,CACF,OAAO,MAAMK,EAAAA,MAAM,IAAMC,EAAAA,QAAW,IAAMN,EAAA,EAAM,CAAE,QAAAG,CAAA,CAAS,EAAG,CAAE,MAAOD,EAAU,EAAG,CACtF,OAASK,EAAK,CACPN,GACHO,QAAM,MAAM,WAAWJ,CAAU,2BAA4B,CAAE,MAAOG,EAAK,EAE7E,MACF,CACF"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attempt.js","sources":["../../src/async/attempt.ts"],"sourcesContent":["import { Logit } from '@vielzeug/logit';\nimport type { Fn } from '../types';\nimport { predict } from './predict';\nimport { retry } from './retry';\n\ntype AttemptOptions = {\n identifier?: string;\n retries?: number;\n silent?: boolean;\n timeout?: number;\n};\n\n/**\n * Attempts to execute a function with advanced error handling and retry logic.\n *\n * @example\n * ```ts\n * const unreliableFunction = async () => {\n * if (Math.random() < 0.7) throw new Error ('Random failure');\n * return 'Success!';\n * };\n *\n * await attempt(\n * unreliableFunction,\n * { retries: 3, silent: false, timeout: 5000 }); // Success! (or undefined if all attempts failed)\n * ```\n *\n * @param fn - The function to be executed.\n * @param [options] - Configuration options for the attempt.\n * @param [options.identifier] - Custom identifier for logging purposes.\n * @param [options.retries=0] - Number of retry attempts if the function fails.\n * @param [options.silent=false] - If true, suppresses error logging.\n * @param [options.timeout=7000] - Timeout in milliseconds for function execution.\n *\n * @returns The result of the function or undefined if it failed.\n */\nexport async function attempt<T extends Fn, R = Awaited<ReturnType<T>>>(\n fn: T,\n { silent = false, retries = 0, timeout = 7000, identifier = fn.name || 'anonymous function' }: AttemptOptions = {},\n): Promise<R | undefined> {\n try {\n return await retry(() => predict<R>(() => fn(), { timeout }), { times: retries + 1 });\n } catch (err) {\n if (!silent) {\n Logit.error(`attempt(${identifier}) -> all attempts failed`, { cause: err });\n }\n return undefined;\n }\n}\n"],"names":["attempt","fn","silent","retries","timeout","identifier","retry","predict","err","Logit"],"mappings":";;;AAoCA,eAAsBA,EACpBC,GACA,EAAE,QAAAC,IAAS,IAAO,SAAAC,IAAU,GAAG,SAAAC,IAAU,KAAM,YAAAC,IAAaJ,EAAG,QAAQ,qBAAA,IAAyC,CAAA,GACxF;AACxB,MAAI;AACF,WAAO,MAAMK,EAAM,MAAMC,EAAW,MAAMN,EAAA,GAAM,EAAE,SAAAG,EAAA,CAAS,GAAG,EAAE,OAAOD,IAAU,GAAG;AAAA,EACtF,SAASK,GAAK;AACZ,IAAKN,KACHO,EAAM,MAAM,WAAWJ,CAAU,4BAA4B,EAAE,OAAOG,GAAK;AAE7E;AAAA,EACF;AACF;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function i(){let e,r;return{promise:new Promise((t,o)=>{e=t,r=o}),reject:r,resolve:e}}exports.defer=i;
2
+ //# sourceMappingURL=defer.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defer.cjs","sources":["../../src/async/defer.ts"],"sourcesContent":["/**\n * Creates a deferred promise with resolve and reject methods exposed.\n * Useful for creating promises that are resolved/rejected externally.\n *\n * @example\n * ```ts\n * const deferred = defer<string>();\n *\n * setTimeout(() => {\n * deferred.resolve('Done!');\n * }, 1000);\n *\n * const result = await deferred.promise; // 'Done!'\n * ```\n *\n * @returns Object with promise and resolve/reject methods\n */\nexport function defer<T = void>(): {\n promise: Promise<T>;\n resolve: (value: T | PromiseLike<T>) => void;\n reject: (reason?: unknown) => void;\n} {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: unknown) => void;\n\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return { promise, reject, resolve };\n}\n"],"names":["defer","resolve","reject","res","rej"],"mappings":"gFAiBO,SAASA,GAId,CACA,IAAIC,EACAC,EAOJ,MAAO,CAAE,QALO,IAAI,QAAW,CAACC,EAAKC,IAAQ,CAC3CH,EAAUE,EACVD,EAASE,CACX,CAAC,EAEiB,OAAAF,EAAQ,QAAAD,CAAA,CAC5B"}
@@ -0,0 +1,10 @@
1
+ function s() {
2
+ let e, r;
3
+ return { promise: new Promise((o, t) => {
4
+ e = o, r = t;
5
+ }), reject: r, resolve: e };
6
+ }
7
+ export {
8
+ s as defer
9
+ };
10
+ //# sourceMappingURL=defer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defer.js","sources":["../../src/async/defer.ts"],"sourcesContent":["/**\n * Creates a deferred promise with resolve and reject methods exposed.\n * Useful for creating promises that are resolved/rejected externally.\n *\n * @example\n * ```ts\n * const deferred = defer<string>();\n *\n * setTimeout(() => {\n * deferred.resolve('Done!');\n * }, 1000);\n *\n * const result = await deferred.promise; // 'Done!'\n * ```\n *\n * @returns Object with promise and resolve/reject methods\n */\nexport function defer<T = void>(): {\n promise: Promise<T>;\n resolve: (value: T | PromiseLike<T>) => void;\n reject: (reason?: unknown) => void;\n} {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: unknown) => void;\n\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return { promise, reject, resolve };\n}\n"],"names":["defer","resolve","reject","res","rej"],"mappings":"AAiBO,SAASA,IAId;AACA,MAAIC,GACAC;AAOJ,SAAO,EAAE,SALO,IAAI,QAAW,CAACC,GAAKC,MAAQ;AAC3C,IAAAH,IAAUE,GACVD,IAASE;AAAA,EACX,CAAC,GAEiB,QAAAF,GAAQ,SAAAD,EAAA;AAC5B;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delay.cjs","sources":["../../src/async/delay.ts"],"sourcesContent":["import type { Fn } from '../types';\nimport { sleep } from './sleep';\n\n/**\n * Delays the execution of a function by a specified amount of time.\n *\n * @example\n * ```ts\n * const log = () => console.log('Hello, world!');\n *\n * delay(log, 1000); // logs 'Hello, world!' after 1 second\n * ```\n *\n * @param fn - The function to be delayed.\n * @param delay - The amount of time to delay the function execution, in milliseconds. Default is 700.\n *\n * @returns A Promise that resolves with the result of the function execution.\n */\nexport async function delay<T extends Fn>(fn: T, delay = 700) {\n await sleep(delay);\n\n return fn();\n}\n"],"names":["delay","fn","sleep"],"mappings":"+GAkBA,eAAsBA,EAAoBC,EAAOD,EAAQ,IAAK,CAC5D,aAAME,EAAAA,MAAMF,CAAK,EAEVC,EAAA,CACT"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delay.js","sources":["../../src/async/delay.ts"],"sourcesContent":["import type { Fn } from '../types';\nimport { sleep } from './sleep';\n\n/**\n * Delays the execution of a function by a specified amount of time.\n *\n * @example\n * ```ts\n * const log = () => console.log('Hello, world!');\n *\n * delay(log, 1000); // logs 'Hello, world!' after 1 second\n * ```\n *\n * @param fn - The function to be delayed.\n * @param delay - The amount of time to delay the function execution, in milliseconds. Default is 700.\n *\n * @returns A Promise that resolves with the result of the function execution.\n */\nexport async function delay<T extends Fn>(fn: T, delay = 700) {\n await sleep(delay);\n\n return fn();\n}\n"],"names":["delay","fn","sleep"],"mappings":";AAkBA,eAAsBA,EAAoBC,GAAOD,IAAQ,KAAK;AAC5D,eAAME,EAAMF,CAAK,GAEVC,EAAA;AACT;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel.cjs","sources":["../../src/async/parallel.ts"],"sourcesContent":["/**\n * Processes an array with an async callback with controlled parallelism.\n * Similar to Promise.all, but limits how many items are processed concurrently.\n * Returns an ordered array of results.\n *\n * @example\n * ```ts\n * // Process 3 items at a time\n * const results = await parallel(3, [1, 2, 3, 4, 5], async (n) => {\n * await delay(100);\n * return n * 2;\n * });\n * // [2, 4, 6, 8, 10]\n *\n * // With abort signal\n * const controller = new AbortController();\n * const results = await parallel(2, items, async (item) => {\n * return processItem(item);\n * }, controller.signal);\n * ```\n *\n * @param limit - Maximum number of concurrent operations (must be >= 1)\n * @param array - Array of items to process\n * @param callback - Async function to process each item\n * @param signal - Optional AbortSignal to cancel processing\n * @returns Promise resolving to an ordered array of results\n * @throws {Error} If limit is less than 1\n * @throws {DOMException} If aborted via signal\n */\nexport async function parallel<T, R>(\n limit: number,\n array: T[],\n callback: (item: T, index: number, array: T[]) => Promise<R>,\n signal?: AbortSignal,\n): Promise<R[]> {\n if (limit < 1) {\n throw new Error('Limit must be at least 1');\n }\n\n if (signal?.aborted) {\n throw new DOMException('Aborted', 'AbortError');\n }\n\n const results: R[] = new Array(array.length);\n let currentIndex = 0;\n let hasError = false;\n let error: unknown;\n\n // Check for abort\n const checkAbort = () => {\n if (signal?.aborted) {\n hasError = true;\n error = new DOMException('Aborted', 'AbortError');\n return true;\n }\n return false;\n };\n\n // Worker function that processes items from the queue\n const worker = async (): Promise<void> => {\n while (currentIndex < array.length && !hasError) {\n if (checkAbort()) {\n break;\n }\n\n const index = currentIndex++;\n\n try {\n results[index] = await callback(array[index], index, array);\n } catch (err) {\n hasError = true;\n error = err;\n break;\n }\n }\n };\n\n // Create workers up to the limit\n const workers: Promise<void>[] = [];\n const workerCount = Math.min(limit, array.length);\n\n for (let i = 0; i < workerCount; i++) {\n workers.push(worker());\n }\n\n // Wait for all workers to complete\n await Promise.all(workers);\n\n // If there was an error, throw it\n if (hasError) {\n throw error;\n }\n\n return results;\n}\n"],"names":["parallel","limit","array","callback","signal","results","currentIndex","hasError","error","checkAbort","worker","index","err","workers","workerCount","i"],"mappings":"gFA6BA,eAAsBA,EACpBC,EACAC,EACAC,EACAC,EACc,CACd,GAAIH,EAAQ,EACV,MAAM,IAAI,MAAM,0BAA0B,EAG5C,GAAIG,GAAQ,QACV,MAAM,IAAI,aAAa,UAAW,YAAY,EAGhD,MAAMC,EAAe,IAAI,MAAMH,EAAM,MAAM,EAC3C,IAAII,EAAe,EACfC,EAAW,GACXC,EAGJ,MAAMC,EAAa,IACbL,GAAQ,SACVG,EAAW,GACXC,EAAQ,IAAI,aAAa,UAAW,YAAY,EACzC,IAEF,GAIHE,EAAS,SAA2B,CACxC,KAAOJ,EAAeJ,EAAM,QAAU,CAACK,GACjC,CAAAE,KAD2C,CAK/C,MAAME,EAAQL,IAEd,GAAI,CACFD,EAAQM,CAAK,EAAI,MAAMR,EAASD,EAAMS,CAAK,EAAGA,EAAOT,CAAK,CAC5D,OAASU,EAAK,CACZL,EAAW,GACXC,EAAQI,EACR,KACF,CACF,CACF,EAGMC,EAA2B,CAAA,EAC3BC,EAAc,KAAK,IAAIb,EAAOC,EAAM,MAAM,EAEhD,QAASa,EAAI,EAAGA,EAAID,EAAaC,IAC/BF,EAAQ,KAAKH,GAAQ,EAOvB,GAHA,MAAM,QAAQ,IAAIG,CAAO,EAGrBN,EACF,MAAMC,EAGR,OAAOH,CACT"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel.js","sources":["../../src/async/parallel.ts"],"sourcesContent":["/**\n * Processes an array with an async callback with controlled parallelism.\n * Similar to Promise.all, but limits how many items are processed concurrently.\n * Returns an ordered array of results.\n *\n * @example\n * ```ts\n * // Process 3 items at a time\n * const results = await parallel(3, [1, 2, 3, 4, 5], async (n) => {\n * await delay(100);\n * return n * 2;\n * });\n * // [2, 4, 6, 8, 10]\n *\n * // With abort signal\n * const controller = new AbortController();\n * const results = await parallel(2, items, async (item) => {\n * return processItem(item);\n * }, controller.signal);\n * ```\n *\n * @param limit - Maximum number of concurrent operations (must be >= 1)\n * @param array - Array of items to process\n * @param callback - Async function to process each item\n * @param signal - Optional AbortSignal to cancel processing\n * @returns Promise resolving to an ordered array of results\n * @throws {Error} If limit is less than 1\n * @throws {DOMException} If aborted via signal\n */\nexport async function parallel<T, R>(\n limit: number,\n array: T[],\n callback: (item: T, index: number, array: T[]) => Promise<R>,\n signal?: AbortSignal,\n): Promise<R[]> {\n if (limit < 1) {\n throw new Error('Limit must be at least 1');\n }\n\n if (signal?.aborted) {\n throw new DOMException('Aborted', 'AbortError');\n }\n\n const results: R[] = new Array(array.length);\n let currentIndex = 0;\n let hasError = false;\n let error: unknown;\n\n // Check for abort\n const checkAbort = () => {\n if (signal?.aborted) {\n hasError = true;\n error = new DOMException('Aborted', 'AbortError');\n return true;\n }\n return false;\n };\n\n // Worker function that processes items from the queue\n const worker = async (): Promise<void> => {\n while (currentIndex < array.length && !hasError) {\n if (checkAbort()) {\n break;\n }\n\n const index = currentIndex++;\n\n try {\n results[index] = await callback(array[index], index, array);\n } catch (err) {\n hasError = true;\n error = err;\n break;\n }\n }\n };\n\n // Create workers up to the limit\n const workers: Promise<void>[] = [];\n const workerCount = Math.min(limit, array.length);\n\n for (let i = 0; i < workerCount; i++) {\n workers.push(worker());\n }\n\n // Wait for all workers to complete\n await Promise.all(workers);\n\n // If there was an error, throw it\n if (hasError) {\n throw error;\n }\n\n return results;\n}\n"],"names":["parallel","limit","array","callback","signal","results","currentIndex","hasError","error","checkAbort","worker","index","err","workers","workerCount","i"],"mappings":"AA6BA,eAAsBA,EACpBC,GACAC,GACAC,GACAC,GACc;AACd,MAAIH,IAAQ;AACV,UAAM,IAAI,MAAM,0BAA0B;AAG5C,MAAIG,GAAQ;AACV,UAAM,IAAI,aAAa,WAAW,YAAY;AAGhD,QAAMC,IAAe,IAAI,MAAMH,EAAM,MAAM;AAC3C,MAAII,IAAe,GACfC,IAAW,IACXC;AAGJ,QAAMC,IAAa,MACbL,GAAQ,WACVG,IAAW,IACXC,IAAQ,IAAI,aAAa,WAAW,YAAY,GACzC,MAEF,IAIHE,IAAS,YAA2B;AACxC,WAAOJ,IAAeJ,EAAM,UAAU,CAACK,KACjC,CAAAE,OAD2C;AAK/C,YAAME,IAAQL;AAEd,UAAI;AACF,QAAAD,EAAQM,CAAK,IAAI,MAAMR,EAASD,EAAMS,CAAK,GAAGA,GAAOT,CAAK;AAAA,MAC5D,SAASU,GAAK;AACZ,QAAAL,IAAW,IACXC,IAAQI;AACR;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAGMC,IAA2B,CAAA,GAC3BC,IAAc,KAAK,IAAIb,GAAOC,EAAM,MAAM;AAEhD,WAASa,IAAI,GAAGA,IAAID,GAAaC;AAC/B,IAAAF,EAAQ,KAAKH,GAAQ;AAOvB,MAHA,MAAM,QAAQ,IAAIG,CAAO,GAGrBN;AACF,UAAMC;AAGR,SAAOH;AACT;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("../function/assert.cjs");function u(e){a.assert(e>=1,"Pool limit must be at least 1",{args:{limit:e},type:RangeError});let t=0;const n=[],r=()=>{n.length>0&&t<e&&n.shift()?.()};return async o=>{for(;t>=e;)await new Promise(s=>n.push(s));t++;try{return await o()}finally{t--,r()}}}exports.pool=u;
2
+ //# sourceMappingURL=pool.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.cjs","sources":["../../src/async/pool.ts"],"sourcesContent":["import { assert } from '../function/assert';\n\n/**\n * Creates a promise pool that limits the number of concurrent promises.\n * Useful for rate limiting API calls or controlling resource usage.\n *\n * @example\n * ```ts\n * const requestPool = pool(3);\n *\n * const results = await Promise.all([\n * requestPool(() => fetch('/api/1')),\n * requestPool(() => fetch('/api/2')),\n * requestPool(() => fetch('/api/3')),\n * requestPool(() => fetch('/api/4')), // Will wait for one of the above to finish\n * ]);\n * ```\n *\n * @param limit - Maximum number of concurrent promises\n * @returns Function that accepts a promise-returning function and executes it when a slot is available\n */\nexport function pool(limit: number): <T>(fn: () => Promise<T>) => Promise<T> {\n assert(limit >= 1, 'Pool limit must be at least 1', { args: { limit }, type: RangeError });\n\n let activeCount = 0;\n const queue: Array<() => void> = [];\n\n const dequeue = (): void => {\n if (queue.length > 0 && activeCount < limit) {\n const next = queue.shift();\n next?.();\n }\n };\n\n return async <T>(fn: () => Promise<T>): Promise<T> => {\n while (activeCount >= limit) {\n await new Promise<void>((resolve) => queue.push(resolve));\n }\n\n activeCount++;\n\n try {\n return await fn();\n } finally {\n activeCount--;\n dequeue();\n }\n };\n}\n"],"names":["pool","limit","assert","activeCount","queue","dequeue","fn","resolve"],"mappings":"0HAqBO,SAASA,EAAKC,EAAwD,CAC3EC,SAAOD,GAAS,EAAG,gCAAiC,CAAE,KAAM,CAAE,MAAAA,CAAA,EAAS,KAAM,WAAY,EAEzF,IAAIE,EAAc,EAClB,MAAMC,EAA2B,CAAA,EAE3BC,EAAU,IAAY,CACtBD,EAAM,OAAS,GAAKD,EAAcF,GACvBG,EAAM,MAAA,IACnB,CAEJ,EAEA,MAAO,OAAUE,GAAqC,CACpD,KAAOH,GAAeF,GACpB,MAAM,IAAI,QAAeM,GAAYH,EAAM,KAAKG,CAAO,CAAC,EAG1DJ,IAEA,GAAI,CACF,OAAO,MAAMG,EAAA,CACf,QAAA,CACEH,IACAE,EAAA,CACF,CACF,CACF"}
@@ -0,0 +1,22 @@
1
+ import { assert as s } from "../function/assert.js";
2
+ function c(e) {
3
+ s(e >= 1, "Pool limit must be at least 1", { args: { limit: e }, type: RangeError });
4
+ let t = 0;
5
+ const n = [], r = () => {
6
+ n.length > 0 && t < e && n.shift()?.();
7
+ };
8
+ return async (o) => {
9
+ for (; t >= e; )
10
+ await new Promise((a) => n.push(a));
11
+ t++;
12
+ try {
13
+ return await o();
14
+ } finally {
15
+ t--, r();
16
+ }
17
+ };
18
+ }
19
+ export {
20
+ c as pool
21
+ };
22
+ //# sourceMappingURL=pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.js","sources":["../../src/async/pool.ts"],"sourcesContent":["import { assert } from '../function/assert';\n\n/**\n * Creates a promise pool that limits the number of concurrent promises.\n * Useful for rate limiting API calls or controlling resource usage.\n *\n * @example\n * ```ts\n * const requestPool = pool(3);\n *\n * const results = await Promise.all([\n * requestPool(() => fetch('/api/1')),\n * requestPool(() => fetch('/api/2')),\n * requestPool(() => fetch('/api/3')),\n * requestPool(() => fetch('/api/4')), // Will wait for one of the above to finish\n * ]);\n * ```\n *\n * @param limit - Maximum number of concurrent promises\n * @returns Function that accepts a promise-returning function and executes it when a slot is available\n */\nexport function pool(limit: number): <T>(fn: () => Promise<T>) => Promise<T> {\n assert(limit >= 1, 'Pool limit must be at least 1', { args: { limit }, type: RangeError });\n\n let activeCount = 0;\n const queue: Array<() => void> = [];\n\n const dequeue = (): void => {\n if (queue.length > 0 && activeCount < limit) {\n const next = queue.shift();\n next?.();\n }\n };\n\n return async <T>(fn: () => Promise<T>): Promise<T> => {\n while (activeCount >= limit) {\n await new Promise<void>((resolve) => queue.push(resolve));\n }\n\n activeCount++;\n\n try {\n return await fn();\n } finally {\n activeCount--;\n dequeue();\n }\n };\n}\n"],"names":["pool","limit","assert","activeCount","queue","dequeue","fn","resolve"],"mappings":";AAqBO,SAASA,EAAKC,GAAwD;AAC3E,EAAAC,EAAOD,KAAS,GAAG,iCAAiC,EAAE,MAAM,EAAE,OAAAA,EAAA,GAAS,MAAM,YAAY;AAEzF,MAAIE,IAAc;AAClB,QAAMC,IAA2B,CAAA,GAE3BC,IAAU,MAAY;AAC1B,IAAID,EAAM,SAAS,KAAKD,IAAcF,KACvBG,EAAM,MAAA,IACnB;AAAA,EAEJ;AAEA,SAAO,OAAUE,MAAqC;AACpD,WAAOH,KAAeF;AACpB,YAAM,IAAI,QAAc,CAACM,MAAYH,EAAM,KAAKG,CAAO,CAAC;AAG1D,IAAAJ;AAEA,QAAI;AACF,aAAO,MAAMG,EAAA;AAAA,IACf,UAAA;AACE,MAAAH,KACAE,EAAA;AAAA,IACF;AAAA,EACF;AACF;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predict.cjs","sources":["../../src/async/predict.ts"],"sourcesContent":["/**\n * Creates a Promise that can be aborted using an AbortController.\n *\n * @example\n * ```ts\n * const slowFn = () => new Promise(resolve => setTimeout(() => resolve('slow'), 10000));\n * const fastFn = () => new Promise(resolve => setTimeout(() => resolve('fast'), 5000));\n *\n * predict(slowFn); // rejects after 7 seconds\n * predict(fastFn); // resolves with 'fast' after 5 seconds\n * ```\n *\n * @param fn - The function to execute, which receives an AbortSignal.\n * @param options - The options for the abortable function.\n * @param [options.signal] - The AbortSignal to use for aborting the Promise.\n * @param [options.timeout=7000] - The timeout in milliseconds after which the Promise will be aborted.\n *\n * @returns - A Promise that resolves with the result of the callback or rejects if aborted.\n */\nexport function predict<T>(\n fn: (signal: AbortSignal) => Promise<T>,\n options: { signal?: AbortSignal; timeout?: number } = {},\n): Promise<T> {\n const { signal, timeout = 7000 } = options;\n const abortSignal = signal ? AbortSignal.any([AbortSignal.timeout(timeout), signal]) : AbortSignal.timeout(timeout);\n\n return Promise.race([\n fn(abortSignal),\n new Promise<never>((_, reject) => {\n abortSignal.addEventListener('abort', () => reject(new Error('Operation aborted')), { once: true });\n }),\n ]);\n}\n"],"names":["predict","fn","options","signal","timeout","abortSignal","_","reject"],"mappings":"gFAmBO,SAASA,EACdC,EACAC,EAAsD,GAC1C,CACZ,KAAM,CAAE,OAAAC,EAAQ,QAAAC,EAAU,GAAA,EAASF,EAC7BG,EAAcF,EAAS,YAAY,IAAI,CAAC,YAAY,QAAQC,CAAO,EAAGD,CAAM,CAAC,EAAI,YAAY,QAAQC,CAAO,EAElH,OAAO,QAAQ,KAAK,CAClBH,EAAGI,CAAW,EACd,IAAI,QAAe,CAACC,EAAGC,IAAW,CAChCF,EAAY,iBAAiB,QAAS,IAAME,EAAO,IAAI,MAAM,mBAAmB,CAAC,EAAG,CAAE,KAAM,EAAA,CAAM,CACpG,CAAC,CAAA,CACF,CACH"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predict.js","sources":["../../src/async/predict.ts"],"sourcesContent":["/**\n * Creates a Promise that can be aborted using an AbortController.\n *\n * @example\n * ```ts\n * const slowFn = () => new Promise(resolve => setTimeout(() => resolve('slow'), 10000));\n * const fastFn = () => new Promise(resolve => setTimeout(() => resolve('fast'), 5000));\n *\n * predict(slowFn); // rejects after 7 seconds\n * predict(fastFn); // resolves with 'fast' after 5 seconds\n * ```\n *\n * @param fn - The function to execute, which receives an AbortSignal.\n * @param options - The options for the abortable function.\n * @param [options.signal] - The AbortSignal to use for aborting the Promise.\n * @param [options.timeout=7000] - The timeout in milliseconds after which the Promise will be aborted.\n *\n * @returns - A Promise that resolves with the result of the callback or rejects if aborted.\n */\nexport function predict<T>(\n fn: (signal: AbortSignal) => Promise<T>,\n options: { signal?: AbortSignal; timeout?: number } = {},\n): Promise<T> {\n const { signal, timeout = 7000 } = options;\n const abortSignal = signal ? AbortSignal.any([AbortSignal.timeout(timeout), signal]) : AbortSignal.timeout(timeout);\n\n return Promise.race([\n fn(abortSignal),\n new Promise<never>((_, reject) => {\n abortSignal.addEventListener('abort', () => reject(new Error('Operation aborted')), { once: true });\n }),\n ]);\n}\n"],"names":["predict","fn","options","signal","timeout","abortSignal","_","reject"],"mappings":"AAmBO,SAASA,EACdC,GACAC,IAAsD,IAC1C;AACZ,QAAM,EAAE,QAAAC,GAAQ,SAAAC,IAAU,IAAA,IAASF,GAC7BG,IAAcF,IAAS,YAAY,IAAI,CAAC,YAAY,QAAQC,CAAO,GAAGD,CAAM,CAAC,IAAI,YAAY,QAAQC,CAAO;AAElH,SAAO,QAAQ,KAAK;AAAA,IAClBH,EAAGI,CAAW;AAAA,IACd,IAAI,QAAe,CAACC,GAAGC,MAAW;AAChC,MAAAF,EAAY,iBAAiB,SAAS,MAAME,EAAO,IAAI,MAAM,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAA,CAAM;AAAA,IACpG,CAAC;AAAA,EAAA,CACF;AACH;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("../function/assert.cjs");function g(o={}){const{concurrency:u=1}=o;a.assert(u>=1,"Concurrency must be at least 1",{args:{concurrency:u},type:RangeError});let n=0,r=null,l=null;const e=[],s=()=>{if(n<u&&e.length>0){const t=e.shift();n++,t.fn().then(t.resolve).catch(t.reject).finally(()=>{n--,s(),n===0&&e.length===0&&l&&(l(),r=null,l=null)})}};return{add:t=>new Promise((i,c)=>{e.push({fn:t,reject:c,resolve:i}),s()}),clear:()=>{e.length=0},onIdle:()=>n===0&&e.length===0?Promise.resolve():(r||(r=new Promise(t=>{l=t})),r),get pending(){return n},get size(){return e.length}}}exports.queue=g;
2
+ //# sourceMappingURL=queue.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.cjs","sources":["../../src/async/queue.ts"],"sourcesContent":["import { assert } from '../function/assert';\n\n/**\n * Creates a promise queue that processes promises sequentially with optional concurrency limit.\n *\n * @example\n * ```ts\n * const requestQueue = queue({ concurrency: 2 });\n *\n * requestQueue.add(() => fetch('/api/1'));\n * requestQueue.add(() => fetch('/api/2'));\n * requestQueue.add(() => fetch('/api/3'));\n *\n * await requestQueue.onIdle(); // Wait for all tasks to complete\n * ```\n *\n * @param options - Queue configuration\n * @param options.concurrency - Maximum number of concurrent promises (default: 1)\n * @returns Queue instance with add, onIdle, and clear methods\n */\nexport function queue(options: { concurrency?: number } = {}) {\n const { concurrency = 1 } = options;\n\n assert(concurrency >= 1, 'Concurrency must be at least 1', {\n args: { concurrency },\n type: RangeError,\n });\n\n let activeCount = 0;\n let idlePromise: Promise<void> | null = null;\n let idleResolve: (() => void) | null = null;\n\n const queue: Array<{\n fn: () => Promise<unknown>;\n resolve: (value: unknown) => void;\n reject: (error: unknown) => void;\n }> = [];\n\n const next = (): void => {\n if (activeCount < concurrency && queue.length > 0) {\n const task = queue.shift()!;\n activeCount++;\n\n task\n .fn()\n .then(task.resolve)\n .catch(task.reject)\n .finally(() => {\n activeCount--;\n next();\n\n if (activeCount === 0 && queue.length === 0 && idleResolve) {\n idleResolve();\n idlePromise = null;\n idleResolve = null;\n }\n });\n }\n };\n\n return {\n /**\n * Adds a promise-returning function to the queue\n */\n add: <T>(fn: () => Promise<T>): Promise<T> => {\n return new Promise<T>((resolve, reject) => {\n queue.push({\n fn: fn as () => Promise<unknown>,\n reject,\n resolve: resolve as (value: unknown) => void,\n });\n next();\n });\n },\n\n /**\n * Clears all pending tasks from the queue\n */\n clear: (): void => {\n queue.length = 0;\n },\n\n /**\n * Returns a promise that resolves when the queue becomes idle\n */\n onIdle: (): Promise<void> => {\n if (activeCount === 0 && queue.length === 0) {\n return Promise.resolve();\n }\n\n if (!idlePromise) {\n idlePromise = new Promise<void>((resolve) => {\n idleResolve = resolve;\n });\n }\n\n return idlePromise;\n },\n\n /**\n * Returns the number of currently active promises\n */\n get pending(): number {\n return activeCount;\n },\n\n /**\n * Returns the current size of the queue\n */\n get size(): number {\n return queue.length;\n },\n };\n}\n"],"names":["queue","options","concurrency","assert","activeCount","idlePromise","idleResolve","next","task","fn","resolve","reject"],"mappings":"0HAoBO,SAASA,EAAMC,EAAoC,GAAI,CAC5D,KAAM,CAAE,YAAAC,EAAc,CAAA,EAAMD,EAE5BE,SAAOD,GAAe,EAAG,iCAAkC,CACzD,KAAM,CAAE,YAAAA,CAAA,EACR,KAAM,UAAA,CACP,EAED,IAAIE,EAAc,EACdC,EAAoC,KACpCC,EAAmC,KAEvC,MAAMN,EAID,CAAA,EAECO,EAAO,IAAY,CACvB,GAAIH,EAAcF,GAAeF,EAAM,OAAS,EAAG,CACjD,MAAMQ,EAAOR,EAAM,MAAA,EACnBI,IAEAI,EACG,GAAA,EACA,KAAKA,EAAK,OAAO,EACjB,MAAMA,EAAK,MAAM,EACjB,QAAQ,IAAM,CACbJ,IACAG,EAAA,EAEIH,IAAgB,GAAKJ,EAAM,SAAW,GAAKM,IAC7CA,EAAA,EACAD,EAAc,KACdC,EAAc,KAElB,CAAC,CACL,CACF,EAEA,MAAO,CAIL,IAASG,GACA,IAAI,QAAW,CAACC,EAASC,IAAW,CACzCX,EAAM,KAAK,CACT,GAAAS,EACA,OAAAE,EACA,QAAAD,CAAA,CACD,EACDH,EAAA,CACF,CAAC,EAMH,MAAO,IAAY,CACjBP,EAAM,OAAS,CACjB,EAKA,OAAQ,IACFI,IAAgB,GAAKJ,EAAM,SAAW,EACjC,QAAQ,QAAA,GAGZK,IACHA,EAAc,IAAI,QAAeK,GAAY,CAC3CJ,EAAcI,CAChB,CAAC,GAGIL,GAMT,IAAI,SAAkB,CACpB,OAAOD,CACT,EAKA,IAAI,MAAe,CACjB,OAAOJ,EAAM,MACf,CAAA,CAEJ"}
@@ -0,0 +1,57 @@
1
+ import { assert as a } from "../function/assert.js";
2
+ function f(u = {}) {
3
+ const { concurrency: o = 1 } = u;
4
+ a(o >= 1, "Concurrency must be at least 1", {
5
+ args: { concurrency: o },
6
+ type: RangeError
7
+ });
8
+ let t = 0, r = null, l = null;
9
+ const e = [], s = () => {
10
+ if (t < o && e.length > 0) {
11
+ const n = e.shift();
12
+ t++, n.fn().then(n.resolve).catch(n.reject).finally(() => {
13
+ t--, s(), t === 0 && e.length === 0 && l && (l(), r = null, l = null);
14
+ });
15
+ }
16
+ };
17
+ return {
18
+ /**
19
+ * Adds a promise-returning function to the queue
20
+ */
21
+ add: (n) => new Promise((i, c) => {
22
+ e.push({
23
+ fn: n,
24
+ reject: c,
25
+ resolve: i
26
+ }), s();
27
+ }),
28
+ /**
29
+ * Clears all pending tasks from the queue
30
+ */
31
+ clear: () => {
32
+ e.length = 0;
33
+ },
34
+ /**
35
+ * Returns a promise that resolves when the queue becomes idle
36
+ */
37
+ onIdle: () => t === 0 && e.length === 0 ? Promise.resolve() : (r || (r = new Promise((n) => {
38
+ l = n;
39
+ })), r),
40
+ /**
41
+ * Returns the number of currently active promises
42
+ */
43
+ get pending() {
44
+ return t;
45
+ },
46
+ /**
47
+ * Returns the current size of the queue
48
+ */
49
+ get size() {
50
+ return e.length;
51
+ }
52
+ };
53
+ }
54
+ export {
55
+ f as queue
56
+ };
57
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sources":["../../src/async/queue.ts"],"sourcesContent":["import { assert } from '../function/assert';\n\n/**\n * Creates a promise queue that processes promises sequentially with optional concurrency limit.\n *\n * @example\n * ```ts\n * const requestQueue = queue({ concurrency: 2 });\n *\n * requestQueue.add(() => fetch('/api/1'));\n * requestQueue.add(() => fetch('/api/2'));\n * requestQueue.add(() => fetch('/api/3'));\n *\n * await requestQueue.onIdle(); // Wait for all tasks to complete\n * ```\n *\n * @param options - Queue configuration\n * @param options.concurrency - Maximum number of concurrent promises (default: 1)\n * @returns Queue instance with add, onIdle, and clear methods\n */\nexport function queue(options: { concurrency?: number } = {}) {\n const { concurrency = 1 } = options;\n\n assert(concurrency >= 1, 'Concurrency must be at least 1', {\n args: { concurrency },\n type: RangeError,\n });\n\n let activeCount = 0;\n let idlePromise: Promise<void> | null = null;\n let idleResolve: (() => void) | null = null;\n\n const queue: Array<{\n fn: () => Promise<unknown>;\n resolve: (value: unknown) => void;\n reject: (error: unknown) => void;\n }> = [];\n\n const next = (): void => {\n if (activeCount < concurrency && queue.length > 0) {\n const task = queue.shift()!;\n activeCount++;\n\n task\n .fn()\n .then(task.resolve)\n .catch(task.reject)\n .finally(() => {\n activeCount--;\n next();\n\n if (activeCount === 0 && queue.length === 0 && idleResolve) {\n idleResolve();\n idlePromise = null;\n idleResolve = null;\n }\n });\n }\n };\n\n return {\n /**\n * Adds a promise-returning function to the queue\n */\n add: <T>(fn: () => Promise<T>): Promise<T> => {\n return new Promise<T>((resolve, reject) => {\n queue.push({\n fn: fn as () => Promise<unknown>,\n reject,\n resolve: resolve as (value: unknown) => void,\n });\n next();\n });\n },\n\n /**\n * Clears all pending tasks from the queue\n */\n clear: (): void => {\n queue.length = 0;\n },\n\n /**\n * Returns a promise that resolves when the queue becomes idle\n */\n onIdle: (): Promise<void> => {\n if (activeCount === 0 && queue.length === 0) {\n return Promise.resolve();\n }\n\n if (!idlePromise) {\n idlePromise = new Promise<void>((resolve) => {\n idleResolve = resolve;\n });\n }\n\n return idlePromise;\n },\n\n /**\n * Returns the number of currently active promises\n */\n get pending(): number {\n return activeCount;\n },\n\n /**\n * Returns the current size of the queue\n */\n get size(): number {\n return queue.length;\n },\n };\n}\n"],"names":["queue","options","concurrency","assert","activeCount","idlePromise","idleResolve","next","task","fn","resolve","reject"],"mappings":";AAoBO,SAASA,EAAMC,IAAoC,IAAI;AAC5D,QAAM,EAAE,aAAAC,IAAc,EAAA,IAAMD;AAE5B,EAAAE,EAAOD,KAAe,GAAG,kCAAkC;AAAA,IACzD,MAAM,EAAE,aAAAA,EAAA;AAAA,IACR,MAAM;AAAA,EAAA,CACP;AAED,MAAIE,IAAc,GACdC,IAAoC,MACpCC,IAAmC;AAEvC,QAAMN,IAID,CAAA,GAECO,IAAO,MAAY;AACvB,QAAIH,IAAcF,KAAeF,EAAM,SAAS,GAAG;AACjD,YAAMQ,IAAOR,EAAM,MAAA;AACnB,MAAAI,KAEAI,EACG,GAAA,EACA,KAAKA,EAAK,OAAO,EACjB,MAAMA,EAAK,MAAM,EACjB,QAAQ,MAAM;AACb,QAAAJ,KACAG,EAAA,GAEIH,MAAgB,KAAKJ,EAAM,WAAW,KAAKM,MAC7CA,EAAA,GACAD,IAAc,MACdC,IAAc;AAAA,MAElB,CAAC;AAAA,IACL;AAAA,EACF;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA,IAIL,KAAK,CAAIG,MACA,IAAI,QAAW,CAACC,GAASC,MAAW;AACzCX,MAAAA,EAAM,KAAK;AAAA,QACT,IAAAS;AAAA,QACA,QAAAE;AAAA,QACA,SAAAD;AAAA,MAAA,CACD,GACDH,EAAA;AAAA,IACF,CAAC;AAAA;AAAA;AAAA;AAAA,IAMH,OAAO,MAAY;AACjBP,MAAAA,EAAM,SAAS;AAAA,IACjB;AAAA;AAAA;AAAA;AAAA,IAKA,QAAQ,MACFI,MAAgB,KAAKJ,EAAM,WAAW,IACjC,QAAQ,QAAA,KAGZK,MACHA,IAAc,IAAI,QAAc,CAACK,MAAY;AAC3C,MAAAJ,IAAcI;AAAA,IAChB,CAAC,IAGIL;AAAA;AAAA;AAAA;AAAA,IAMT,IAAI,UAAkB;AACpB,aAAOD;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,IAKA,IAAI,OAAe;AACjB,aAAOJ,EAAM;AAAA,IACf;AAAA,EAAA;AAEJ;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});async function o(e,r){const t=Array.isArray(e)?e:[e],a=new Promise(n=>setTimeout(n,r)),i=await Promise.race(t);return await a,i}exports.race=o;
2
+ //# sourceMappingURL=race.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"race.cjs","sources":["../../src/async/race.ts"],"sourcesContent":["/**\n * Race multiple promises but with a guaranteed minimum delay.\n * Useful for showing loading states for at least a minimum duration.\n *\n * @example\n * ```ts\n * // Show loading spinner for at least 500ms\n * const result = await race(\n * fetchData(),\n * 500\n * );\n *\n * // With multiple promises\n * const result = await race(\n * [fetch('/api/1'), fetch('/api/2')],\n * 1000\n * );\n * ```\n *\n * @param promises - Single promise or array of promises to race\n * @param minDelay - Minimum delay in milliseconds before resolving\n * @returns Promise that resolves with the first result after the minimum delay\n */\nexport async function race<T>(promises: Promise<T> | Promise<T>[], minDelay: number): Promise<T> {\n const promiseArray = Array.isArray(promises) ? promises : [promises];\n const minDelayPromise = new Promise<void>((resolve) => setTimeout(resolve, minDelay));\n\n const result = await Promise.race(promiseArray);\n await minDelayPromise;\n\n return result;\n}\n"],"names":["race","promises","minDelay","promiseArray","minDelayPromise","resolve","result"],"mappings":"gFAuBA,eAAsBA,EAAQC,EAAqCC,EAA8B,CAC/F,MAAMC,EAAe,MAAM,QAAQF,CAAQ,EAAIA,EAAW,CAACA,CAAQ,EAC7DG,EAAkB,IAAI,QAAeC,GAAY,WAAWA,EAASH,CAAQ,CAAC,EAE9EI,EAAS,MAAM,QAAQ,KAAKH,CAAY,EAC9C,aAAMC,EAECE,CACT"}
@@ -0,0 +1,8 @@
1
+ async function o(r, a) {
2
+ const e = Array.isArray(r) ? r : [r], t = new Promise((i) => setTimeout(i, a)), n = await Promise.race(e);
3
+ return await t, n;
4
+ }
5
+ export {
6
+ o as race
7
+ };
8
+ //# sourceMappingURL=race.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"race.js","sources":["../../src/async/race.ts"],"sourcesContent":["/**\n * Race multiple promises but with a guaranteed minimum delay.\n * Useful for showing loading states for at least a minimum duration.\n *\n * @example\n * ```ts\n * // Show loading spinner for at least 500ms\n * const result = await race(\n * fetchData(),\n * 500\n * );\n *\n * // With multiple promises\n * const result = await race(\n * [fetch('/api/1'), fetch('/api/2')],\n * 1000\n * );\n * ```\n *\n * @param promises - Single promise or array of promises to race\n * @param minDelay - Minimum delay in milliseconds before resolving\n * @returns Promise that resolves with the first result after the minimum delay\n */\nexport async function race<T>(promises: Promise<T> | Promise<T>[], minDelay: number): Promise<T> {\n const promiseArray = Array.isArray(promises) ? promises : [promises];\n const minDelayPromise = new Promise<void>((resolve) => setTimeout(resolve, minDelay));\n\n const result = await Promise.race(promiseArray);\n await minDelayPromise;\n\n return result;\n}\n"],"names":["race","promises","minDelay","promiseArray","minDelayPromise","resolve","result"],"mappings":"AAuBA,eAAsBA,EAAQC,GAAqCC,GAA8B;AAC/F,QAAMC,IAAe,MAAM,QAAQF,CAAQ,IAAIA,IAAW,CAACA,CAAQ,GAC7DG,IAAkB,IAAI,QAAc,CAACC,MAAY,WAAWA,GAASH,CAAQ,CAAC,GAE9EI,IAAS,MAAM,QAAQ,KAAKH,CAAY;AAC9C,eAAMC,GAECE;AACT;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.cjs","sources":["../../src/async/retry.ts"],"sourcesContent":["import { Logit } from '@vielzeug/logit';\nimport { sleep } from './sleep';\n\n/**\n * Retries an asynchronous function a specified number of times with delay and optional exponential backoff.\n *\n * @example\n * ```ts\n * retry(() => fetchData(), { times: 3, delay: 1000, backoff: 2, signal: abortSignal })\n * .then(result => console.log(result))\n * .catch(error => console.error(error));\n * ```\n *\n * @param fn - The asynchronous function to retry.\n * @param options - (optional) Options for retrying the function.\n * @param [options.times=3] - The number of retry attempts.\n * @param [options.delay=250] - The delay in milliseconds between retries.\n * @param [options.backoff=1] - Exponential backoff factor (default: 1 → no backoff).\n * @param [options.signal] - `AbortSignal` to allow canceling retries.\n *\n * @returns The result of the asynchronous function.\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n {\n times = 3,\n delay = 250,\n backoff = 1,\n signal,\n }: {\n times?: number;\n delay?: number;\n backoff?: number | ((attempt: number, delay: number) => number);\n signal?: AbortSignal;\n } = {},\n): Promise<T> {\n let currentDelay = delay;\n\n for (let attempt = 1; attempt <= times; attempt++) {\n if (signal?.aborted) {\n Logit.warn(`retry() -> Aborted after ${attempt - 1} attempts`);\n throw new Error('Retry aborted');\n }\n\n try {\n return await fn();\n } catch (err) {\n if (attempt === times) throw err;\n\n Logit.warn(`retry() -> ${err}, attempt ${attempt}/${times}, retrying in ${currentDelay}ms`);\n if (currentDelay > 0) await sleep(currentDelay);\n\n currentDelay = typeof backoff === 'function' ? backoff(attempt, currentDelay) : currentDelay * backoff;\n }\n }\n\n throw new Error('Retry failed unexpectedly');\n}\n"],"names":["retry","fn","times","delay","backoff","signal","currentDelay","attempt","Logit","err","sleep"],"mappings":"oJAsBA,eAAsBA,EACpBC,EACA,CACE,MAAAC,EAAQ,EACR,MAAAC,EAAQ,IACR,QAAAC,EAAU,EACV,OAAAC,CACF,EAKI,GACQ,CACZ,IAAIC,EAAeH,EAEnB,QAASI,EAAU,EAAGA,GAAWL,EAAOK,IAAW,CACjD,GAAIF,GAAQ,QACVG,MAAAA,EAAAA,MAAM,KAAK,4BAA4BD,EAAU,CAAC,WAAW,EACvD,IAAI,MAAM,eAAe,EAGjC,GAAI,CACF,OAAO,MAAMN,EAAA,CACf,OAASQ,EAAK,CACZ,GAAIF,IAAYL,EAAO,MAAMO,EAE7BD,EAAAA,MAAM,KAAK,cAAcC,CAAG,aAAaF,CAAO,IAAIL,CAAK,iBAAiBI,CAAY,IAAI,EACtFA,EAAe,GAAG,MAAMI,EAAAA,MAAMJ,CAAY,EAE9CA,EAAe,OAAOF,GAAY,WAAaA,EAAQG,EAASD,CAAY,EAAIA,EAAeF,CACjG,CACF,CAEA,MAAM,IAAI,MAAM,2BAA2B,CAC7C"}
@@ -1,17 +1,17 @@
1
1
  import { Logit as n } from "../logit/dist/logit.js";
2
2
  import { sleep as w } from "./sleep.js";
3
- async function m(y, {
3
+ async function m(i, {
4
4
  times: e = 3,
5
- delay: i = 250,
5
+ delay: y = 250,
6
6
  backoff: o = 1,
7
7
  signal: p
8
8
  } = {}) {
9
- let r = i;
9
+ let r = y;
10
10
  for (let t = 1; t <= e; t++) {
11
11
  if (p?.aborted)
12
12
  throw n.warn(`retry() -> Aborted after ${t - 1} attempts`), new Error("Retry aborted");
13
13
  try {
14
- return await y();
14
+ return await i();
15
15
  } catch (a) {
16
16
  if (t === e) throw a;
17
17
  n.warn(`retry() -> ${a}, attempt ${t}/${e}, retrying in ${r}ms`), r > 0 && await w(r), r = typeof o == "function" ? o(t, r) : r * o;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sources":["../../src/async/retry.ts"],"sourcesContent":["import { Logit } from '@vielzeug/logit';\nimport { sleep } from './sleep';\n\n/**\n * Retries an asynchronous function a specified number of times with delay and optional exponential backoff.\n *\n * @example\n * ```ts\n * retry(() => fetchData(), { times: 3, delay: 1000, backoff: 2, signal: abortSignal })\n * .then(result => console.log(result))\n * .catch(error => console.error(error));\n * ```\n *\n * @param fn - The asynchronous function to retry.\n * @param options - (optional) Options for retrying the function.\n * @param [options.times=3] - The number of retry attempts.\n * @param [options.delay=250] - The delay in milliseconds between retries.\n * @param [options.backoff=1] - Exponential backoff factor (default: 1 → no backoff).\n * @param [options.signal] - `AbortSignal` to allow canceling retries.\n *\n * @returns The result of the asynchronous function.\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n {\n times = 3,\n delay = 250,\n backoff = 1,\n signal,\n }: {\n times?: number;\n delay?: number;\n backoff?: number | ((attempt: number, delay: number) => number);\n signal?: AbortSignal;\n } = {},\n): Promise<T> {\n let currentDelay = delay;\n\n for (let attempt = 1; attempt <= times; attempt++) {\n if (signal?.aborted) {\n Logit.warn(`retry() -> Aborted after ${attempt - 1} attempts`);\n throw new Error('Retry aborted');\n }\n\n try {\n return await fn();\n } catch (err) {\n if (attempt === times) throw err;\n\n Logit.warn(`retry() -> ${err}, attempt ${attempt}/${times}, retrying in ${currentDelay}ms`);\n if (currentDelay > 0) await sleep(currentDelay);\n\n currentDelay = typeof backoff === 'function' ? backoff(attempt, currentDelay) : currentDelay * backoff;\n }\n }\n\n throw new Error('Retry failed unexpectedly');\n}\n"],"names":["retry","fn","times","delay","backoff","signal","currentDelay","attempt","Logit","err","sleep"],"mappings":";;AAsBA,eAAsBA,EACpBC,GACA;AAAA,EACE,OAAAC,IAAQ;AAAA,EACR,OAAAC,IAAQ;AAAA,EACR,SAAAC,IAAU;AAAA,EACV,QAAAC;AACF,IAKI,IACQ;AACZ,MAAIC,IAAeH;AAEnB,WAASI,IAAU,GAAGA,KAAWL,GAAOK,KAAW;AACjD,QAAIF,GAAQ;AACVG,YAAAA,EAAM,KAAK,4BAA4BD,IAAU,CAAC,WAAW,GACvD,IAAI,MAAM,eAAe;AAGjC,QAAI;AACF,aAAO,MAAMN,EAAA;AAAA,IACf,SAASQ,GAAK;AACZ,UAAIF,MAAYL,EAAO,OAAMO;AAE7BD,MAAAA,EAAM,KAAK,cAAcC,CAAG,aAAaF,CAAO,IAAIL,CAAK,iBAAiBI,CAAY,IAAI,GACtFA,IAAe,KAAG,MAAMI,EAAMJ,CAAY,GAE9CA,IAAe,OAAOF,KAAY,aAAaA,EAAQG,GAASD,CAAY,IAAIA,IAAeF;AAAA,IACjG;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,2BAA2B;AAC7C;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("../function/assert.cjs");async function s(e){return n.assert(typeof e=="number"&&e>=0&&Number.isFinite(e),"Timeout must be a non-negative finite number",{args:{timeout:e},type:TypeError}),new Promise(r=>setTimeout(r,e))}exports.sleep=s;
2
+ //# sourceMappingURL=sleep.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep.cjs","sources":["../../src/async/sleep.ts"],"sourcesContent":["import { assert } from '../function/assert';\n\n/**\n * Creates a Promise that resolves after a specified amount of time.\n *\n * @example\n * ```ts\n * sleep(1000).then(() => console.log('Hello, world!')); // logs 'Hello, world!' after 1 second\n * ```\n *\n * @param timeout - The number of milliseconds to wait before resolving the Promise.\n *\n * @returns A Promise that resolves after the specified time.\n *\n * @throws {TypeError} If timeout is not a non-negative number.\n */\nexport async function sleep(timeout: number): Promise<void> {\n assert(\n typeof timeout === 'number' && timeout >= 0 && Number.isFinite(timeout),\n 'Timeout must be a non-negative finite number',\n { args: { timeout }, type: TypeError },\n );\n return new Promise((resolve) => setTimeout(resolve, timeout));\n}\n"],"names":["sleep","timeout","assert","resolve"],"mappings":"0HAgBA,eAAsBA,EAAMC,EAAgC,CAC1DC,OAAAA,EAAAA,OACE,OAAOD,GAAY,UAAYA,GAAW,GAAK,OAAO,SAASA,CAAO,EACtE,+CACA,CAAE,KAAM,CAAE,QAAAA,CAAA,EAAW,KAAM,SAAA,CAAU,EAEhC,IAAI,QAASE,GAAY,WAAWA,EAASF,CAAO,CAAC,CAC9D"}
@@ -1,4 +1,4 @@
1
- import { assert as n } from "./assert.js";
1
+ import { assert as n } from "../function/assert.js";
2
2
  async function i(e) {
3
3
  return n(
4
4
  typeof e == "number" && e >= 0 && Number.isFinite(e),
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep.js","sources":["../../src/async/sleep.ts"],"sourcesContent":["import { assert } from '../function/assert';\n\n/**\n * Creates a Promise that resolves after a specified amount of time.\n *\n * @example\n * ```ts\n * sleep(1000).then(() => console.log('Hello, world!')); // logs 'Hello, world!' after 1 second\n * ```\n *\n * @param timeout - The number of milliseconds to wait before resolving the Promise.\n *\n * @returns A Promise that resolves after the specified time.\n *\n * @throws {TypeError} If timeout is not a non-negative number.\n */\nexport async function sleep(timeout: number): Promise<void> {\n assert(\n typeof timeout === 'number' && timeout >= 0 && Number.isFinite(timeout),\n 'Timeout must be a non-negative finite number',\n { args: { timeout }, type: TypeError },\n );\n return new Promise((resolve) => setTimeout(resolve, timeout));\n}\n"],"names":["sleep","timeout","assert","resolve"],"mappings":";AAgBA,eAAsBA,EAAMC,GAAgC;AAC1D,SAAAC;AAAA,IACE,OAAOD,KAAY,YAAYA,KAAW,KAAK,OAAO,SAASA,CAAO;AAAA,IACtE;AAAA,IACA,EAAE,MAAM,EAAE,SAAAA,EAAA,GAAW,MAAM,UAAA;AAAA,EAAU,GAEhC,IAAI,QAAQ,CAACE,MAAY,WAAWA,GAASF,CAAO,CAAC;AAC9D;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});async function d(u,c={}){const{timeout:n=5e3,interval:l=100,signal:t}=c;if(t?.aborted)throw new DOMException("Aborted","AbortError");return new Promise((b,e)=>{const w=Date.now();let o=null;const r=()=>{o!==null&&(clearTimeout(o),o=null),t?.removeEventListener("abort",i)},i=()=>{r(),e(new DOMException("Aborted","AbortError"))},a=async()=>{try{if(t?.aborted){r(),e(new DOMException("Aborted","AbortError"));return}if(await u()){r(),b();return}if(Date.now()-w>=n){r(),e(new Error(`waitFor timed out after ${n}ms`));return}o=setTimeout(a,l)}catch(s){r(),e(s)}};t&&t.addEventListener("abort",i,{once:!0}),a()})}exports.waitFor=d;
2
+ //# sourceMappingURL=waitFor.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waitFor.cjs","sources":["../../src/async/waitFor.ts"],"sourcesContent":["/**\n * Waits for a condition to become true by polling.\n * Useful for waiting for DOM elements, API states, or other conditions.\n *\n * @example\n * ```ts\n * // Wait for an element to appear\n * await waitFor(() => document.querySelector('#myElement') !== null);\n *\n * // Wait for API to be ready\n * await waitFor(\n * async () => {\n * const res = await fetch('/api/health');\n * return res.ok;\n * },\n * { timeout: 30000, interval: 1000 }\n * );\n * ```\n *\n * @param condition - Function that returns true when condition is met\n * @param options - Configuration options\n * @param options.timeout - Maximum time to wait in ms (default: 5000)\n * @param options.interval - Polling interval in ms (default: 100)\n * @param options.signal - AbortSignal to cancel waiting\n * @returns Promise that resolves when condition becomes true\n * @throws {Error} If timeout is reached\n * @throws {DOMException} If aborted via signal\n */\nexport async function waitFor(\n condition: () => boolean | Promise<boolean>,\n options: {\n timeout?: number;\n interval?: number;\n signal?: AbortSignal;\n } = {},\n): Promise<void> {\n const { timeout: timeoutMs = 5000, interval = 100, signal } = options;\n\n if (signal?.aborted) {\n throw new DOMException('Aborted', 'AbortError');\n }\n\n return new Promise<void>((resolve, reject) => {\n const startTime = Date.now();\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let intervalId: ReturnType<typeof setTimeout> | null = null;\n\n const cleanup = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n if (intervalId !== null) {\n clearTimeout(intervalId);\n intervalId = null;\n }\n signal?.removeEventListener('abort', onAbort);\n };\n\n const onAbort = () => {\n cleanup();\n reject(new DOMException('Aborted', 'AbortError'));\n };\n\n const check = async () => {\n try {\n // Check if aborted\n if (signal?.aborted) {\n cleanup();\n reject(new DOMException('Aborted', 'AbortError'));\n return;\n }\n\n // Check condition\n const result = await condition();\n\n if (result) {\n cleanup();\n resolve();\n return;\n }\n\n // Check timeout\n if (Date.now() - startTime >= timeoutMs) {\n cleanup();\n reject(new Error(`waitFor timed out after ${timeoutMs}ms`));\n return;\n }\n\n // Schedule next check\n intervalId = setTimeout(check, interval);\n } catch (error) {\n // If the condition throws, clean up and reject\n cleanup();\n reject(error);\n }\n };\n\n // Set up abort listener\n if (signal) {\n signal.addEventListener('abort', onAbort, { once: true });\n }\n\n // Start checking\n check();\n });\n}\n"],"names":["waitFor","condition","options","timeoutMs","interval","signal","resolve","reject","startTime","intervalId","cleanup","onAbort","check","error"],"mappings":"gFA4BA,eAAsBA,EACpBC,EACAC,EAII,GACW,CACf,KAAM,CAAE,QAASC,EAAY,IAAM,SAAAC,EAAW,IAAK,OAAAC,GAAWH,EAE9D,GAAIG,GAAQ,QACV,MAAM,IAAI,aAAa,UAAW,YAAY,EAGhD,OAAO,IAAI,QAAc,CAACC,EAASC,IAAW,CAC5C,MAAMC,EAAY,KAAK,IAAA,EAEvB,IAAIC,EAAmD,KAEvD,MAAMC,EAAU,IAAM,CAKhBD,IAAe,OACjB,aAAaA,CAAU,EACvBA,EAAa,MAEfJ,GAAQ,oBAAoB,QAASM,CAAO,CAC9C,EAEMA,EAAU,IAAM,CACpBD,EAAA,EACAH,EAAO,IAAI,aAAa,UAAW,YAAY,CAAC,CAClD,EAEMK,EAAQ,SAAY,CACxB,GAAI,CAEF,GAAIP,GAAQ,QAAS,CACnBK,EAAA,EACAH,EAAO,IAAI,aAAa,UAAW,YAAY,CAAC,EAChD,MACF,CAKA,GAFe,MAAMN,EAAA,EAET,CACVS,EAAA,EACAJ,EAAA,EACA,MACF,CAGA,GAAI,KAAK,MAAQE,GAAaL,EAAW,CACvCO,EAAA,EACAH,EAAO,IAAI,MAAM,2BAA2BJ,CAAS,IAAI,CAAC,EAC1D,MACF,CAGAM,EAAa,WAAWG,EAAOR,CAAQ,CACzC,OAASS,EAAO,CAEdH,EAAA,EACAH,EAAOM,CAAK,CACd,CACF,EAGIR,GACFA,EAAO,iBAAiB,QAASM,EAAS,CAAE,KAAM,GAAM,EAI1DC,EAAA,CACF,CAAC,CACH"}
@@ -0,0 +1,37 @@
1
+ async function d(u, c = {}) {
2
+ const { timeout: n = 5e3, interval: l = 100, signal: t } = c;
3
+ if (t?.aborted)
4
+ throw new DOMException("Aborted", "AbortError");
5
+ return new Promise((b, e) => {
6
+ const w = Date.now();
7
+ let o = null;
8
+ const r = () => {
9
+ o !== null && (clearTimeout(o), o = null), t?.removeEventListener("abort", i);
10
+ }, i = () => {
11
+ r(), e(new DOMException("Aborted", "AbortError"));
12
+ }, a = async () => {
13
+ try {
14
+ if (t?.aborted) {
15
+ r(), e(new DOMException("Aborted", "AbortError"));
16
+ return;
17
+ }
18
+ if (await u()) {
19
+ r(), b();
20
+ return;
21
+ }
22
+ if (Date.now() - w >= n) {
23
+ r(), e(new Error(`waitFor timed out after ${n}ms`));
24
+ return;
25
+ }
26
+ o = setTimeout(a, l);
27
+ } catch (s) {
28
+ r(), e(s);
29
+ }
30
+ };
31
+ t && t.addEventListener("abort", i, { once: !0 }), a();
32
+ });
33
+ }
34
+ export {
35
+ d as waitFor
36
+ };
37
+ //# sourceMappingURL=waitFor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waitFor.js","sources":["../../src/async/waitFor.ts"],"sourcesContent":["/**\n * Waits for a condition to become true by polling.\n * Useful for waiting for DOM elements, API states, or other conditions.\n *\n * @example\n * ```ts\n * // Wait for an element to appear\n * await waitFor(() => document.querySelector('#myElement') !== null);\n *\n * // Wait for API to be ready\n * await waitFor(\n * async () => {\n * const res = await fetch('/api/health');\n * return res.ok;\n * },\n * { timeout: 30000, interval: 1000 }\n * );\n * ```\n *\n * @param condition - Function that returns true when condition is met\n * @param options - Configuration options\n * @param options.timeout - Maximum time to wait in ms (default: 5000)\n * @param options.interval - Polling interval in ms (default: 100)\n * @param options.signal - AbortSignal to cancel waiting\n * @returns Promise that resolves when condition becomes true\n * @throws {Error} If timeout is reached\n * @throws {DOMException} If aborted via signal\n */\nexport async function waitFor(\n condition: () => boolean | Promise<boolean>,\n options: {\n timeout?: number;\n interval?: number;\n signal?: AbortSignal;\n } = {},\n): Promise<void> {\n const { timeout: timeoutMs = 5000, interval = 100, signal } = options;\n\n if (signal?.aborted) {\n throw new DOMException('Aborted', 'AbortError');\n }\n\n return new Promise<void>((resolve, reject) => {\n const startTime = Date.now();\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let intervalId: ReturnType<typeof setTimeout> | null = null;\n\n const cleanup = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n if (intervalId !== null) {\n clearTimeout(intervalId);\n intervalId = null;\n }\n signal?.removeEventListener('abort', onAbort);\n };\n\n const onAbort = () => {\n cleanup();\n reject(new DOMException('Aborted', 'AbortError'));\n };\n\n const check = async () => {\n try {\n // Check if aborted\n if (signal?.aborted) {\n cleanup();\n reject(new DOMException('Aborted', 'AbortError'));\n return;\n }\n\n // Check condition\n const result = await condition();\n\n if (result) {\n cleanup();\n resolve();\n return;\n }\n\n // Check timeout\n if (Date.now() - startTime >= timeoutMs) {\n cleanup();\n reject(new Error(`waitFor timed out after ${timeoutMs}ms`));\n return;\n }\n\n // Schedule next check\n intervalId = setTimeout(check, interval);\n } catch (error) {\n // If the condition throws, clean up and reject\n cleanup();\n reject(error);\n }\n };\n\n // Set up abort listener\n if (signal) {\n signal.addEventListener('abort', onAbort, { once: true });\n }\n\n // Start checking\n check();\n });\n}\n"],"names":["waitFor","condition","options","timeoutMs","interval","signal","resolve","reject","startTime","intervalId","cleanup","onAbort","check","error"],"mappings":"AA4BA,eAAsBA,EACpBC,GACAC,IAII,IACW;AACf,QAAM,EAAE,SAASC,IAAY,KAAM,UAAAC,IAAW,KAAK,QAAAC,MAAWH;AAE9D,MAAIG,GAAQ;AACV,UAAM,IAAI,aAAa,WAAW,YAAY;AAGhD,SAAO,IAAI,QAAc,CAACC,GAASC,MAAW;AAC5C,UAAMC,IAAY,KAAK,IAAA;AAEvB,QAAIC,IAAmD;AAEvD,UAAMC,IAAU,MAAM;AAKpB,MAAID,MAAe,SACjB,aAAaA,CAAU,GACvBA,IAAa,OAEfJ,GAAQ,oBAAoB,SAASM,CAAO;AAAA,IAC9C,GAEMA,IAAU,MAAM;AACpB,MAAAD,EAAA,GACAH,EAAO,IAAI,aAAa,WAAW,YAAY,CAAC;AAAA,IAClD,GAEMK,IAAQ,YAAY;AACxB,UAAI;AAEF,YAAIP,GAAQ,SAAS;AACnB,UAAAK,EAAA,GACAH,EAAO,IAAI,aAAa,WAAW,YAAY,CAAC;AAChD;AAAA,QACF;AAKA,YAFe,MAAMN,EAAA,GAET;AACV,UAAAS,EAAA,GACAJ,EAAA;AACA;AAAA,QACF;AAGA,YAAI,KAAK,QAAQE,KAAaL,GAAW;AACvC,UAAAO,EAAA,GACAH,EAAO,IAAI,MAAM,2BAA2BJ,CAAS,IAAI,CAAC;AAC1D;AAAA,QACF;AAGA,QAAAM,IAAa,WAAWG,GAAOR,CAAQ;AAAA,MACzC,SAASS,GAAO;AAEd,QAAAH,EAAA,GACAH,EAAOM,CAAK;AAAA,MACd;AAAA,IACF;AAGA,IAAIR,KACFA,EAAO,iBAAiB,SAASM,GAAS,EAAE,MAAM,IAAM,GAI1DC,EAAA;AAAA,EACF,CAAC;AACH;"}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const R=require("./array/aggregate.cjs"),m=require("./array/alternate.cjs"),p=require("./array/chunk.cjs"),_=require("./array/compact.cjs"),d=require("./array/contains.cjs"),S=require("./array/every.cjs"),E=require("./array/filter.cjs"),f=require("./array/find.cjs"),I=require("./array/findIndex.cjs"),g=require("./array/findLast.cjs"),O=require("./array/flatten.cjs"),y=require("./array/group.cjs"),M=require("./array/list.cjs"),b=require("./array/map.cjs"),v=require("./array/pick.cjs"),G=require("./array/reduce.cjs"),h=require("./array/remoteList.cjs"),N=require("./array/search.cjs"),k=require("./array/select.cjs"),P=require("./array/shift.cjs"),x=require("./array/some.cjs"),C=require("./array/sort.cjs"),T=require("./array/arrange.cjs"),A=require("./array/substitute.cjs"),D=require("./array/uniq.cjs"),B=require("./date/expires.cjs"),L=require("./date/interval.cjs"),w=require("./date/timeDiff.cjs"),U=require("./function/assert.cjs"),F=require("./function/assertParams.cjs"),J=require("./function/attempt.cjs"),W=require("./function/compare.cjs"),j=require("./function/compareBy.cjs"),Y=require("./function/compose.cjs"),Z=require("./function/curry.cjs"),H=require("./function/debounce.cjs"),Q=require("./function/delay.cjs"),V=require("./function/fp.cjs"),z=require("./function/memo.cjs"),K=require("./function/once.cjs"),X=require("./function/parallel.cjs"),$=require("./function/pipe.cjs"),ee=require("./function/predict.cjs"),re=require("./function/proxy.cjs"),ie=require("./function/prune.cjs"),se=require("./function/retry.cjs"),te=require("./function/sleep.cjs"),ne=require("./function/throttle.cjs"),oe=require("./function/worker.cjs"),ce=require("./math/abs.cjs"),ue=require("./math/add.cjs"),ae=require("./math/allocate.cjs"),qe=require("./math/average.cjs"),le=require("./math/boil.cjs"),Re=require("./math/clamp.cjs"),me=require("./math/distribute.cjs"),pe=require("./math/divide.cjs"),_e=require("./math/max.cjs"),de=require("./math/median.cjs"),Se=require("./math/min.cjs"),Ee=require("./math/multiply.cjs"),fe=require("./math/range.cjs"),Ie=require("./math/rate.cjs"),ge=require("./math/round.cjs"),Oe=require("./math/subtract.cjs"),ye=require("./math/sum.cjs"),Me=require("./money/currency.cjs"),be=require("./money/exchange.cjs"),ve=require("./object/clone.cjs"),Ge=require("./object/diff.cjs"),he=require("./object/entries.cjs"),Ne=require("./object/keys.cjs"),ke=require("./object/merge.cjs"),Pe=require("./object/parseJSON.cjs"),xe=require("./object/path.cjs"),Ce=require("./object/seek.cjs"),Te=require("./object/values.cjs"),Ae=require("./random/draw.cjs"),De=require("./random/random.cjs"),Be=require("./random/shuffle.cjs"),Le=require("./random/uuid.cjs"),we=require("./string/camelCase.cjs"),Ue=require("./string/kebabCase.cjs"),Fe=require("./string/pascalCase.cjs"),Je=require("./string/similarity.cjs"),We=require("./string/snakeCase.cjs"),je=require("./string/truncate.cjs"),Ye=require("./typed/ge.cjs"),Ze=require("./typed/gt.cjs"),He=require("./typed/is.cjs"),e=require("./typed/isArray.cjs"),Qe=require("./typed/isBoolean.cjs"),r=require("./typed/isDate.cjs"),Ve=require("./typed/isDefined.cjs"),i=require("./typed/isEmpty.cjs"),s=require("./typed/isEqual.cjs"),ze=require("./typed/isEven.cjs"),t=require("./typed/isFunction.cjs"),Ke=require("./typed/isNegative.cjs"),n=require("./typed/isNil.cjs"),o=require("./typed/isNumber.cjs"),c=require("./typed/isObject.cjs"),Xe=require("./typed/isOdd.cjs"),$e=require("./typed/isPositive.cjs"),u=require("./typed/isPrimitive.cjs"),a=require("./typed/isPromise.cjs"),er=require("./typed/isRegex.cjs"),q=require("./typed/isString.cjs"),l=require("./typed/isWithin.cjs"),rr=require("./typed/isZero.cjs"),ir=require("./typed/le.cjs"),sr=require("./typed/lt.cjs"),tr=require("./typed/typeOf.cjs");exports.aggregate=R.aggregate;exports.alternate=m.alternate;exports.chunk=p.chunk;exports.compact=_.compact;exports.contains=d.contains;exports.every=S.every;exports.filter=E.filter;exports.find=f.find;exports.findIndex=I.findIndex;exports.findLast=g.findLast;exports.flatten=O.flatten;exports.group=y.group;exports.list=M.list;exports.map=b.map;exports.pick=v.pick;exports.reduce=G.reduce;exports.remoteList=h.remoteList;exports.search=N.search;exports.select=k.select;exports.shift=P.shift;exports.some=x.some;exports.sort=C.sort;exports.arrange=T.arrange;exports.substitute=A.substitute;exports.uniq=D.uniq;exports.expires=B.expires;exports.interval=L.interval;exports.timeDiff=w.timeDiff;exports.assert=U.assert;exports.assertParams=F.assertParams;exports.attempt=J.attempt;exports.compare=W.compare;exports.compareBy=j.compareBy;exports.compose=Y.compose;exports.curry=Z.curry;exports.debounce=H.debounce;exports.delay=Q.delay;exports.fp=V.fp;exports.memo=z.memo;exports.once=K.once;exports.parallel=X.parallel;exports.pipe=$.pipe;exports.predict=ee.predict;exports.proxy=re.proxy;exports.prune=ie.prune;exports.retry=se.retry;exports.sleep=te.sleep;exports.throttle=ne.throttle;exports.worker=oe.worker;exports.abs=ce.abs;exports.add=ue.add;exports.allocate=ae.allocate;exports.average=qe.average;exports.boil=le.boil;exports.clamp=Re.clamp;exports.distribute=me.distribute;exports.divide=pe.divide;exports.max=_e.max;exports.median=de.median;exports.min=Se.min;exports.multiply=Ee.multiply;exports.range=fe.range;exports.rate=Ie.rate;exports.round=ge.round;exports.subtract=Oe.subtract;exports.sum=ye.sum;exports.currency=Me.currency;exports.exchange=be.exchange;exports.clone=ve.clone;exports.diff=Ge.diff;exports.entries=he.entries;exports.keys=Ne.keys;exports.merge=ke.merge;exports.parseJSON=Pe.parseJSON;exports.path=xe.path;exports.seek=Ce.seek;exports.values=Te.values;exports.draw=Ae.draw;exports.random=De.random;exports.shuffle=Be.shuffle;exports.uuid=Le.uuid;exports.camelCase=we.camelCase;exports.kebabCase=Ue.kebabCase;exports.pascalCase=Fe.pascalCase;exports.similarity=Je.similarity;exports.snakeCase=We.snakeCase;exports.truncate=je.truncate;exports.ge=Ye.ge;exports.gt=Ze.gt;exports.is=He.is;exports.IS_ARRAY_ERROR_MSG=e.IS_ARRAY_ERROR_MSG;exports.isArray=e.isArray;exports.isBoolean=Qe.isBoolean;exports.IS_DATE_ERROR_MSG=r.IS_DATE_ERROR_MSG;exports.isDate=r.isDate;exports.isDefined=Ve.isDefined;exports.IS_EMPTY_ERROR_MSG=i.IS_EMPTY_ERROR_MSG;exports.isEmpty=i.isEmpty;exports.IS_EQUAL_ERROR_MSG=s.IS_EQUAL_ERROR_MSG;exports.isEqual=s.isEqual;exports.isEven=ze.isEven;exports.IS_FUNCTION_ERROR_MSG=t.IS_FUNCTION_ERROR_MSG;exports.isFunction=t.isFunction;exports.isNegative=Ke.isNegative;exports.IS_NIL_ERROR_MSG=n.IS_NIL_ERROR_MSG;exports.isNil=n.isNil;exports.IS_NUMBER_ERROR_MSG=o.IS_NUMBER_ERROR_MSG;exports.isNumber=o.isNumber;exports.IS_OBJECT_ERROR_MSG=c.IS_OBJECT_ERROR_MSG;exports.isObject=c.isObject;exports.isOdd=Xe.isOdd;exports.isPositive=$e.isPositive;exports.IS_PRIMITIVE_ERROR_MSG=u.IS_PRIMITIVE_ERROR_MSG;exports.isPrimitive=u.isPrimitive;exports.IS_PROMISE_ERROR_MSG=a.IS_PROMISE_ERROR_MSG;exports.isPromise=a.isPromise;exports.isRegex=er.isRegex;exports.IS_STRING_ERROR_MSG=q.IS_STRING_ERROR_MSG;exports.isString=q.isString;exports.IS_WITHIN_ERROR_MSG=l.IS_WITHIN_ERROR_MSG;exports.isWithin=l.isWithin;exports.isZero=rr.isZero;exports.le=ir.le;exports.lt=sr.lt;exports.typeOf=tr.typeOf;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const R=require("./array/aggregate.cjs"),m=require("./array/alternate.cjs"),p=require("./array/arrange.cjs"),_=require("./array/chunk.cjs"),d=require("./array/compact.cjs"),S=require("./array/contains.cjs"),f=require("./array/every.cjs"),E=require("./array/filter.cjs"),I=require("./array/find.cjs"),g=require("./array/findIndex.cjs"),O=require("./array/findLast.cjs"),y=require("./array/flatten.cjs"),M=require("./array/group.cjs"),b=require("./array/list.cjs"),v=require("./array/map.cjs"),h=require("./array/pick.cjs"),G=require("./array/reduce.cjs"),N=require("./array/remoteList.cjs"),k=require("./array/search.cjs"),P=require("./array/select.cjs"),x=require("./array/shift.cjs"),C=require("./array/some.cjs"),T=require("./array/sort.cjs"),A=require("./array/substitute.cjs"),D=require("./array/uniq.cjs"),B=require("./async/attempt.cjs"),L=require("./async/defer.cjs"),w=require("./async/delay.cjs"),F=require("./async/parallel.cjs"),U=require("./async/pool.cjs"),J=require("./async/predict.cjs"),W=require("./async/queue.cjs"),j=require("./async/race.cjs"),Y=require("./async/retry.cjs"),Z=require("./async/sleep.cjs"),H=require("./async/waitFor.cjs"),Q=require("./date/expires.cjs"),V=require("./date/interval.cjs"),z=require("./date/timeDiff.cjs"),K=require("./function/assert.cjs"),X=require("./function/assertParams.cjs"),$=require("./function/compare.cjs"),ee=require("./function/compareBy.cjs"),re=require("./function/compose.cjs"),ie=require("./function/curry.cjs"),se=require("./function/debounce.cjs"),te=require("./function/fp.cjs"),ne=require("./function/memo.cjs"),oe=require("./function/once.cjs"),ce=require("./function/pipe.cjs"),ue=require("./function/proxy.cjs"),ae=require("./function/prune.cjs"),qe=require("./function/throttle.cjs"),le=require("./function/worker.cjs"),Re=require("./math/abs.cjs"),me=require("./math/add.cjs"),pe=require("./math/allocate.cjs"),_e=require("./math/average.cjs"),de=require("./math/boil.cjs"),Se=require("./math/clamp.cjs"),fe=require("./math/distribute.cjs"),Ee=require("./math/divide.cjs"),Ie=require("./math/max.cjs"),ge=require("./math/median.cjs"),Oe=require("./math/min.cjs"),ye=require("./math/multiply.cjs"),Me=require("./math/range.cjs"),be=require("./math/rate.cjs"),ve=require("./math/round.cjs"),he=require("./math/subtract.cjs"),Ge=require("./math/sum.cjs"),Ne=require("./money/currency.cjs"),ke=require("./money/exchange.cjs"),Pe=require("./object/cache.cjs"),xe=require("./object/clone.cjs"),Ce=require("./object/diff.cjs"),Te=require("./object/entries.cjs"),Ae=require("./object/keys.cjs"),De=require("./object/merge.cjs"),Be=require("./object/parseJSON.cjs"),Le=require("./object/path.cjs"),we=require("./object/seek.cjs"),Fe=require("./object/values.cjs"),Ue=require("./random/draw.cjs"),Je=require("./random/random.cjs"),We=require("./random/shuffle.cjs"),je=require("./random/uuid.cjs"),Ye=require("./string/camelCase.cjs"),Ze=require("./string/kebabCase.cjs"),He=require("./string/pascalCase.cjs"),Qe=require("./string/similarity.cjs"),Ve=require("./string/snakeCase.cjs"),ze=require("./string/truncate.cjs"),Ke=require("./typed/ge.cjs"),Xe=require("./typed/gt.cjs"),$e=require("./typed/is.cjs"),e=require("./typed/isArray.cjs"),er=require("./typed/isBoolean.cjs"),r=require("./typed/isDate.cjs"),rr=require("./typed/isDefined.cjs"),i=require("./typed/isEmpty.cjs"),s=require("./typed/isEqual.cjs"),ir=require("./typed/isEven.cjs"),t=require("./typed/isFunction.cjs"),sr=require("./typed/isNegative.cjs"),n=require("./typed/isNil.cjs"),o=require("./typed/isNumber.cjs"),c=require("./typed/isObject.cjs"),tr=require("./typed/isOdd.cjs"),nr=require("./typed/isPositive.cjs"),u=require("./typed/isPrimitive.cjs"),a=require("./typed/isPromise.cjs"),or=require("./typed/isRegex.cjs"),q=require("./typed/isString.cjs"),l=require("./typed/isWithin.cjs"),cr=require("./typed/isZero.cjs"),ur=require("./typed/le.cjs"),ar=require("./typed/lt.cjs"),qr=require("./typed/typeOf.cjs");exports.aggregate=R.aggregate;exports.alternate=m.alternate;exports.arrange=p.arrange;exports.chunk=_.chunk;exports.compact=d.compact;exports.contains=S.contains;exports.every=f.every;exports.filter=E.filter;exports.find=I.find;exports.findIndex=g.findIndex;exports.findLast=O.findLast;exports.flatten=y.flatten;exports.group=M.group;exports.list=b.list;exports.map=v.map;exports.pick=h.pick;exports.reduce=G.reduce;exports.remoteList=N.remoteList;exports.search=k.search;exports.select=P.select;exports.shift=x.shift;exports.some=C.some;exports.sort=T.sort;exports.substitute=A.substitute;exports.uniq=D.uniq;exports.attempt=B.attempt;exports.defer=L.defer;exports.delay=w.delay;exports.parallel=F.parallel;exports.pool=U.pool;exports.predict=J.predict;exports.queue=W.queue;exports.race=j.race;exports.retry=Y.retry;exports.sleep=Z.sleep;exports.waitFor=H.waitFor;exports.expires=Q.expires;exports.interval=V.interval;exports.timeDiff=z.timeDiff;exports.assert=K.assert;exports.assertParams=X.assertParams;exports.compare=$.compare;exports.compareBy=ee.compareBy;exports.compose=re.compose;exports.curry=ie.curry;exports.debounce=se.debounce;exports.fp=te.fp;exports.memo=ne.memo;exports.once=oe.once;exports.pipe=ce.pipe;exports.proxy=ue.proxy;exports.prune=ae.prune;exports.throttle=qe.throttle;exports.worker=le.worker;exports.abs=Re.abs;exports.add=me.add;exports.allocate=pe.allocate;exports.average=_e.average;exports.boil=de.boil;exports.clamp=Se.clamp;exports.distribute=fe.distribute;exports.divide=Ee.divide;exports.max=Ie.max;exports.median=ge.median;exports.min=Oe.min;exports.multiply=ye.multiply;exports.range=Me.range;exports.rate=be.rate;exports.round=ve.round;exports.subtract=he.subtract;exports.sum=Ge.sum;exports.currency=Ne.currency;exports.exchange=ke.exchange;exports.cache=Pe.cache;exports.clone=xe.clone;exports.diff=Ce.diff;exports.entries=Te.entries;exports.keys=Ae.keys;exports.merge=De.merge;exports.parseJSON=Be.parseJSON;exports.path=Le.path;exports.seek=we.seek;exports.values=Fe.values;exports.draw=Ue.draw;exports.random=Je.random;exports.shuffle=We.shuffle;exports.uuid=je.uuid;exports.camelCase=Ye.camelCase;exports.kebabCase=Ze.kebabCase;exports.pascalCase=He.pascalCase;exports.similarity=Qe.similarity;exports.snakeCase=Ve.snakeCase;exports.truncate=ze.truncate;exports.ge=Ke.ge;exports.gt=Xe.gt;exports.is=$e.is;exports.IS_ARRAY_ERROR_MSG=e.IS_ARRAY_ERROR_MSG;exports.isArray=e.isArray;exports.isBoolean=er.isBoolean;exports.IS_DATE_ERROR_MSG=r.IS_DATE_ERROR_MSG;exports.isDate=r.isDate;exports.isDefined=rr.isDefined;exports.IS_EMPTY_ERROR_MSG=i.IS_EMPTY_ERROR_MSG;exports.isEmpty=i.isEmpty;exports.IS_EQUAL_ERROR_MSG=s.IS_EQUAL_ERROR_MSG;exports.isEqual=s.isEqual;exports.isEven=ir.isEven;exports.IS_FUNCTION_ERROR_MSG=t.IS_FUNCTION_ERROR_MSG;exports.isFunction=t.isFunction;exports.isNegative=sr.isNegative;exports.IS_NIL_ERROR_MSG=n.IS_NIL_ERROR_MSG;exports.isNil=n.isNil;exports.IS_NUMBER_ERROR_MSG=o.IS_NUMBER_ERROR_MSG;exports.isNumber=o.isNumber;exports.IS_OBJECT_ERROR_MSG=c.IS_OBJECT_ERROR_MSG;exports.isObject=c.isObject;exports.isOdd=tr.isOdd;exports.isPositive=nr.isPositive;exports.IS_PRIMITIVE_ERROR_MSG=u.IS_PRIMITIVE_ERROR_MSG;exports.isPrimitive=u.isPrimitive;exports.IS_PROMISE_ERROR_MSG=a.IS_PROMISE_ERROR_MSG;exports.isPromise=a.isPromise;exports.isRegex=or.isRegex;exports.IS_STRING_ERROR_MSG=q.IS_STRING_ERROR_MSG;exports.isString=q.isString;exports.IS_WITHIN_ERROR_MSG=l.IS_WITHIN_ERROR_MSG;exports.isWithin=l.isWithin;exports.isZero=cr.isZero;exports.le=ur.le;exports.lt=ar.lt;exports.typeOf=qr.typeOf;
2
2
  //# sourceMappingURL=index.cjs.map