@lzptec/concurrency
Version:
A Lightweight concurrency manager
1 lines • 15.6 kB
Source Map (JSON)
{"version":3,"sources":["../src/base/shared.ts","../src/base/shared-base.ts"],"names":["interrupt","loop","forEach","task","item","map","results","mapSettled","err","filter","predicate","some","find","every","group","result","isAsyncIterator","input","isIterator","validateAndProcessInput","isAsync","isSync","validateTask","fieldType","validatePredicate","SharedBase","fn"],"mappings":"aAEO,IAAMA,CAAY,CAAA,MAAA,CAAO,WAAW,CAAA,CAC9BC,EAAO,MAAO,CAAA,MAAM,EAS1B,SAASC,CAAWC,CAAAA,CAAAA,CAA8C,CACrE,OAAO,CACH,IAAM,CAAA,eAAgBC,CAAS,CAAA,CAAE,MAAMD,CAAAA,CAAKC,CAAI,EAAE,EAClD,OAAS,CAAA,EACb,CACJ,CAEO,SAASC,CAAUF,CAAAA,CAAAA,CAAwC,CAC9D,IAAMG,CAAAA,CAAe,IAAI,KAAA,CACzB,OAAO,CACH,IAAM,CAAA,eAAgBF,EAAS,CAC3BE,CAAAA,CAAQ,IAAK,CAAA,MAAMH,CAAKC,CAAAA,CAAI,CAAC,EACjC,EACA,OAAAE,CAAAA,CACJ,CACJ,CAEO,SAASC,CAAAA,CAAiBJ,CAA8D,CAAA,CAC3F,IAAMG,CAAqC,CAAA,IAAI,KAC/C,CAAA,OAAO,CACH,IAAM,CAAA,eAAgBF,CAAS,CAAA,CAC3B,GAAI,CACAE,CAAAA,CAAQ,IAAK,CAAA,CACT,MAAQ,CAAA,WAAA,CACR,KAAO,CAAA,MAAMH,EAAKC,CAAI,CAC1B,CAAC,EACL,CAASI,MAAAA,CAAAA,CAAK,CACVF,CAAAA,CAAQ,KAAK,CACT,MAAA,CAAQ,UACR,CAAA,MAAA,CAAQE,CACZ,CAAC,EACL,CACJ,EACA,OAAAF,CAAAA,CACJ,CACJ,CAEO,SAASG,CAAUC,CAAAA,CAAAA,CAAmD,CACzE,IAAMJ,EAAe,IAAI,KAAA,CACzB,OAAO,CACH,IAAM,CAAA,eAAgBF,CAAS,CAAA,CACvB,MAAMM,CAAUN,CAAAA,CAAI,CACpBE,EAAAA,CAAAA,CAAQ,IAAKF,CAAAA,CAAI,EACzB,CAAA,CACA,QAAAE,CACJ,CACJ,CAEO,SAASK,CAAQD,CAAAA,CAAAA,CAAyD,CAC7E,IAAMJ,EAAqB,CAAC,KAAK,CACjC,CAAA,OAAO,CACH,IAAM,CAAA,eAAgBF,CAAS,CAAA,CAC3B,GAAI,MAAMM,CAAAA,CAAUN,CAAI,CAAA,CACpB,OAAAE,CAAAA,CAAQ,CAAC,CAAA,CAAI,KACNN,CAEf,CAAA,CACA,OAAAM,CAAAA,CACJ,CACJ,CAEO,SAASM,CAAAA,CAAQF,EAAmD,CACvE,IAAMJ,CAAe,CAAA,EACrB,CAAA,OAAO,CACH,IAAA,CAAM,eAAgBF,CAAS,CAAA,CAC3B,GAAI,MAAMM,CAAUN,CAAAA,CAAI,CACpB,CAAA,OAAAE,EAAQ,CAAC,CAAA,CAAIF,CACNJ,CAAAA,CAEf,CACA,CAAA,OAAA,CAAAM,CACJ,CACJ,CAEO,SAASO,CAAAA,CAASH,CAAyD,CAAA,CAC9E,IAAMJ,CAAAA,CAAqB,CAAC,IAAI,EAChC,OAAO,CACH,IAAM,CAAA,eAAgBF,CAAS,CAAA,CAC3B,GAAI,CAAE,MAAMM,CAAUN,CAAAA,CAAI,CACtB,CAAA,OAAAE,EAAQ,CAAC,CAAA,CAAI,KACNN,CAAAA,CAEf,EACA,OAAAM,CAAAA,CACJ,CACJ,CAEO,SAASQ,CAAAA,CAASX,CAAgE,CAAA,CACrF,IAAMY,CAAS,CAAA,IAAI,GACnB,CAAA,OAAO,CACH,IAAA,CAAM,eAAgBX,CAAAA,CAAS,CAC3B,IAAMU,CAAAA,CAAQ,MAAMX,CAAAA,CAAKC,CAAI,CAAA,CAEzBW,CAAO,CAAA,GAAA,CAAID,CAAK,CAChBC,CAAAA,CAAAA,CAAO,GAAID,CAAAA,CAAK,EAAG,IAAKV,CAAAA,CAAI,CAE5BW,CAAAA,CAAAA,CAAO,IAAID,CAAO,CAAA,CAACV,CAAI,CAAC,EAChC,CAAA,CACA,OAAS,CAAA,CAACW,CAAM,CACpB,CACJ,CAEO,SAASC,CAAmBC,CAAAA,CAAAA,CAAoD,CACnF,OAAO,OAAOA,CAAM,CAAA,MAAA,CAAO,aAAa,CAAA,EAAM,UAClD,CAEO,SAASC,CAAAA,CAAcD,EAA+C,CACzE,OAAO,OAAOA,CAAAA,CAAM,OAAO,QAAQ,CAAA,EAAM,UAC7C,CAUO,SAASE,CAA2BF,CAAAA,CAAAA,CAAiB,CACxD,IAAMG,CAAUJ,CAAAA,CAAAA,CAAmBC,CAAK,CAAA,CAClCI,EAASH,CAAcD,CAAAA,CAAK,CAElC,CAAA,GAAI,CAACG,CAAAA,EAAW,CAACC,CAAAA,CACb,MAAM,IAAI,SAAA,CAAU,kBAAqB,CAAA,OAAOJ,CAAQ,CAAA,2CAA2C,CAEvG,CAAA,OAAIG,EACOH,CAAM,CAAA,MAAA,CAAO,aAAa,CAAA,EAG9BA,CAAAA,CAAAA,CAAM,MAAO,CAAA,QAAQ,GAChC,CAEO,SAASK,CAAAA,CAAmBnB,CAAkB,CAAA,CACjD,IAAMoB,CAAAA,CAAY,OAAOpB,CACzB,CAAA,GAAIoB,CAAc,GAAA,UAAA,CACd,MAAM,IAAI,SAAU,CAAA,iBAAA,CAAoBA,EAAY,uBAAuB,CACnF,CAEO,SAASC,CAAqBd,CAAAA,CAAAA,CAA6B,CAC9D,IAAMa,EAAY,OAAOb,CAAAA,CACzB,GAAIa,CAAAA,GAAc,WACd,MAAM,IAAI,SAAU,CAAA,sBAAA,CAAyBA,EAAY,uBAAuB,CACxF,CCvJO,IAAeE,CAAf,CAAA,KAAmC,CAiCtC,MAAM,QAAWR,CAAiBd,CAAAA,CAAAA,CAAmC,CACjE,OAAAmB,CAAanB,CAAAA,CAAI,CACV,CAAA,IAAA,CAAKF,CAAI,CAAEgB,CAAAA,CAAAA,CAAOd,CAAI,CACjC,CAWA,MAAM,GAAUc,CAAAA,CAAAA,CAAiBd,EAAgC,CAC7DmB,CAAAA,CAAanB,CAAI,CAAA,CAEjB,GAAM,CAAE,IAAA,CAAMuB,CAAI,CAAA,OAAA,CAAApB,CAAQ,CAAID,CAAAA,CAAAA,CAAIF,CAAI,CAAA,CACtC,OAAM,MAAA,IAAA,CAAKF,CAAI,CAAA,CAAEgB,EAAOS,CAAE,CAAA,CACnBpB,CACX,CAYA,MAAM,UAAA,CAAiBW,CAAiBd,CAAAA,CAAAA,CAAsD,CAC1FmB,CAAanB,CAAAA,CAAI,CAEjB,CAAA,GAAM,CAAE,IAAA,CAAMuB,CAAI,CAAA,OAAA,CAAApB,CAAQ,CAAIC,CAAAA,CAAAA,CAAWJ,CAAI,CAAA,CAC7C,aAAM,IAAKF,CAAAA,CAAI,CAAEgB,CAAAA,CAAAA,CAAOS,CAAE,CACnBpB,CAAAA,CACX,CAUA,MAAM,MAAUW,CAAAA,CAAAA,CAAiBP,CAA2C,CAAA,CACxEc,EAAkBd,CAAS,CAAA,CAE3B,GAAM,CAAE,IAAMgB,CAAAA,CAAAA,CAAI,OAAApB,CAAAA,CAAQ,EAAIG,CAAOC,CAAAA,CAAS,CAC9C,CAAA,OAAA,MAAM,IAAKT,CAAAA,CAAI,CAAEgB,CAAAA,CAAAA,CAAOS,CAAE,CACnBpB,CAAAA,CACX,CAUA,MAAM,KAAQW,CAAiBP,CAAAA,CAAAA,CAA+C,CAC1Ec,CAAAA,CAAkBd,CAAS,CAE3B,CAAA,GAAM,CAAE,IAAA,CAAMgB,CAAI,CAAA,OAAA,CAAApB,CAAQ,CAAA,CAAIK,EAAKD,CAAS,CAAA,CAC5C,OAAM,MAAA,IAAA,CAAKT,CAAI,CAAA,CAAEgB,CAAOS,CAAAA,CAAE,EACnBpB,CAAQ,CAAA,CAAC,CACpB,CAUA,MAAM,IAAA,CAAQW,CAAiBP,CAAAA,CAAAA,CAAqD,CAChFc,CAAkBd,CAAAA,CAAS,CAE3B,CAAA,GAAM,CAAE,IAAMgB,CAAAA,CAAAA,CAAI,OAAApB,CAAAA,CAAQ,EAAIM,CAAKF,CAAAA,CAAS,CAC5C,CAAA,OAAA,MAAM,IAAKT,CAAAA,CAAI,CAAEgB,CAAAA,CAAAA,CAAOS,CAAE,CACnBpB,CAAAA,CAAAA,CAAQ,CAAC,CACpB,CAUA,MAAM,KAASW,CAAAA,CAAAA,CAAiBP,EAA+C,CAC3Ec,CAAAA,CAAkBd,CAAS,CAAA,CAE3B,GAAM,CAAE,IAAMgB,CAAAA,CAAAA,CAAI,QAAApB,CAAQ,CAAA,CAAIO,CAAMH,CAAAA,CAAS,EAC7C,OAAM,MAAA,IAAA,CAAKT,CAAI,CAAA,CAAEgB,EAAOS,CAAE,CAAA,CACnBpB,CAAQ,CAAA,CAAC,CACpB,CAYA,MAAM,KAAA,CAASW,EAAiBd,CAAmD,CAAA,CAC/EmB,CAAanB,CAAAA,CAAI,CAEjB,CAAA,GAAM,CAAE,IAAA,CAAMuB,EAAI,OAAApB,CAAAA,CAAQ,CAAIQ,CAAAA,CAAAA,CAAMX,CAAI,CAAA,CACxC,OAAM,MAAA,IAAA,CAAKF,CAAI,CAAEgB,CAAAA,CAAAA,CAAOS,CAAE,CAAA,CACnB,OAAO,WAAYpB,CAAAA,CAAAA,CAAQ,CAAC,CAAC,CACxC,CAEJ","file":"chunk-CA3T2TT7.cjs","sourcesContent":["import type { Input, Task } from \"./types.js\";\n\nexport const interrupt = Symbol(`Interrupt`);\nexport const loop = Symbol(`loop`);\n\ntype SharedFnReturn<A, B> = {\n task: (item: A) => Promise<void | symbol>;\n results: B[];\n};\n\ntype GroupKey = string | symbol;\n\nexport function forEach<A>(task: Task<A, void>): SharedFnReturn<A, void> {\n return {\n task: async function (item: A) { await task(item) },\n results: []\n }\n}\n\nexport function map<A, B>(task: Task<A, B>): SharedFnReturn<A, B> {\n const results: B[] = new Array();\n return {\n task: async function (item: A) {\n results.push(await task(item))\n },\n results\n }\n}\n\nexport function mapSettled<A, B>(task: Task<A, B>): SharedFnReturn<A, PromiseSettledResult<B>> {\n const results: PromiseSettledResult<B>[] = new Array();\n return {\n task: async function (item: A) {\n try {\n results.push({\n status: 'fulfilled',\n value: await task(item)\n });\n } catch (err) {\n results.push({\n status: 'rejected',\n reason: err\n });\n }\n },\n results\n }\n}\n\nexport function filter<A>(predicate: Task<A, boolean>): SharedFnReturn<A, A> {\n const results: A[] = new Array();\n return {\n task: async function (item: A) {\n if (await predicate(item))\n results.push(item);\n },\n results\n }\n}\n\nexport function some<A>(predicate: Task<A, boolean>): SharedFnReturn<A, boolean> {\n const results: boolean[] = [false];\n return {\n task: async function (item: A) {\n if (await predicate(item)) {\n results[0] = true;\n return interrupt;\n }\n },\n results\n }\n}\n\nexport function find<A>(predicate: Task<A, boolean>): SharedFnReturn<A, A> {\n const results: A[] = [];\n return {\n task: async function (item: A) {\n if (await predicate(item)) {\n results[0] = item;\n return interrupt;\n }\n },\n results\n }\n}\n\nexport function every<A>(predicate: Task<A, boolean>): SharedFnReturn<A, boolean> {\n const results: boolean[] = [true];\n return {\n task: async function (item: A) {\n if (!(await predicate(item))) {\n results[0] = false;\n return interrupt;\n }\n },\n results\n };\n}\n\nexport function group<A>(task: Task<A, GroupKey>): SharedFnReturn<A, Map<GroupKey, A[]>> {\n const result = new Map<GroupKey, A[]>();\n return {\n task: async function (item: A) {\n const group = await task(item);\n\n if (result.has(group))\n result.get(group)!.push(item);\n else\n result.set(group, [item]);\n },\n results: [result]\n };\n}\n\nexport function isAsyncIterator<A>(input: any): input is AsyncIterable<A | Promise<A>> {\n return typeof input[Symbol.asyncIterator] === 'function';\n}\n\nexport function isIterator<A>(input: any): input is Iterable<A | Promise<A>> {\n return typeof input[Symbol.iterator] === 'function';\n}\n\nexport function validateInput<A>(input: Input<A>) {\n const isAsync = isAsyncIterator<A>(input);\n const isSync = isIterator<A>(input);\n\n if (!isAsync && !isSync)\n throw new TypeError(\"Expected `input(\" + typeof input + \")` to be an `Iterable` or `AsyncIterable`\");\n}\n\nexport function validateAndProcessInput<A>(input: Input<A>) {\n const isAsync = isAsyncIterator<A>(input);\n const isSync = isIterator<A>(input);\n\n if (!isAsync && !isSync)\n throw new TypeError(\"Expected `input(\" + typeof input + \")` to be an `Iterable` or `AsyncIterable`\");\n\n if (isAsync) {\n return input[Symbol.asyncIterator]();\n }\n\n return input[Symbol.iterator]();\n}\n\nexport function validateTask<A, B>(task: Task<A, B>) {\n const fieldType = typeof task;\n if (fieldType !== 'function')\n throw new TypeError(\"Expected `task(\" + fieldType + \")` to be a `function`\");\n}\n\nexport function validatePredicate<A>(predicate: Task<A, boolean>) {\n const fieldType = typeof predicate;\n if (fieldType !== 'function')\n throw new TypeError(\"Expected `predicate(\" + fieldType + \")` to be a `function`\");\n}\n\n","import { every, filter, find, group, loop, map, mapSettled, some, validatePredicate, validateTask } from './shared.js';\nimport type { Group, Input, RunnableTask, Task } from './types.js';\n\nexport abstract class SharedBase<Options> {\n\n abstract [loop] <A>(input: Input<A>, task: Task<A, any>): Promise<void>;\n\n /**\n * Performs a specified task.\n *\n * @template A\n * @template B\n * @param {RunnableTask<A, B>} task Arguments to pass to the task for each call.\n * @param {A[]} [args] The task to run for each item.\n * @returns {Promise<B>}\n */\n abstract run<A, B>(task: RunnableTask<A, B>, ...args: A[]): Promise<B>;\n\n /**\n * Instance Options.\n */\n abstract set options(options: Options);\n\n /**\n * Instance Options.\n */\n abstract get options(): Options;\n\n /**\n * Performs the specified `task` for each element in the input.\n * \n * @template A\n * @param {Input<A>} input Arguments to pass to the task for each call.\n * @param {Task<A, any>} task The task to run for each item.\n * @returns {Promise<void>}\n */\n async forEach<A>(input: Input<A>, task: Task<A, any>): Promise<void> {\n validateTask(task);\n return this[loop](input, task);\n }\n\n /**\n * Performs the specified `task` function on each element in the `input`, and returns an array that contains the results.\n *\n * @template A\n * @template B\n * @param {Input<A>} input Arguments to pass to the task for each call.\n * @param {Task<A, B>} task The task to run for each item.\n * @returns {Promise<B[]>}\n */\n async map<A, B>(input: Input<A>, task: Task<A, B>): Promise<B[]> {\n validateTask(task);\n\n const { task: fn, results } = map(task);\n await this[loop](input, fn);\n return results;\n }\n\n /**\n * Performs the specified `task` function on each element in the `input`, \n * and creates a Promise that is resolved with an array of results when all of the tasks are resolve or reject.\n *\n * @template A\n * @template B\n * @param {Input<A>} input Arguments to pass to the task for each call.\n * @param {Task<A, B>} task The task to run for each item.\n * @returns {Promise<PromiseSettledResult<B>[]>}\n */\n async mapSettled<A, B>(input: Input<A>, task: Task<A, B>): Promise<PromiseSettledResult<B>[]> {\n validateTask(task);\n\n const { task: fn, results } = mapSettled(task);\n await this[loop](input, fn);\n return results;\n }\n\n /**\n * Returns the elements that meet the condition specified in the predicate function.\n *\n * @template A\n * @param {Input<A>} input Arguments to pass to the task for each call.\n * @param {Task<A, boolean>} predicate The task to run for each item.\n * @returns {Promise<void>}\n */\n async filter<A>(input: Input<A>, predicate: Task<A, boolean>): Promise<A[]> {\n validatePredicate(predicate);\n\n const { task: fn, results } = filter(predicate);\n await this[loop](input, fn);\n return results;\n }\n\n /**\n * Determines whether the specified `predicate` function returns true for any element of `input`.\n * \n * @template A Input Type.\n * @param {Input<A>} input Arguments to pass to the task for each call.\n * @param {Task<A, boolean>} predicate The task to run for each item.\n * @returns {Promise<boolean>}\n */\n async some<A>(input: Input<A>, predicate: Task<A, boolean>): Promise<boolean> {\n validatePredicate(predicate);\n\n const { task: fn, results } = some(predicate);\n await this[loop](input, fn);\n return results[0];\n }\n\n /**\n * Returns the `input` value of the first `predicate` that resolves to true, and undefined otherwise.\n * \n * @template A Input Type.\n * @param {Input<A>} input Arguments to pass to the task for each call.\n * @param {Task<A, boolean>} predicate The task to run for each item.\n * @returns {Promise<A | undefined>}\n */\n async find<A>(input: Input<A>, predicate: Task<A, boolean>): Promise<A | undefined> {\n validatePredicate(predicate);\n\n const { task: fn, results } = find(predicate);\n await this[loop](input, fn);\n return results[0];\n }\n\n /**\n * Determines whether all the elements of `input` satisfy the specified `predicate`.\n * \n * @template A Input Type.\n * @param {Input<A>} input Arguments to pass to the task for each call.\n * @param {Task<A, boolean>} predicate The task to run for each item.\n * @returns {Promise<boolean>}\n */\n async every<A>(input: Input<A>, predicate: Task<A, boolean>): Promise<boolean> {\n validatePredicate(predicate);\n\n const { task: fn, results } = every(predicate);\n await this[loop](input, fn);\n return results[0];\n }\n\n /**\n * This method groups the elements of the `input` according to the string values returned by a provided `task`. \n * \n * The returned object has separate properties for each group, containing arrays with the elements in the group. \n * \n * @template A Input Type.\n * @param {Input<A>} input Arguments to pass to the task for each call.\n * @param {Task<A, string | symbol>} task A function to execute for each element in the `input`. It should return a value that can get coerced into a property key (string or symbol) indicating the group of the current element.\n * @returns {Promise<Group<A>>}\n */\n async group<A>(input: Input<A>, task: Task<A, string | symbol>): Promise<Group<A>> {\n validateTask(task);\n\n const { task: fn, results } = group(task);\n await this[loop](input, fn);\n return Object.fromEntries(results[0]);\n }\n\n}\n"]}