{"id":19873978,"url":"https://github.com/metarhia/metasync","last_synced_at":"2025-04-05T08:05:05.152Z","repository":{"id":9876205,"uuid":"63628157","full_name":"metarhia/metasync","owner":"metarhia","description":"Asynchronous Programming Library for JavaScript \u0026 Node.js","archived":false,"fork":false,"pushed_at":"2024-03-20T06:32:17.000Z","size":1251,"stargazers_count":206,"open_issues_count":45,"forks_count":35,"subscribers_count":22,"default_branch":"master","last_synced_at":"2025-03-29T07:05:09.416Z","etag":null,"topics":["array","async","asynchronous","callback","chain","collector","composition","impress","javascript","js","metarhia","node","nodejs","parallel","promise","series","sync","synchronous","thenable"],"latest_commit_sha":null,"homepage":"https://metarhia.com","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/metarhia.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS","dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-07-18T18:44:42.000Z","updated_at":"2025-01-22T07:20:47.000Z","dependencies_parsed_at":"2024-06-18T20:12:17.866Z","dependency_job_id":null,"html_url":"https://github.com/metarhia/metasync","commit_stats":{"total_commits":354,"total_committers":20,"mean_commits":17.7,"dds":0.2966101694915254,"last_synced_commit":"a49d78598f2d228e59177a612352154f6f916679"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/metarhia%2Fmetasync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/metarhia%2Fmetasync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/metarhia%2Fmetasync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/metarhia%2Fmetasync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/metarhia","download_url":"https://codeload.github.com/metarhia/metasync/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247305933,"owners_count":20917208,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["array","async","asynchronous","callback","chain","collector","composition","impress","javascript","js","metarhia","node","nodejs","parallel","promise","series","sync","synchronous","thenable"],"created_at":"2024-11-12T16:20:46.544Z","updated_at":"2025-04-05T08:05:05.131Z","avatar_url":"https://github.com/metarhia.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Asynchronous Programming Library\n\n[![ci status](https://github.com/metarhia/metasync/workflows/Testing%20CI/badge.svg)](https://github.com/metarhia/metasync/actions?query=workflow%3A%22Testing+CI%22+branch%3Amaster)\n[![snyk](https://snyk.io/test/github/metarhia/metasync/badge.svg)](https://snyk.io/test/github/metarhia/metasync)\n[![npm version](https://badge.fury.io/js/metasync.svg)](https://badge.fury.io/js/metasync)\n[![npm downloads/month](https://img.shields.io/npm/dm/metasync.svg)](https://www.npmjs.com/package/metasync)\n[![npm downloads](https://img.shields.io/npm/dt/metasync.svg)](https://www.npmjs.com/package/metasync)\n[![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/metarhia/metasync/blob/master/LICENSE)\n\n## Installation\n\n```bash\n$ npm install metasync\n```\n\n## Asynchronous functions composition\n\n`metasync(fns)(data, done)`\n\n- `fns` - array of callback-last functions, callback contranct err-first\n- `data` - input data (optional)\n- `done` - err-first callback\n- Returns: composed callback-last / err-first function\n\n![composition](https://cloud.githubusercontent.com/assets/4405297/16968374/1b81f160-4e17-11e6-96fa-9d7e2b422396.png)\n\n```js\nconst composed = metasync([f1, f2, f3, [[f4, f5, [f6, f7], f8]], f9]);\n```\n\n- Array of functions gives sequential execution: `[f1, f2, f3]`\n- Double brackets array of functions gives parallel execution: `[[f1, f2, f3]]`\n\n_Example:_\n\n```js\nconst metasync = require('metasync');\nconst fs = require('fs');\n\n// Data collector (collect keys by count)\nconst dc = metasync.collect(4);\n\ndc.pick('user', { name: 'Marcus Aurelius' });\nfs.readFile('HISTORY.md', (err, data) =\u003e dc.collect('history', err, data));\ndc.take('readme', fs.readFile, 'README.md');\nsetTimeout(() =\u003e dc.pick('timer', { date: new Date() }), 1000);\n\n// Key collector (collect certain keys by names)\nconst kc = metasync\n  .collect(['user', 'history', 'readme', 'timer'])\n  .timeout(2000)\n  .distinct()\n  .done((err, data) =\u003e console.log(data));\n\nkc.pick('user', { name: 'Marcus Aurelius' });\nkc.take('history', fs.readFile, 'HISTORY.md');\nkc.take('readme', fs.readFile, 'README.md');\nsetTimeout(() =\u003e kc.pick('timer', { date: new Date() }), 1000);\n```\n\n## API\n\n### callbackify(fn)\n\n- `fn`: [`\u003cFunction\u003e`][function] promise-returning function\n\n_Returns:_ [`\u003cFunction\u003e`][function]\n\nConvert Promise-returning to callback-last / error-first contract\n\n### asyncify(fn)\n\n- `fn`: [`\u003cFunction\u003e`][function] regular synchronous function\n\n_Returns:_ [`\u003cFunction\u003e`][function] with contract: callback-last / error-first\n\nConvert sync function to callback-last / error-first contract\n\n### promiseToCallbackLast(promise, callback)\n\n- `promise`: [`\u003cPromise\u003e`][promise]\n- `callback`: [`\u003cFunction\u003e`][function]\n\nConvert Promise to callback-last\n\n### promisify(fn)\n\n- `fn`: [`\u003cFunction\u003e`][function] callback-last function\n\n_Returns:_ [`\u003cFunction\u003e`][function] Promise-returning function\n\nConvert async function to Promise-returning function\n\n### promisifySync(fn)\n\n- `fn`: [`\u003cFunction\u003e`][function] regular synchronous function\n\n_Returns:_ [`\u003cFunction\u003e`][function] Promise-returning function\n\nConvert sync function to Promise object\n\n### map(items, fn, done)\n\n- `items`: [`\u003cArray\u003e`][array] incoming\n- `fn`: [`\u003cFunction\u003e`][function] to be executed for each value in the array\n  - `current`: `\u003cany\u003e` current element being processed in the array\n  - `callback`: [`\u003cFunction\u003e`][function]\n    - `err`: [`\u003cError\u003e`][error]|[`\u003cnull\u003e`][null]\n    - `value`: `\u003cany\u003e`\n- `done`: [`\u003cFunction\u003e`][function] on done\n  - `err`: [`\u003cError\u003e`][error]|[`\u003cnull\u003e`][null]\n  - `result`: [`\u003cArray\u003e`][array]\n\nAsynchronous map (iterate parallel)\n\n### filter(items, fn, done)\n\n- `items`: [`\u003cArray\u003e`][array] incoming\n- `fn`: [`\u003cFunction\u003e`][function] to be executed for each value in the array\n  - `value`: `\u003cany\u003e` item from items array\n  - `callback`: [`\u003cFunction\u003e`][function]\n    - `err`: [`\u003cError\u003e`][error]|[`\u003cnull\u003e`][null]\n    - `accepted`: [`\u003cboolean\u003e`][boolean]\n- `done`: [`\u003cFunction\u003e`][function] on done\n  - `err`: [`\u003cError\u003e`][error]|[`\u003cnull\u003e`][null]\n  - `result`: [`\u003cArray\u003e`][array]\n\nAsynchrous filter (iterate parallel)\n\n_Example:_\n\n```js\nmetasync.filter(\n  ['data', 'to', 'filter'],\n  (item, callback) =\u003e callback(item.length \u003e 2),\n  (err, result) =\u003e console.dir(result),\n);\n```\n\n### reduce(items, fn, done\\[, initial\\])\n\n- `items`: [`\u003cArray\u003e`][array] incoming\n- `fn`: [`\u003cFunction\u003e`][function] to be executed for each value in array\n  - `previous`: `\u003cany\u003e` value previously returned in the last iteration\n  - `current`: `\u003cany\u003e` current element being processed in the array\n  - `callback`: [`\u003cFunction\u003e`][function] callback for returning value back to\n    reduce function\n    - `err`: [`\u003cError\u003e`][error]|[`\u003cnull\u003e`][null]\n    - `data`: `\u003cany\u003e` resulting value\n  - `counter`: [`\u003cnumber\u003e`][number] index of the current element being processed\n    in array\n  - `items`: [`\u003cArray\u003e`][array] the array reduce was called upon\n- `done`: [`\u003cFunction\u003e`][function] on done\n  - `err`: [`\u003cError\u003e`][error]|[`\u003cnull\u003e`][null]\n  - `result`: [`\u003cArray\u003e`][array]\n- `initial`: `\u003cany\u003e` optional value to be used as first argument in first\n  iteration\n\nAsynchronous reduce\n\n### reduceRight(items, fn, done\\[, initial\\])\n\n- `items`: [`\u003cArray\u003e`][array] incoming\n- `fn`: [`\u003cFunction\u003e`][function] to be executed for each value in array\n  - `previous`: `\u003cany\u003e` value previously returned in the last iteration\n  - `current`: `\u003cany\u003e` current element being processed in the array\n  - `callback`: [`\u003cFunction\u003e`][function] callback for returning value back to\n    reduce function\n    - `err`: [`\u003cError\u003e`][error]|[`\u003cnull\u003e`][null]\n    - `data`: `\u003cany\u003e` resulting value\n  - `counter`: [`\u003cnumber\u003e`][number] index of the current element being processed\n    in array\n  - `items`: [`\u003cArray\u003e`][array] the array reduce was called upon\n- `done`: [`\u003cFunction\u003e`][function] on done\n  - `err`: [`\u003cError\u003e`][error]|[`\u003cnull\u003e`][null]\n  - `result`: [`\u003cArray\u003e`][array]\n- `initial`: `\u003cany\u003e` optional value to be used as first argument in first\n  iteration\n\nAsynchronous reduceRight\n\n### each(items, fn, done)\n\n- `items`: [`\u003cArray\u003e`][array] incoming\n- `fn`: [`\u003cFunction\u003e`][function]\n  - `value`: `\u003cany\u003e` item from items array\n  - `callback`: [`\u003cFunction\u003e`][function]\n    - `err`: [`\u003cError\u003e`][error]|[`\u003cnull\u003e`][null]\n- `done`: [`\u003cFunction\u003e`][function] on done\n  - `err`: [`\u003cError\u003e`][error]|[`\u003cnull\u003e`][null]\n  - `items`: [`\u003cArray\u003e`][array]\n\nAsynchronous each (iterate in parallel)\n\n_Example:_\n\n```js\nmetasync.each(\n  ['a', 'b', 'c'],\n  (item, callback) =\u003e {\n    console.dir({ each: item });\n    callback();\n  },\n  (err, data) =\u003e console.dir('each done'),\n);\n```\n\n### series(items, fn, done)\n\n- `items`: [`\u003cArray\u003e`][array] incoming\n- `fn`: [`\u003cFunction\u003e`][function]\n  - `value`: `\u003cany\u003e` item from items array\n  - `callback`: [`\u003cFunction\u003e`][function]\n    - `err`: [`\u003cError\u003e`][error]|[`\u003cnull\u003e`][null]\n- `done`: [`\u003cFunction\u003e`][function] on done\n  - `err`: [`\u003cError\u003e`][error]|[`\u003cnull\u003e`][null]\n  - `items`: [`\u003cArray\u003e`][array]\n\nAsynchronous series\n\n_Example:_\n\n```js\nmetasync.series(\n  ['a', 'b', 'c'],\n  (item, callback) =\u003e {\n    console.dir({ series: item });\n    callback();\n  },\n  (err, data) =\u003e {\n    console.dir('series done');\n  },\n);\n```\n\n### find(items, fn, done)\n\n- `items`: [`\u003cArray\u003e`][array] incoming\n- `fn`: [`\u003cFunction\u003e`][function]\n  - `value`: `\u003cany\u003e` item from items array\n  - `callback`: [`\u003cFunction\u003e`][function]\n    - `err`: [`\u003cError\u003e`][error]|[`\u003cnull\u003e`][null]\n    - `accepted`: [`\u003cboolean\u003e`][boolean]\n- `done`: [`\u003cFunction\u003e`][function] on done\n  - `err`: [`\u003cError\u003e`][error]|[`\u003cnull\u003e`][null]\n  - `result`: `\u003cany\u003e`\n\nAsynchronous find (iterate in series)\n\n_Example:_\n\n```js\nmetasync.find(\n  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],\n  (item, callback) =\u003e callback(null, item % 3 === 0 \u0026\u0026 item % 5 === 0),\n  (err, result) =\u003e {\n    console.dir(result);\n  },\n);\n```\n\n### every(items, fn, done)\n\n- `items`: [`\u003cArray\u003e`][array] incoming\n- `fn`: [`\u003cFunction\u003e`][function]\n  - `value`: `\u003cany\u003e` item from items array\n  - `callback`: [`\u003cFunction\u003e`][function]\n    - `err`: [`\u003cError\u003e`][error]|[`\u003cnull\u003e`][null]\n    - `accepted`: [`\u003cboolean\u003e`][boolean]\n- `done`: [`\u003cFunction\u003e`][function] on done\n  - `err`: [`\u003cError\u003e`][error]|[`\u003cnull\u003e`][null]\n  - `result`: [`\u003cboolean\u003e`][boolean]\n\nAsynchronous every\n\n### some(items, fn, done)\n\n- `items`: [`\u003cArray\u003e`][array] incoming\n- `fn`: [`\u003cFunction\u003e`][function]\n  - `value`: `\u003cany\u003e` item from items array\n  - `callback`: [`\u003cFunction\u003e`][function]\n    - `err`: [`\u003cError\u003e`][error]|[`\u003cnull\u003e`][null]\n    - `accepted`: [`\u003cboolean\u003e`][boolean]\n- `done`: [`\u003cFunction\u003e`][function] on done\n  - `err`: [`\u003cError\u003e`][error]|[`\u003cnull\u003e`][null]\n  - `result`: [`\u003cboolean\u003e`][boolean]\n\nAsynchronous some (iterate in series)\n\n### asyncMap(items, fn\\[, options\\]\\[, done\\])\n\n- `items`: [`\u003cArray\u003e`][array] incoming dataset\n- `fn`: [`\u003cFunction\u003e`][function]\n  - `item`: `\u003cany\u003e`\n  - `index`: [`\u003cnumber\u003e`][number]\n- `options`: [`\u003cObject\u003e`][object] map params, optional\n  - `min`: [`\u003cnumber\u003e`][number] min number of items in one next call\n  - `percent`: [`\u003cnumber\u003e`][number] ratio of map time to all time\n- `done`: [`\u003cFunction\u003e`][function] call on done, optional\n  - `err`: [`\u003cError\u003e`][error]|[`\u003cnull\u003e`][null]\n  - `result`: [`\u003cArray\u003e`][array]\n\nNon-blocking synchronous map\n\n### asyncIter(base)\n\n- `base`: [`\u003cIterable\u003e`][iterable]|[`\u003cAsyncIterable\u003e`][asynciterable] an\n  iterable that is wrapped in [`\u003cAsyncIterator\u003e`][asynciterator]\n\n_Returns:_ [`\u003cAsyncIterator\u003e`][asynciterator]\n\nCreate an AsyncIterator instance\n\n### class AsyncIterator\n\n#### AsyncIterator.prototype.constructor(base)\n\n#### async AsyncIterator.prototype.next()\n\n#### async AsyncIterator.prototype.count()\n\n#### async AsyncIterator.prototype.each(fn, thisArg)\n\n#### async AsyncIterator.prototype.forEach(fn, thisArg)\n\n#### async AsyncIterator.prototype.parallel(fn, thisArg)\n\n#### async AsyncIterator.prototype.every(predicate, thisArg)\n\n#### async AsyncIterator.prototype.find(predicate, thisArg)\n\n#### async AsyncIterator.prototype.includes(element)\n\n#### async AsyncIterator.prototype.reduce(reducer, initialValue)\n\n#### async AsyncIterator.prototype.some(predicate, thisArg)\n\n#### async AsyncIterator.prototype.someCount(predicate, count, thisArg)\n\n#### async AsyncIterator.prototype.collectTo(CollectionClass)\n\n#### async AsyncIterator.prototype.collectWith(obj, collector)\n\n#### async AsyncIterator.prototype.join(sep = ', ', prefix = '', suffix = '')\n\n#### async AsyncIterator.prototype.toArray()\n\n#### AsyncIterator.prototype.map(mapper, thisArg)\n\n#### AsyncIterator.prototype.filter(predicate, thisArg)\n\n#### AsyncIterator.prototype.flat(depth = 1)\n\n#### AsyncIterator.prototype.flatMap(mapper, thisArg)\n\n#### AsyncIterator.prototype.zip(...iterators)\n\n#### AsyncIterator.prototype.chain(...iterators)\n\n#### AsyncIterator.prototype.take(amount)\n\n#### AsyncIterator.prototype.takeWhile(predicate, thisArg)\n\n#### AsyncIterator.prototype.skip(amount)\n\n#### AsyncIterator.prototype.throttle(percent, min)\n\n#### AsyncIterator.prototype.enumerate()\n\n### collect(expected)\n\n- `expected`: [`\u003cnumber\u003e`][number]|[`\u003cstring[]\u003e`][string]\n\n_Returns:_ [`\u003cCollector\u003e`][collector]\n\nCreate Collector instance\n\n### class Collector\n\nData collector\n\n#### Collector.prototype.constructor(expected)\n\n- `expected`: [`\u003cnumber\u003e`][number]|[`\u003cstring[]\u003e`][string] count or keys\n\nData collector\n\n#### Collector.prototype.collect(key, err, value)\n\n- `key`: [`\u003cstring\u003e`][string]\n- `err`: [`\u003cError\u003e`][error]\n- `value`: `\u003cany\u003e`\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nPick or fail key\n\n#### Collector.prototype.pick(key, value)\n\n- `key`: [`\u003cstring\u003e`][string]\n- `value`: `\u003cany\u003e`\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nPick key\n\n#### Collector.prototype.fail(key, err)\n\n- `key`: [`\u003cstring\u003e`][string]\n- `err`: [`\u003cError\u003e`][error]\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nFail key\n\n#### Collector.prototype.take(key, fn, args)\n\n- `key`: [`\u003cstring\u003e`][string]\n- `fn`: [`\u003cFunction\u003e`][function]\n- `args`: [`\u003cArray\u003e`][array] rest arguments, to be passed in fn\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nTake method result\n\n#### Collector.prototype.timeout(msec)\n\n- `msec`: [`\u003cnumber\u003e`][number]\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nSet timeout\n\n#### Collector.prototype.done(callback)\n\n- `callback`: [`\u003cFunction\u003e`][function]\n  - `err`: [`\u003cError\u003e`][error]\n  - `data`: `\u003cany\u003e`\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nSet on done listener\n\n#### Collector.prototype.finalize(key, err, data)\n\n#### Collector.prototype.distinct(value)\n\n- `value`: [`\u003cboolean\u003e`][boolean]\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nDeny or allow unlisted keys\n\n#### Collector.prototype.cancel(err)\n\n#### Collector.prototype.then(fulfill, reject)\n\n### compose(flow)\n\n- `flow`: [`\u003cFunction[]\u003e`][function] callback-last / err-first\n\n_Returns:_ [`\u003cFunction\u003e`][function] composed callback-last / err-first\n\nAsynchronous functions composition\n\nArray of functions results in sequential execution: `[f1, f2, f3]` Double\nbrackets array of functions results in parallel execution: `[[f1, f2, f3]]`\n\n_Example:_\n\n```js\nconst composed = metasync([f1, f2, f3, [[f4, f5, [f6, f7], f8]], f9]);\n```\n\n### class Composition\n\n#### Composition.prototype.constructor()\n\n#### Composition.prototype.on(name, callback)\n\n#### Composition.prototype.finalize(err)\n\n#### Composition.prototype.collect(err, result)\n\n#### Composition.prototype.parallel()\n\n#### Composition.prototype.sequential()\n\n#### Composition.prototype.then(fulfill, reject)\n\n#### Composition.prototype.clone()\n\nClone composed\n\n#### Composition.prototype.pause()\n\nPause execution\n\n#### Composition.prototype.resume()\n\nResume execution\n\n#### Composition.prototype.timeout(msec)\n\n- `msec`: [`\u003cnumber\u003e`][number]\n\nSet timeout\n\n#### Composition.prototype.cancel()\n\nCancel execution where possible\n\n### firstOf(fns, callback)\n\n- `fns`: [`\u003cFunction[]\u003e`][function] callback-last / err-first\n- `callback`: [`\u003cFunction\u003e`][function] on done, err-first\n\nExecutes all asynchronous functions and pass first result to callback\n\n### parallel(fns\\[, context\\], callback)\n\n- `fns`: [`\u003cFunction[]\u003e`][function] callback-last / err-first\n- `context`: [`\u003cObject\u003e`][object] incoming data, optional\n- `callback`: [`\u003cFunction\u003e`][function] on done, err-first\n\nParallel execution\n\n_Example:_\n\n```js\nmetasync.parallel([f1, f2, f3], (err, data) =\u003e {});\n```\n\n### sequential(fns\\[, context\\], callback)\n\n- `fns`: [`\u003cFunction[]\u003e`][function] callback-last with err-first contract\n- `context`: [`\u003cObject\u003e`][object] incoming data, optional\n- `callback`: [`\u003cFunction\u003e`][function] err-first on done\n\nSequential execution\n\n_Example:_\n\n```js\nmetasync.sequential([f1, f2, f3], (err, data) =\u003e {});\n```\n\n### runIf(condition\\[, defaultVal\\], asyncFn, ...args)\n\n- `condition`: `\u003cany\u003e`\n- `defaultVal`: `\u003cany\u003e` optional, value that will be returned to callback if\n  `condition` is falsy.\n- `asyncFn`: [`\u003cFunction\u003e`][function] callback-last function that will be\n  executed if `condition` if truthy\n- `args`: `\u003cany[]\u003e` args to pass to `asyncFn`\n\nRun `asyncFn` if `condition` is truthy, else return `defaultVal` to callback.\n\n### runIfFn(asyncFn, ...args)\n\n- `asyncFn`: [`\u003cFunction\u003e`][function] callback-last function that will be\n  executed if it is provided\n- `args`: `\u003cany[]\u003e` args to pass to `asyncFn`\n\nRun `asyncFn` if it is provided\n\n### class do\n\n#### do.prototype.constructor(fn, ...args)\n\n### toAsync(fn)\n\n- `fn`: [`\u003cFunction\u003e`][function] callback-last / err-first\n\n_Returns:_ [`\u003cFunction\u003e`][function]\n\nConvert synchronous function to asynchronous\n\nTransform function with args arguments and callback to function with args as\nseparate values and callback\n\n### asAsync(fn, args)\n\n- `fn`: [`\u003cFunction\u003e`][function] asynchronous\n- `args`: [`\u003cArray\u003e`][array] its arguments\n\nWrap function adding async chain methods\n\n### of(args)\n\n- `args`: [`\u003cArray\u003e`][array]\n\nApplicative f =\u003e a -\u003e f a\n\n### concat(fn1, fn2)\n\n- `fn1`: [`\u003cFunction\u003e`][function]\n- `fn2`: [`\u003cFunction\u003e`][function]\n\nMonoid m =\u003e a -\u003e a -\u003e a\n\n### fmap(fn1, f)\n\n- `fn1`: [`\u003cFunction\u003e`][function]\n- `f`: [`\u003cFunction\u003e`][function]\n\nFunctor f =\u003e (a -\u003e b) -\u003e f a -\u003e f b\n\n### ap(fn, funcA)\n\n- `fn`: [`\u003cFunction\u003e`][function]\n- `funcA`: [`\u003cFunction\u003e`][function]\n\nApplicative f =\u003e f (a -\u003e b) -\u003e f a -\u003e f b\n\n### memoize(fn)\n\n- `fn`: [`\u003cFunction\u003e`][function] sync or async\n\n_Returns:_ [`\u003cFunction\u003e`][function] memoized\n\nCreate memoized function\n\n### class Memoized\n\n#### Memoized.prototype.constructor()\n\n#### Memoized.prototype.clear()\n\n#### Memoized.prototype.add(key, err, data)\n\n#### Memoized.prototype.del(key)\n\n#### Memoized.prototype.get(key, callback)\n\n#### Memoized.prototype.on(eventName, listener)\n\n- `eventName`: [`\u003cstring\u003e`][string]\n- `listener`: [`\u003cFunction\u003e`][function] handler\n\nAdd event listener\n\n_Example:_\n\n```js\nconst memoized = new Memoized();\nmemoized.on('memoize', (err, data) =\u003e { ... });\nmemoized.on('add', (key, err, data) =\u003e { ... });\nmemoized.on('del', (key) =\u003e { ... })\nmemoized.on('clear', () =\u003e { ... });\n```\n\n#### Memoized.prototype.emit(eventName, args)\n\n- `eventName`: [`\u003cstring\u003e`][string]\n- `args`: `\u003cany\u003e` rest arguments\n\nEmit Memoized events\n\n### poolify(factory, min, norm, max)\n\n### queue(concurrency)\n\n- `concurrency`: [`\u003cnumber\u003e`][number] simultaneous and asynchronously executing\n  tasks\n\n_Returns:_ [`\u003cQueue\u003e`][queue]\n\nCreate Queue instance\n\n### class Queue\n\nQueue constructor\n\n#### Queue.prototype.constructor(concurrency)\n\n- `concurrency`: [`\u003cnumber\u003e`][number] asynchronous concurrency\n\nQueue constructor\n\n#### Queue.prototype.wait(msec)\n\n- `msec`: [`\u003cnumber\u003e`][number] wait timeout for single item\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nSet wait before processing timeout\n\n#### Queue.prototype.throttle(count\\[, interval\\])\n\n- `count`: [`\u003cnumber\u003e`][number] item count\n- `interval`: [`\u003cnumber\u003e`][number] per interval, optional default: 1000 msec\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nThrottle to limit throughput\n\n#### Queue.prototype.add(item\\[, factor\\[, priority\\]\\])\n\n- `item`: [`\u003cObject\u003e`][object] to be added\n- `factor`: [`\u003cnumber\u003e`][number]|[`\u003cstring\u003e`][string] type, source, destination\n  or path, optional\n- `priority`: [`\u003cnumber\u003e`][number] optional\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nAdd item to queue\n\n#### Queue.prototype.next(task)\n\n- `task`: [`\u003cArray\u003e`][array] next task [item, factor, priority]\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nProcess next item\n\n#### Queue.prototype.takeNext()\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nPrepare next item for processing\n\n#### Queue.prototype.pause()\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nPause queue\n\nThis function is not completely implemented yet\n\n#### Queue.prototype.resume()\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nResume queue\n\nThis function is not completely implemented yet\n\n#### Queue.prototype.clear()\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nClear queue\n\n#### Queue.prototype.timeout(msec, onTimeout)\n\n- `msec`: [`\u003cnumber\u003e`][number] process timeout for single item\n- `onTimeout`: [`\u003cFunction\u003e`][function]\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nSet timeout interval and listener\n\n#### Queue.prototype.process(fn)\n\n- `fn`: [`\u003cFunction\u003e`][function]\n  - `item`: [`\u003cObject\u003e`][object]\n  - `callback`: [`\u003cFunction\u003e`][function]\n    - `err`: [`\u003cError\u003e`][error]|[`\u003cnull\u003e`][null]\n    - `result`: `\u003cany\u003e`\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nSet processing function\n\n#### Queue.prototype.done(fn)\n\n- `fn`: [`\u003cFunction\u003e`][function] done listener\n  - `err`: [`\u003cError\u003e`][error]|[`\u003cnull\u003e`][null]\n  - `result`: `\u003cany\u003e`\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nSet listener on processing done\n\n#### Queue.prototype.success(listener)\n\n- `listener`: [`\u003cFunction\u003e`][function] on success\n  - `item`: `\u003cany\u003e`\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nSet listener on processing success\n\n#### Queue.prototype.failure(listener)\n\n- `listener`: [`\u003cFunction\u003e`][function] on failure\n  - `err`: [`\u003cError\u003e`][error]|[`\u003cnull\u003e`][null]\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nSet listener on processing error\n\n#### Queue.prototype.drain(listener)\n\n- `listener`: [`\u003cFunction\u003e`][function] on drain\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nSet listener on drain Queue\n\n#### Queue.prototype.fifo()\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nSwitch to FIFO mode (default for Queue)\n\n#### Queue.prototype.lifo()\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nSwitch to LIFO mode\n\n#### Queue.prototype.priority(flag)\n\n- `flag`: [`\u003cboolean\u003e`][boolean] default: true, false will disable priority mode\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nActivate or deactivate priority mode\n\n#### Queue.prototype.roundRobin(flag)\n\n- `flag`: [`\u003cboolean\u003e`][boolean] default: true, false will disable roundRobin\n  mode\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nActivate or deactivate round robin mode\n\n#### Queue.prototype.pipe(dest)\n\n- `dest`: [`\u003cQueue\u003e`][queue] destination queue\n\n_Returns:_ [`\u003cthis\u003e`][this]\n\nPipe processed items to different queue\n\n### throttle(timeout, fn, ...args)\n\n- `timeout`: [`\u003cnumber\u003e`][number] msec interval\n- `fn`: [`\u003cFunction\u003e`][function] to be throttled\n- `args`: [`\u003cArray\u003e`][array] arguments for fn, optional\n\n_Returns:_ [`\u003cFunction\u003e`][function]\n\nGet throttling function, executed once per interval\n\n### debounce(timeout, fn, ...args)\n\n- `timeout`: [`\u003cnumber\u003e`][number] msec\n- `fn`: [`\u003cFunction\u003e`][function] to be debounced\n- `args`: [`\u003cArray\u003e`][array] arguments for fn, optional\n\nDebounce function, delayed execution\n\n### timeout(timeout, fn, callback)\n\n- `timeout`: [`\u003cnumber\u003e`][number] time interval\n- `fn`: [`\u003cFunction\u003e`][function] to be executed\n- `callback`: [`\u003cFunction\u003e`][function] callback(...args), on done\n  - `args`: [`\u003cArray\u003e`][array]\n\nSet timeout for asynchronous function execution\n\n## Contributors\n\n- Timur Shemsedinov (marcusaurelius)\n- See github for full [contributors list](https://github.com/metarhia/metasync/graphs/contributors)\n\n[asynciterable]: https://tc39.github.io/ecma262/#sec-asynciterable-interface\n[asynciterator]: #class-asynciterator\n[collector]: #class-collector\n[queue]: #class-queue\n[object]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object\n[function]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function\n[promise]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n[array]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array\n[error]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error\n[boolean]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type\n[null]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Null_type\n[number]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type\n[string]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type\n[iterable]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols\n[this]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmetarhia%2Fmetasync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmetarhia%2Fmetasync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmetarhia%2Fmetasync/lists"}