{"id":32977176,"url":"https://github.com/homam/async-ls","last_synced_at":"2026-01-25T10:33:44.914Z","repository":{"id":15716178,"uuid":"18454234","full_name":"homam/async-ls","owner":"homam","description":"Higher order functions, compositions and common operations for asynchronous programming in LiveScript.","archived":false,"fork":false,"pushed_at":"2014-08-17T20:19:03.000Z","size":576,"stargazers_count":9,"open_issues_count":1,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-27T18:30:06.416Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"LiveScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/homam.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-04-04T22:14:37.000Z","updated_at":"2024-11-14T03:13:09.000Z","dependencies_parsed_at":"2022-09-01T09:50:58.098Z","dependency_job_id":null,"html_url":"https://github.com/homam/async-ls","commit_stats":null,"previous_names":["homam/async.ls"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/homam/async-ls","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/homam%2Fasync-ls","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/homam%2Fasync-ls/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/homam%2Fasync-ls/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/homam%2Fasync-ls/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/homam","download_url":"https://codeload.github.com/homam/async-ls/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/homam%2Fasync-ls/sbom","scorecard":{"id":468094,"data":{"date":"2025-08-11","repo":{"name":"github.com/homam/async-ls","commit":"00c52b6a54548cd0f8e6676fef6eb4abc3e4bde3"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.6,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-19T13:02:23.955Z","repository_id":15716178,"created_at":"2025-08-19T13:02:23.955Z","updated_at":"2025-08-19T13:02:23.955Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28751816,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-25T10:25:12.305Z","status":"ssl_error","status_checked_at":"2026-01-25T10:25:11.933Z","response_time":113,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":[],"created_at":"2025-11-13T06:00:32.662Z","updated_at":"2026-01-25T10:33:44.908Z","avatar_url":"https://github.com/homam.png","language":"LiveScript","readme":"# async-ls\n\nThis library provides powerful higher-order functions and other utilities\nfor working with asynchronous functions with callbacks or ES6 promises.\n\nCallback utility functions are in \n\n\t{callbacks} = require \\async-ls\n\t\nand promise based functions are in \n\n\t{promises} = require \\async-ls\n\t\nThere's also a monad library accessible by:\n\n    {monads} = require \\async-ls\n\t\nCallback and promise functions are similar in their input arguments and their result. Callback functions return a callback function with the signature of `(error, result) -\u003e void` and promise functions return a `Promise` object.\n\nTo get the individual functions use LiveScript pattern matching syntax:\n\n    {\n    \tpromises: {\n    \t\tLazyPromise, parallel-map, parallel-limited-filter\n    \t},\n    \tmonads: {\n    \t    filterM, liftM\n    \t}\n    } = require \\async-ls\n\nTo build:\n\n    make build\n    \nBuild for browsers (using Browserify):\n\n    make async-browser.js\n    \nBuild for browsers (callbacks library only):\n\n    make callbacks-browser.js \n    \nBuild for browsers (promises library only):\n\n    make promises-browser.js\n\nTo test:\n\n    ./test.sh\n\n\n# Monads\n\n    {monads} = require \\async-ls\n\n### monadize\nMonads work best in statically typed languages. To make monadic functions\nwork in LiveScript, we need to pass the type of the monad to many of the monadic operations.\n`monadize` encapsulates the monad's type: `return` aka `pure`, `fmap` and `bind` functions.\n\n    monadize :: \n        (a -\u003e m a) -\u003e                   # pure\n        ((a -\u003e b) -\u003e m a -\u003e m b) -\u003e     # fmap\n        (m a -\u003e (a -\u003e m b) -\u003e m b) -\u003e   # bind\n        Monad\n\n\n\n### kcompM\nLeft-to-right Kleisli composition of monads.\n\n\tkcompM :: (Monad m) =\u003e (a -\u003e m b) -\u003e (b -\u003e m c) -\u003e (a -\u003e m c)\n\n\n\n### joinM\nRemove one level of monadic structure, projecting its bound argument into the outer level.\n\t\n\t(Monad m) =\u003e m m x -\u003e m x\n\n\n\n### filterM\nFilter the list by applying the predicate function to \neach of its element one-by-one in serial order.\n\t\n\tfilterM :: (Monad x) =\u003e (x -\u003e m Boolean) -\u003e [x] -\u003e m [x]\n\n\n\n### foldM\nThe `foldM` function is analogous to `foldl`, except that its result is\nencapsulated in a monad.\n\t\n\tfoldM :: (Monad a) =\u003e (a -\u003e b -\u003e m a) -\u003e a -\u003e [b] -\u003e m a\n\n\n\n### sequenceM\nEvaluate each action in the sequence from left to right,\nand collect the results.\n\t\n\tsequenceM :: (Monad x) =\u003e [m x] -\u003e m [x]\n\n\n\n### mapM\nIt is equivalent to `sequenceM . (map f)`.\n\t\n\t(Monad m) =\u003e (x -\u003e m x) -\u003e [x] -\u003e m [x]\n\n\n\n### liftM\nPromote a function to a monad.\n\t\n\tliftM  :: (Monad m) =\u003e (a -\u003e r) -\u003e m a -\u003e m r\n\n\n\n### liftM2\nPromote a function to a monad, scanning the monadic arguments from\nleft to right.\n\t\n\tliftM2 :: (Monad m) =\u003e (a1 -\u003e a2 -\u003e r) -\u003e m a1 -\u003e m a2 -\u003e m r\n\n\n\n### ap\n``monad.pureM f `ap` x1 `ap` ... `ap` `` is equivalent to `(liftMn monad) f x1 x2 ... xn`\n\t\n\tap :: (Monad m) =\u003e m (a -\u003e b) -\u003e m a -\u003e m b\n\n\n\n### Some Monad Instances:\n\n    list-monad :: Monad     # []\n\t\n\teither-monad :: Monad   # [error, right]\n\t\n\twriter-monad :: Monad   # [value, monoid]\n\t\n\n\n\n# Promises\n\n    {promises} = require \\async-ls\n\n\n## Lazy Promise\n`LazyPromise` only starts getting evaluated after `then` is called.\n\n    LazyPromise : Promise\n\n\n## Compositions\n\n    promise-monad :: Monad\n\n### returnP\nInject a value into a promise.\n\n\treturnP :: x -\u003e Promise x\n\n\n\n### fmapP\nMap a normal function over a promise.\n\n\tfmapP :: (x -\u003e y) -\u003e Promise x -\u003e Promise y\n\n\n\n### ffmapP\n`fmapP` with its arguments flipped.\n\n\tffmapP :: Promise x -\u003e (x -\u003e y) -\u003e Promise y\n\n\n\n### bindP\nSequentially compose two promises, passing the value produced\nby the first as an argument to the second.\n\n\tbindP :: Promise x -\u003e (x -\u003e Promise y) -\u003e Promise y\n\n\n\n### fbindP\n`bindP` with its arguments flipped.\n\n\tfbindP :: (x -\u003e Promise y) -\u003e Promise x -\u003e Promise y\n\n\n\n### filterP\nFilter the list by applying the promise predicate function to \neach of its element one-by-one in serial order.\n\n\tfilterP :: (x -\u003e Promise Boolean) -\u003e [x] -\u003e Promise [x]\n\n\n\n### foldP\nThe `foldP` function is analogous to `foldl`, except that its result is\nencapsulated in a promise.\n\n\tfoldP :: (a -\u003e b -\u003e Promise a) -\u003e a -\u003e [b] -\u003e Promise a\n\n\n\n### sequenceP\nRun its input (an array of `Promise` s) in parallel\n(without waiting for the previous promise to fulfill),\nand return the results encapsulated in a promise.\n\nThe returned promise immidiately gets rejected,\nif any of the promises in the input list fail.\n\n\tsequenceP :: [Promise x] -\u003e Promise [x]\n\n\n\n## Lists\n\n\n### parallel-map\n\n\tparallel-map :: (a -\u003e Promise b) -\u003e [a] -\u003e Promise [b]\n\n\n\n### serial-map\n\n\tserial-map :: (a -\u003e Promise b) -\u003e [a] -\u003e Promise [b]\n\n\n\n### parallel-limited-map\n\n\tparallel-limited-map :: Int -\u003e (x -\u003e Promise y) -\u003e [x] -\u003e Promise [y]\n\n\n\n### parallel-filter\n\n\tparallel-filter :: (x -\u003e m Boolean) -\u003e [x] -\u003e m [x]\n\n\n\n### serial-filter\nSynonym for `filterP`\n\n\tserial-filter :: (x -\u003e Promise Boolean) -\u003e [x] -\u003e Promise [x]\n\n\n\n### parallel-limited-filter\n\n\tparallel-limited-filter :: Int -\u003e (x -\u003e Promise Boolean) -\u003e [x] -\u003e Promise x\n\n\n\n### parallel-any\nRun the boolean predicate (that is encapsulated in a promise) on the list in parallel.\nThe returned promise fulfills as soon as a matching item is found with `true`,\notherwise `false` if no match was found.\n\n\tparallel-any :: (x -\u003e Promise Boolean) -\u003e [x] -\u003e Promise Boolean\n\n\n\n### serial-any\n\n\tserial-any :: (x -\u003e m Boolean) -\u003e [x] -\u003e m Boolean\n\n\n\n### parallel-limited-any\n\n\tparallel-limited-any :: Int -\u003e (x -\u003e Promise Boolean) -\u003e [x] -\u003e Promise Boolean\n\n\n\n### parallel-all\n\n\tparallel-all :: (x -\u003e Promise Boolean) -\u003e [x] -\u003e Promise Boolean\n\n\n\n### serial-all\n\n\tserial-all :: (x -\u003e Promise Boolean) -\u003e [x] -\u003e Promise Boolean\n\n\n\n### parallel-limited-all\n\n\tparallel-limited-all :: Int -\u003e (x -\u003e Promise Boolean) -\u003e [x] -\u003e Promise Boolean\n\n\n\n### parallel-find\nRun the boolean predicate (that is encapsulated in a promise) on the list in parallel.\nThe returned promisefulfills as soon as a matching item is found with the\nmatching value, otherwise with `null` if no match was found. \n\n\tparallel-find :: (x -\u003e Promise Boolean) -\u003e [x] -\u003e m \n\n\n\n### serial-find\n\n\tserial-find :: (x -\u003e Promise Boolean) -\u003e [x] -\u003e m x\n\n\n\n### parallel-limited-find\n\n\tparallel-limited-find :: Int -\u003e (x -\u003e Promise Boolean) -\u003e [x] -\u003e Promise x\n\n\n\n### parallel-sequence\nSynonym for `sequenceP`\n\n\tparallel-sequence :: [Promise x] -\u003e Promise [x]\n\n\n\n### serial-sequence\nThe serial version of `sequenceP`.\n\nTo run the list one by one in a serial order, its items\nmust be instances of `LazyPromise` type.\nThis function runs the list in parallel, if it is a list \nof normal `Promise` s.\n\n\tserial-sequence :: [LazyPromise x] -\u003e LazyPromise [x]\n\n\n\n### parallel-limited-sequence\n\n\tparallel-limited-sequence :: Int -\u003e [LazyPromise x] -\u003e LazyPromise [x]\n\n\n\n### parallel-apply-each\n\n\tparallel-apply-each :: x -\u003e [x -\u003e Promise y] -\u003e Promise [y]\n\n\n\n### serial-apply-each\n\n\tserial-apply-each :: x -\u003e [x -\u003e Promise y] -\u003e Promise [y]\n\n\n\n### parallel-limited-apply-each\n\n\tparallel-limited-apply-each :: x -\u003e [x -\u003e Promise y] -\u003e Promise [y]\n\n\n\n### parallel-sort-by\nSort the list using the given function for making the comparison between the items.\n\n\tparallel-sort-by :: (a -\u003e Promise b) -\u003e [a] -\u003e Promise [a]\n\n\n\n### parallel-sort-with\n`parallel-sort-with` takes a binary function which compares two items and returns either\na positive number, 0, or a negative number, and sorts the inputted list\nusing that function. \n\n\tparallel-sort-with :: (a -\u003e a -\u003e Promise i) -\u003e [a] -\u003e Promise [a]\n\n\n\n### waterfall\n\n\twaterfall :: x -\u003e (x -\u003e Promise x) -\u003e Promise x\n\n\n\n### transform-promise-either\nBind a promise monad to an either monad. The result is a promise monad. \nSince we can think of promise as a superset of either in the way it handles errors.\n\n\ttransform-promise-either :: Promise x -\u003e (x -\u003e Either y) -\u003e Promise y\n\n\n\n### ftransform-promise-either\n`transform-promise-either` with its arguments flipped.\n\n\tftransform-promise-either :: (x -\u003e Either y) -\u003e Promise x -\u003e Promise y\n\n\n\n### transform-either-promise\nBind an either monad to a promise monad.\n\n\ttransform-either-promise :: Either x -\u003e (x -\u003e Promise y) -\u003e Promise y\n\n\n\n### ftransform-either-promise\n`transform-either-promise` with its arguments flipped.\n\n\tftransform-either-promise :: (x -\u003e Promise y) -\u003e Either x -\u003e Promise y\n\n\n\n### to-callback\nConvert the promise object to a callback with the signature of `(error, result) -\u003e void`\n\n\tPromise x -\u003e CB x\n\n\n\n### from-value-callback\nMake a promise object from a callback with the signature of `(result) -\u003e void`, like `fs.exist`\n\n\tCb x -\u003e Promise x\n\n\n\n### from-error-value-callback\nMake a promise object from a callback with the signature of `(error, result) -\u003e void`, like `fs.stat`\n\n\tCB x -\u003e Promise x\n\n\n\n### from-named-callbacks\nMake a promise object from `obj`.\n\n\tString -\u003e String -\u003e obj -\u003e Promise x\n\n---\n\n---\n\n---\n\n# Callbacks\nThese functions are analogous to their promise-based counterparts that are documented above.\nBut instead of a `Promise` their last argument is a callback. You can think of curried version of these functions as functions that return a function that takes `callback`.\n\n    {callbacks} = require \\prelude-ls\n\n## Convention\n\nThis would be our definition of asynchronous functions:\n\u003e If function `f` returns function `g` and `g` takes a `callback` as its only argument; then `f` is an asynchronous function.\n\nOur callbacks will always receive two parameters: `(error, result)`.\n\nHere `CB a` stands for a callback function with signature: `(err, a) -\u003e void`\nYou can get the result of an asynchronous function (with a `callback` of type of `CB a`) by:\n\n\t(err, a) \u003c- f\n\n## Composition of Asynchronous Actions\n\n### returnA\nInject a value into an asynchronous action.\n\n\treturnA :: x -\u003e CB x\n\n\n### fmapA\nMap a normal function over an asynchronous action.\n\n\tfmapA :: (x -\u003e y) -\u003e CB x -\u003e CB y\n\n\n### ffmapA\nfmapA with its arguments flipped\n\n\tffmapA :: CB x -\u003e (x -\u003e y) -\u003e CB y\n\n\n### bindA\nSequentially compose two asynchronous actions, passing the value produced\nby the first as an argument to the second.\n\n\tbindA :: CB x -\u003e (x -\u003e CB y) -\u003e CB y\n\n\n### fbindA\nbindA with its arguments flipped\n\n\tfbindA :: (x -\u003e CB y) -\u003e CB x -\u003e CB y\n\n### kcompA\nSimilar to Left-to-right Kleisli composition, `kcompA` composes\ntwo asynchronous actions passing the value produced\nby the first as an argument to the second. The result is a new\nasynchronous function that takes the argument of the first function.\n\n\tkcompA :: (x -\u003e CB y) -\u003e (y -\u003e CB z) -\u003e (x -\u003e CB z)\n\n\n### foldA\nThe `foldA` function is analogous to `foldl`, except that its result is\nencapsulated in an asynchronous callback.\n\n\tfoldA :: (a -\u003e b -\u003e m a) -\u003e a -\u003e [b] -\u003e m a\n\n\n### sequenceA\nEvaluate each action in the sequence from left to right,  and collect the results.\n\n\tsequenceA :: [CB x] -\u003e CB [x]\n\n\n### filterA\nFilter the list by applying the asynchronous predicate function.\n\n\tfilterA :: (x -\u003e CB Boolean) -\u003e [x] -\u003e CB [x]\n\n\n\n## Either\n\n### returnE\nInject a value into an either action.\n\n\treturnE :: x -\u003e Either x\n\n### fmapE\n    fmapE :: (x -\u003e y) -\u003e Either x -\u003e Either y\n\n\n### fmapE\n    ffmapE :: Either x -\u003e (x -\u003e y) -\u003e Either y\n\n\n### bindE\n\n    bindE :: Either x -\u003e (x -\u003e Either y) -\u003e Either y\n\n### bindE\n\n    bindE :: (x -\u003e Either y) -\u003e Either x -\u003e Either y\n\n\n### kcompE\n\nLeft to right Kleisli composition\n    \n    kcompE :: (x -\u003e Either y) -\u003e (y -\u003e Either z) -\u003e (x -\u003e Either z)\n\n\n### foldE\n\n    foldE :: (a -\u003e b -\u003e Either a) -\u003e a -\u003e [b] -\u003e Either a\n\n\n### sequenceE\n\n    sequenceE :: [Either x] -\u003e Either [x]\n\n\n### transformAE\n\n    transformAE :: CB x -\u003e (x -\u003e Either y) -\u003e CB y\n\n\n### ftransformAE\n\n    ftransformAE :: (x -\u003e Either y) -\u003e CB x -\u003e CB y\n\n### transformEA\n\n    transformEA :: Either x -\u003e (x -\u003e CB y) -\u003e CB y\n\n### ftransformEA\n\n    ftransformEA :: (x -\u003e CB y) -\u003e Either x -\u003e CB y\n\n\n# Lists\n\n## Map\n\n### parallel-map\n\n\tparallel-map :: (a -\u003e CB b) -\u003e [a] -\u003e CB [b]\n\n\n### serial-map\nSerial Asynchronous Map\n\n\tserial-map :: (a -\u003e CB b) -\u003e [a] -\u003e CB [b]\n\n\n### parallel-map-limited\nSimilar to `parallel-map`, only no more than \n`limit` iterators will be simultaneously running at any time.\n\n\tparallel-map-limited :: Int -\u003e (x -\u003e CB y) -\u003e [x] -\u003e CB [y]\n\n\n## Filter\n\n### parallel-filter\n\n\tparallel-filter :: (x -\u003e CB Boolean) -\u003e [x] -\u003e CB [x]\n\n\n### serial-filter\n\n\tserial-filter :: (x -\u003e CB Boolean) -\u003e [x] -\u003e CB [x]\n\n\n### parallel-limited-filter\n\n\tparallel-limited-filter :: Int -\u003e (x -\u003e CB Boolean) -\u003e [x] -\u003e CB x\n\n\n## Any, All, Find\n\n\n### parallel-any\n\n\tparallel-any :: (x -\u003e CB Boolean) -\u003e [x] -\u003e CB Boolean\n\n\n### serial-any\n\nserial-any :: (x -\u003e CB Boolean) -\u003e [x] -\u003e CB Boolean\n\n\n### parallel-limited-any\n\n\tparallel-limited-any :: Int -\u003e (x -\u003e CB Boolean) -\u003e [x] -\u003e CB Boolean\n\n\n### parallel-all\n\n\tparallel-all :: (x -\u003e CB Boolean) -\u003e [x] -\u003e CB Boolean\n\n\n### serial-all\n\n\tserial-all :: (x -\u003e CB Boolean) -\u003e [x] -\u003e CB Boolean\n\n\n### parallel-limited-all\n\n\tparallel-limited-all :: Int -\u003e (x -\u003e CB Boolean) -\u003e [x] -\u003e CB Boolean\n\n\n### parallel-find\n\n\tparalel-find :: (x -\u003e CB Boolean) -\u003e [x] -\u003e CB x\n\n\n### serial-find\n\n\tserial-find :: (x -\u003e CB Boolean) -\u003e [x] -\u003e CB x\n\n\n## Sort\n\n### parallel-sort-by\nSorts a list using the inputted function for making the comparison between the items.\n\n\tparallel-sort-by :: (a -\u003e CB b) -\u003e [a] -\u003e CB [a]\n\n\n### parallel-sort-with\nTakes a binary function which compares two items and returns either\na positive number, 0, or a negative number, and sorts the inputted list\nusing that function. \n\n\tparallel-sort-with :: (a -\u003e a -\u003e CB i) -\u003e [a] -\u003e CB [a]\n\n\n## Control Flow\n\n### serial-sequence\n\tserial-sequence :: [CB x] -\u003e CB [x]\n\n\n### parallel-sequence\nRun its sole input (a tasks array of functions) in parallel, \nwithout waiting until the previous function has completed. \nIf any of the functions pass an error to its callback, \nthe main callback is immediately called with the value of the error. \nOnce the tasks have completed, the results are passed to the final callback as an array.\n\n\tparallel-sequence :: [CB x] -\u003e CB [x]\n\n\n### parallel-limited-sequence\n\n\tparallel-limited-sequence :: Int -\u003e [CB x] -\u003e CB [x]\n\n\n### parallel-apply-each\n\n\tparallel-apply-each :: x -\u003e [x -\u003e CB y] -\u003e CB [y]\n\n\n### serial-apply-each\n\n\tserial-apply-each :: x -\u003e [x -\u003e CB y] -\u003e CB [y]\n\n\n### parallel-limited-apply-each\n\n\tparallel-limited-apply-each :: x -\u003e [x -\u003e CB y] -\u003e CB [y]\n\n\n### waterfall\n\n\twaterfall :: x -\u003e (x -\u003e CB x) -\u003e CB x\n\n\n### serial-fold\n\n\tserial-fold :: (a -\u003e b -\u003e m a) -\u003e a -\u003e [b] -\u003e m a\n\n\n","funding_links":[],"categories":["Libraries"],"sub_categories":["[Javascript](https://developer.mozilla.org/en-US/docs/Web/JavaScript)"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhomam%2Fasync-ls","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhomam%2Fasync-ls","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhomam%2Fasync-ls/lists"}