UNPKG

@lzptec/concurrency

Version:

A Lightweight concurrency manager

1 lines 12 kB
{"version":3,"sources":["../src/chain.ts"],"names":["_input","_operations","_single","_Chain_static","build_fn","_Chain","input","__privateAdd","__privateSet","task","_a","validateTask","__privateMethod","executor","fn","results","map","loop","mapSettled","predicate","validatePredicate","filter","some","find","every","group","runner","res","__privateGet","operation","chain","newOperation","single","newChain","Chain"],"mappings":"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","file":"index.cjs","sourcesContent":["import { Batch } from \"./batch.js\";\nimport { every, filter, find, group, loop, map, mapSettled, some, validatePredicate, validateTask } from \"./base/shared.js\";\nimport { SharedBase } from \"./base/shared-base.js\";\nimport { Group, Input, Task } from \"./base/types.js\";\n\ntype Operation<A, B extends Input<A>, C> = (input: B, executor: SharedBase<any>) => Promise<Input<C>>;\nexport type InputType<TValue> = TValue extends Input<infer TResult> ? TResult : never;\n\ntype Overwrite<T, U> = Omit<T, keyof U> & U;\n\nexport type SingleValueChain<TInput extends Input<any>, TValue = InputType<TInput>> = Overwrite<\n Chain<TInput, TValue>,\n { runWith(runner: SharedBase<any>): Promise<TValue> }\n>\n\nexport class Chain<TInput extends Input<any>, TValue = InputType<TInput>> {\n #input: TInput;\n #operations: Operation<any, any, unknown>[] = [];\n #single = false;\n\n constructor(input: TInput) {\n // @ts-ignore\n this.#input = input;\n }\n\n static #build<TData, TInput extends Input<TData>, TValue = InputType<TInput>>(\n chain: Chain<any, any>,\n newOperation: Operation<TData, TInput, TValue>\n ): Chain<TValue[], TValue>;\n\n static #build<TData, TInput extends Input<TData>, TValue = InputType<TInput>>(\n chain: Chain<any, any>,\n newOperation: Operation<TData, TInput, TValue>,\n single: true\n ): SingleValueChain<TValue[], TValue>;\n\n static #build<TData, TInput extends Input<TData>, TValue = InputType<TInput>>(\n chain: Chain<any, any>,\n newOperation: Operation<TData, TInput, TValue>,\n single: boolean = false\n ): Chain<TValue[], TValue> | SingleValueChain<TValue[], TValue> {\n const newChain = new Chain<TValue[], TValue>(chain.#input as any);\n newChain.#operations = [...chain.#operations, newOperation];\n newChain.#single = single;\n\n return newChain;\n };\n\n /**\n * Performs the specified `task` function on each element in the `input`, and returns an `Chain` that contains the results.\n * \n * @template TValue Input Type.\n * @template TNew Output Type.\n * @param {Task<TValue, TNew>} task task to run.\n * @returns {Chain<TNew[], TNew>}\n */\n map<TNew>(task: Task<TValue, TNew>): Chain<TNew[], TNew> {\n validateTask(task);\n\n return Chain.#build(this, async (input: Input<TValue>, executor: SharedBase<any>) => {\n const { task: fn, results } = map(task);\n\n await executor[loop](input, fn);\n return results;\n });\n }\n\n /**\n * Performs the specified `task` function on each element in the `input`, \n * and returns an `Chain` that contains all of the tasks results as resolve or reject.\n * \n * @template TValue Input Type.\n * @template TNew Output Type.\n * @param {Task<TValue, TNew>} task task to run.\n * @returns {Chain<PromiseSettledResult<TNew>[], PromiseSettledResult<TNew>>}\n */\n mapSettled<TNew>(task: Task<TValue, TNew>): Chain<PromiseSettledResult<TNew>[], PromiseSettledResult<TNew>> {\n validateTask(task);\n\n return Chain.#build(this, async (input: Input<TValue>, executor: SharedBase<any>) => {\n const { task: fn, results } = mapSettled(task);\n\n await executor[loop](input, fn);\n return results;\n });\n }\n\n /**\n * Returns an `Chain` that contains the elements that meet the condition specified in the `predicate` function.\n *\n * @template TValue Input Type.\n * @param {Task<TValue, boolean>} predicate predicate to run.\n * @returns {Chain<TValue[], TValue>}\n */\n filter(predicate: Task<TValue, boolean>): Chain<TValue[], TValue> {\n validatePredicate(predicate);\n\n return Chain.#build(this, async (input: Input<TValue>, executor: SharedBase<any>) => {\n const { task: fn, results } = filter(predicate);\n\n await executor[loop](input, fn);\n return results;\n });\n }\n\n /**\n * Returns an `Chain` that contains whether the specified `predicate` function returns true for any element of `input`.\n *\n * @template TValue Input Type.\n * @param {Task<TValue, boolean>} predicate predicate to run.\n * @returns {SingleValueChain<boolean[], boolean>}\n */\n some(predicate: Task<TValue, boolean>): SingleValueChain<boolean[], boolean> {\n validatePredicate(predicate);\n\n return Chain.#build(this, async (input: Input<TValue>, executor: SharedBase<any>) => {\n const { task: fn, results } = some(predicate);\n\n await executor[loop](input, fn);\n return results;\n }, true);\n }\n\n /**\n * Returns the `input` value of the first `predicate` that resolves to true, and undefined otherwise.\n *\n * @template TValue Input Type.\n * @param {Task<TValue, boolean>} predicate predicate to run.\n * @returns {SingleValueChain<boolean[], TValue | undefined>}\n */\n find(predicate: Task<TValue, boolean>): SingleValueChain<TValue[], TValue | undefined> {\n validatePredicate(predicate);\n\n return Chain.#build(this, async (input: Input<TValue>, executor: SharedBase<any>) => {\n const { task: fn, results } = find(predicate);\n\n await executor[loop](input, fn);\n return results;\n }, true);\n }\n\n /**\n * Determines whether all the elements of `input` satisfy the specified `predicate`.\n *\n * @template TValue Input Type.\n * @param {Task<TValue, boolean>} predicate predicate to run.\n * @returns {SingleValueChain<boolean[], TValue | undefined>}\n */\n every(predicate: Task<TValue, boolean>): SingleValueChain<boolean[], boolean> {\n validatePredicate(predicate);\n\n return Chain.#build(this, async (input: Input<TValue>, executor: SharedBase<any>) => {\n const { task: fn, results } = every(predicate);\n\n await executor[loop](input, fn);\n return results;\n }, true);\n }\n\n /**\n * This method groups the elements of the `input` according to the string or symbol 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 TValue Input Type.\n * @template TNew Output Type.\n * @param {Task<TValue, string | symbol>} task task to run.\n * @returns {Chain<Group<TValue>[], Group<TValue>>}\n */\n group(task: Task<TValue, string | symbol>): Chain<Group<TValue>[], Group<TValue>> {\n validateTask(task);\n return Chain.#build(this, async (input: Input<TValue>, executor: SharedBase<any>) => {\n const { task: fn, results } = group(task);\n\n await executor[loop](input, fn);\n return [Object.fromEntries(results[0])];\n });\n }\n\n async runWith<TResult = TValue[]>(runner: SharedBase<any>): Promise<TResult> {\n const res = await (async () => {\n let input: any = this.#input;\n for (const operation of this.#operations) {\n input = await operation(input, runner);\n }\n\n return this.#single ? input[0] : input;\n })();\n\n return Promise.resolve(res);\n }\n\n}\n\n(async () => {\n const data = [1, 2, 3, 40, 50];\n\n const result = await new Chain(data)\n .filter(x => x < 10)\n .map(x => x.toString())\n .find(x => x === '3')\n .runWith(new Batch({ batchSize: 2 }));\n\n console.log(result);\n});\n\nObject.freeze(Chain);\n"]}