{"id":28928013,"url":"https://github.com/trainyard/pico-lambda","last_synced_at":"2026-03-07T09:04:11.156Z","repository":{"id":47441507,"uuid":"79500588","full_name":"trainyard/pico-lambda","owner":"trainyard","description":"pico sized functional library","archived":false,"fork":false,"pushed_at":"2017-11-21T13:51:47.000Z","size":1303,"stargazers_count":71,"open_issues_count":1,"forks_count":4,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-09-18T09:08:54.697Z","etag":null,"topics":["es6","functional-programming","javascript","javascript-array"],"latest_commit_sha":null,"homepage":"","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/trainyard.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}},"created_at":"2017-01-19T22:12:19.000Z","updated_at":"2024-02-25T08:16:41.000Z","dependencies_parsed_at":"2022-09-26T18:11:32.695Z","dependency_job_id":null,"html_url":"https://github.com/trainyard/pico-lambda","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/trainyard/pico-lambda","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trainyard%2Fpico-lambda","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trainyard%2Fpico-lambda/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trainyard%2Fpico-lambda/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trainyard%2Fpico-lambda/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/trainyard","download_url":"https://codeload.github.com/trainyard/pico-lambda/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trainyard%2Fpico-lambda/sbom","scorecard":{"id":896737,"data":{"date":"2025-08-11","repo":{"name":"github.com/trainyard/pico-lambda","commit":"9ba7fd972c911fd28e74874babcf3fef28eeaa74"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/29 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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 2 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-24T13:59:36.924Z","repository_id":47441507,"created_at":"2025-08-24T13:59:36.924Z","updated_at":"2025-08-24T13:59:36.924Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278734435,"owners_count":26036404,"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","status":"online","status_checked_at":"2025-10-07T02:00:06.786Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["es6","functional-programming","javascript","javascript-array"],"created_at":"2025-06-22T14:11:42.642Z","updated_at":"2025-10-07T06:43:29.713Z","avatar_url":"https://github.com/trainyard.png","language":"JavaScript","readme":"\u003ch1 align=\"center\"\u003epico-lambda\u003c/h1\u003e\n\n\u003cdiv align=\"center\"\u003e\n  λ\n\u003c/div\u003e\n\u003cdiv align=\"center\"\u003e\n  \u003cstrong\u003eArrays, Strings and things the functional way\u003c/strong\u003e\n\u003c/div\u003e\n\u003cdiv align=\"center\"\u003e\n  A \u003ccode\u003e640b\u003c/code\u003e functional library based on native methods\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003c!-- Build Status --\u003e\n  \u003ca href=\"https://travis-ci.org/trainyard/pico-lambda\"\u003e\n    \u003cimg src=\"https://travis-ci.org/trainyard/pico-lambda.svg?branch=master\"\n      alt=\"Build Status\" /\u003e\n  \u003c/a\u003e\n  \u003c!-- Downloads --\u003e\n  \u003ca href=\"https://npmjs.org/package/pico-lambda\"\u003e\n    \u003cimg src=\"https://img.shields.io/npm/dm/pico-lambda.svg?style=flat-square\"\n      alt=\"Downloads\" /\u003e\n  \u003c/a\u003e\n  \u003c!-- Semi Standard --\u003e\n  \u003ca href=\"https://github.com/Flet/semistandard\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/code%20style-semistandard-brightgreen.svg?style=flat-square\"\n      alt=\"semistandard\" /\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\u003cdiv align=\"center\"\u003e\n  Proudly supported by...\u003cbr/\u003e\n  \u003ca href=\"https://www.browserstack.com/\"\u003e\u003cimg src=\"browserstack.png\" width=240 alt=\"BrowserStack\"/\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n## Rationale\n\nWe needed to optimize the bundle size of our projects.  Since we were already using ES6 and transpiling it, we decided to create a functional library that takes the native Array and String APIs used by major browsers and Nodejs, and make them *functional* - so we can `curry`, `compose`, and `pipe` them.  If you are either already transpiling es6 in your project, or you are not supporting older browsers, you should use this instead of `ramda` or `lodash/fp`.  If you need to support older browsers, are not transpiling es6, or using es5 - you should use `lodash/fp` or `ramda`\n\n## Features\n- **Pico:** weighs less than 700 bytes when minified and gzipped.\n- **Useful:** takes most native JavaScript array and string methods and makes them *immutable*, *curried*, and *composable*.\n- **Functional:** Curry, compose and pipe, Oh My!\n- **Familiar:** same names just curried and composable. See [JavaScript Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array) and [JavaScript String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String).\n- **Degrades Gracefully:** a small set of these functions are not available in every browser/environment. When not available in the browser it will not be available in Pico Lambda.\n\n\u003e Pico-lambda was made for the ES6 Javascript Runtime. It has __no dependencies__.\n\n* * *\n\n## Example\n\nAfter installing via `npm install`:\n\n```js\nconst {parray, pcore} = require('pico-lambda')\nconst {\n  concat,\n  filter,\n  map,\n  reduce,\n} = parray\nconst {\n  compose\n} = pcore\n\n//concat\nconst arrayOne = [1, 2, 3];\nconst addTwo = concat([4, 5])\nconst result = addTwo(arrayOne)\n\n// We can compose instead of chaining\ncompose(\n  reduce((acc, val) =\u003e val + acc, 0),\n  map(x =\u003e x * 2),\n  filter(x =\u003e x \u003e 5),\n  concat([6, 7, 8])\n)([1, 2, 3, 4, 5])\n```\n\n* * *\n\n## functions\nThis table shows compatibility for each of the functions available by browser. *Currently only array functions are listed. String will be added soon.*\nIf you wish to have full compatibility you can use a transpiler like babel.\n\n\u003cdetails\u003e\n\u003csummary\u003eTable of Compatibility\u003c/summary\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth\u003e\n        Function\n      \u003c/th\u003e\n      \u003cth\u003e\n        Android 5.1+\n      \u003c/th\u003e\n      \u003cth\u003e\n        Chrome 52+\n      \u003c/th\u003e\n      \u003cth\u003e\n        Edge 13+\n      \u003c/th\u003e\n      \u003cth\u003e\n        FF 45+\n      \u003c/th\u003e\n      \u003cth\u003e\n        iOS 9+\n      \u003c/th\u003e\n      \u003cth\u003e\n        Safari 9+\n      \u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003ecompose\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003econcat\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003ecopyWithin\u003c/td\u003e\n      \u003ctd\u003e❌\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eentries\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eevery\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003efill\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003efilter\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003efind\u003c/td\u003e\n      \u003ctd\u003e❌\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003efindIndex\u003c/td\u003e\n      \u003ctd\u003e❌\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eincludes\u003c/td\u003e\n      \u003ctd\u003e❌\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eindexOf\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003ejoin\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003ekeys\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003elastIndexOf\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003emap\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003epipe\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003epop\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003epush\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003ereduce\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003ereduceRight\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003ereverse\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eshift\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eslice\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003esplice\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003esome\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003esort\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003etoLocaleString\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003etoString\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eunshift\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003c/details\u003e\n\n# API\n\nThe api is broken up into three sections:\n* pcore - Basic functional capabilities like curry and compose\n* parray - The standard Array.prototype methods setup for functional use\n* pstring - The standard String.prototype methods setup for functional use\n\nOne note, parray and pstring have some overlapping function names:\n * length\n * toString\n * slice\n * indexOf\n * lastIndexOf\n * includes\n * concat\n\n Be aware of this when importing these into your global namespace.\n\n\n---\n## pcore\n---\n### pipe :: `((a -\u003e b), (b -\u003e c), ..., (e -\u003e f)) -\u003e a -\u003e f`\nTakes an initial value that is passed to the first function in the parameter list.\nThe return value of each subsequent function is passed to the following function.\nThe return value of the last function is returned from pipe.\n\n```js\nconst arr = [1, 2, 3, 4, 5]\npipe(\n  unshift(0),        // (a -\u003e b)\n  concat([6, 7, 8])  // (b -\u003e c)\n)(arr) // =\u003e [0, 1, 2, 3, 4, 5, 6, 7, 8]\n```\n### compose :: `((e -\u003e f), ..., (b -\u003e c), (a -\u003e b)) -\u003e a -\u003e f`\n\nEvaluates the provided functions, right to left, passing the return value\nof each function to the next in line.\nThe initial function is passed the initial value provided to compose.\nThe output of the final function, in the above case `(e-\u003ef)`, is returned.\n\n```js\ncompose(\n  map(x =\u003e x + 1),  // (c -\u003e d)\n  map(x =\u003e x + 1),  // (b -\u003e c)\n  map(x =\u003e x + 1)   // (a -\u003e b)\n)([0]) // (-\u003e a) =\u003e 3\n```\n\n### curry :: `(fn) -\u003e fn`\nTakes a function and curries the arguments.\n\nTake note that rest parameters are only partially supported using curry. JS only reports expected parameters, optional and rest parameters are not reported. As a result, there is no way to determine when to expect them. What this means, in practice, is that you can pass rest and/or optional parameters along with the last required param, but you cannot pass them on their own in a new set of parens. See the example below for an illustration of this.\n\n\n```js\nfunction log4Things(a, b, c, d) {\n  console.log(a, b, c, d)\n}\n\nconst curriedLog = curry(log4Things)\n\ncurriedLog(1, 2, 3, 4) //=\u003e Outputs: 1 2 3 4\ncurriedLog(1)(2)(3)(4) //=\u003e Outputs: 1 2 3 4\ncurriedLog(1)(2, 3)(4) //=\u003e Outputs: 1 2 3 4\ncurriedLog(1)(2)(3)(4) //=\u003e Outputs: 1 2 3 4\ncurriedLog(1, 2)(3, 4) //=\u003e Outputs: 1 2 3 4\ncurriedLog(1, 2, 3)(4) //=\u003e Outputs: 1 2 3 4\n//You get the idea.....\n\nconst partialLog = curriedLog(1, 2, 3)\npartialLog(4)          //=\u003e Outputs: 1 2 3 4\npartialLog(5)          //=\u003e Outputs: 1 2 3 5\n\n//Using Rest parameters\nfunction log3OrMoreThings(a, b, c, ...d) {\n  console.log(a, b, c, ...d)\n}\nconst curriedLogMore = curry(log3OrMoreThings)\n\ncurriedLogMore(1, 2, 3) //=\u003e Outputs: 1 2 3\ncurriedLogMore(1, 2, 3, 4) //=\u003e Outputs: 1 2 3 4\ncurriedLogMore(1, 2)(3) //=\u003e Outputs: 1 2 3\ncurriedLogMore(1, 2)(3, 4) //=\u003e Outputs: 1 2 3 4\n//However, the following all result in an error\ncurriedLogMore(1)(2)(3)(4) //Throws: TypeError('curriedLogMore(...)(...)(...) is not a function')\ncurriedLogMore(1)(2, 3)(4) //Throws: TypeError('curriedLogMore(...)(...)(...) is not a function')\ncurriedLogMore(1)(2)(3)(4) //Throws: TypeError('curriedLogMore(...)(...)(...) is not a function')\ncurriedLogMore(1, 2, 3)(4) //Throws: TypeError('curriedLogMore(...)(...)(...) is not a function')\n//This is because the curry function calls the original function after the third param and the result is then called as a function with the last grouping, '(4)' in this case\n\n\n```\n### identity :: `a -\u003e a`\nTakes an argument and returns that arugment. This can be quite useful when composing many functions together.\n\n```js\nconsole.log(identity(\"hi\")) //Outputs: hi\n\n```\n\n---\n## parray\n---\n### concat :: `[a] -\u003e ([a], ..., [a]) -\u003e [a]`\nConcatenates two or more arrays\n\n```js\nconcat([4, 5])([1,2,3]) // =\u003e [1, 2, 3, 4, 5]\nconcat([4, 5])([1,2], [3]) // =\u003e [1, 2, 3, 4, 5]\n```\n\u003e See [Array.concat (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat)\n\n### copyWithin :: `(Int, Int, Int) -\u003e [a] -\u003e [a]` | `(Int, Int) -\u003e [a] -\u003e [a]`\nMakes a shallow copy of part of an array and overwrites another location in the same with the copy. Size is kept constant.\n* The first Int is the target index to write the copy to.\n* The second Int is the index to start the copy from.\n* The third, optional, Int specifies the end of the range to copy (exclusive of the end index). If not provided, it goes to the end of the array.\n```js\nconst arr = [1, 2, 3, 4, 5]\ncopyWithin(3, 1)(arr) // =\u003e [1, 2, 3, 2, 3]\ncopyWithin(3, 1, 2)(arr) // =\u003e [1, 2, 3, 2, 5]\n```\n\u003e See [Array.copyWithin (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/copyWithin)\n\n### entries:: `[a] -\u003e [b]`\nReturn an iterator over key, value pairs from the array.\n\n```js\nconst iterator = entries([1, 2, 3, 4, 5])\niterator.next() // =\u003e { value: [0, 1], done: false }\n```\n\u003e See [Array.entries (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/entries)\n\n### every  :: `((a, Int, [a]) -\u003e Boolean) -\u003e [a] -\u003e Boolean`\nApplies predicate to all elements in array and returns false if any fail. The predicate function must at least take one parameter for each element but may optionally take an index and the entire array as 2nd and 3rd parameters, respectively.\n\n```js\nconst predicate = x =\u003e x \u003c 4\nevery(predicate)([1, 2, 3]) // =\u003e true\nevery(predicate)([1, 2, 3, 4, 5]) // =\u003e false\n```\n\u003e See [Array.every (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every)\n\n### fill :: `(a, Int, Int) -\u003e [a] -\u003e [a]` | `(a) -\u003e [a] -\u003e [a]`\nFills a portion of the given array putting the same new value into each slot.\n* The first parameters (a) is the element to add into the array\n* The second parameter (Int) is the first index to start filling at. If not supplied it starts at 0.\n* The third parameter (Int) is the index to stop filling before (i.e., exclusive). If not supplied fill goes to the end of the array.\n\n```js\nconst arr = [1, 2, 3, 4, 5]\nfill(1)(arr) // =\u003e [1, 1, 1, 1, 1]\nfill(1, 2, 4)(arr) // =\u003e [1, 2, 1, 1, 5]\n```\n\u003e See [Array.fill (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/fill)\n\n### filter :: `((a, Int, [a]) -\u003e Boolean) -\u003e [a] -\u003e [a]`\nReturns a new array containing only those elements of the given array that pass the given predicate.\n\n```js\nconst predicate = x =\u003e x \u003c 3\nfilter(predicate)([1, 2, 3, 4, 5]) // =\u003e [1, 2]\n```\n\u003e See [Array.filter (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)\n\n### find :: `(a -\u003e Boolean) -\u003e [a] -\u003e a | undefined`\nFinds and returns the first element in the given array that matches the given predicate. If no element passes, undefined is returned.\n\n```js\nconst predicate = x =\u003e x === 3\nfind(predicate)([1, 2, 3]) // =\u003e 3\nfind(predicate)([1, 2]) // =\u003e undefined\n```\n\u003e See [Array.find (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find)\n\n### findIndex :: `(a -\u003e Boolean) -\u003e [a] -\u003e Int`\nReturns the index of the first element in the given array that matches the given predicate. If no element passes, -1 is returned.\n\n```js\nconst arr = [1, 2, 3, 4, 5]\nconst findIndex = x =\u003e x === 3\nfind(x =\u003e x \u003e 3)(arr) // =\u003e 3\nfind(x =\u003e x \u003e 80)(arr]) // =\u003e -1\n```\n\u003e See [Array.findIndex (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex)\n\n### includes :: `a -\u003e [a] -\u003e Boolean`\nReturns true if the given element is in the given array, otherwise false.\n\n```js\nconst animals = ['dog', 'cat', 'ferret', 'hamster']\nconst hasCat = includes('cat')\nconst hasUnicorn = includes('unicorn')\n\nhasCat(animals) // true\nhasUnicorn(animals) // false\n```\n\u003e See [Array.includes (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes)\n\n### indexOf :: `(a, Int) -\u003e [a] -\u003e Int` | `(a) -\u003e [a] -\u003e Int`\nReturns the index of the given element if it is in the given array, otherwise -1.\nThe 2nd parameter can be used to change where it starts looking.\n\n```js\nindexOf(3)([1, 2, 3, 4, 5]) // =\u003e 2\nindexOf(3, 3)([[1, 2, 3, 4, 5, 3]) // =\u003e 3\n```\n\u003e See [Array.indexOf (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)\n\n### join :: `String -\u003e [a] -\u003e String`\nConverts each element of the array to a string and concatenates them together with the given string as a delimiter.\n\n```js\njoin('-')([1, 2, 3]) // =\u003e '1-2-3'\n```\n\u003e See [Array.join (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join)\n\n### keys :: `[a] -\u003e [Int]`\nReturn an iterator over keys from the array.\n\n```js\nconst iterator = keys([1, 2, 3, 4, 5])\niterator.next() // =\u003e { value: 0, done: false }\n```\n\u003e See [Array.keys (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/keys)\n\n### lastIndexOf :: `(a, Int) -\u003e [a] -\u003e Int` | `(a) -\u003e [a] -\u003e Int`\nWorks like indexOf but starts at the end and works backwards.\nThe 2nd parameter can be used to tell it where to start working backwards from.\n\n```js\nlastIndexOf(1)([1, 2, 3, 1]) // =\u003e 3\nlastIndexOf(1, -2)([1, 2, 3, 1]) // =\u003e 0\n```\n\u003e See [Array.lastIndexOf (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/lastIndexOf)\n\n### map :: `(a -\u003e b) -\u003e [a] -\u003e [b]`\nApplies a function over each element in the given array, returning a new array with each function call's results.\n\n```js\nmap(x =\u003e x * 2)([1, 2, 3]) // =\u003e 2, 4, 6\n```\n\u003e See [Array.map (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)\n\n### pop :: `[a] -\u003e [a]`\nReturns a new array without the last item\n\n```js\npop([1, 2, 3, 4, 5]) // =\u003e [1, 2, 3, 4]\n```\n\u003e See [Array.pop (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/pop)\n\n### push :: `a -\u003e [a] -\u003e [a]`\nReturns a new array with the new element appended to the end of the original array.\n\n```js\npush(5)([1, 2, 3, 4]) // =\u003e [1, 2, 3, 4, 5]\n```\n\u003e See [Array.push (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push)\n\n### reduce :: `((a, b) -\u003e a) -\u003e a -\u003e [b] -\u003e a`\nApplies a function against an accumulator and each value of the array (from left-to-right), then returning the accumulator.\n\n```js\nconst sum = reduce((acc, val) =\u003e acc + val, 99)\nsum([2, 3, 4]) // =\u003e 108\n```\n\u003e See [Array.reduce (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)\n\n### reduceRight :: `((a, b) -\u003e a) -\u003e a -\u003e [b] -\u003e a`\nApplies a function against an accumulator and each value of the array (from right-to-left), then returning the accumulator.\n\n```js\nconst sum = reduceRight((acc, val) =\u003e acc + val, 99)\nsum([2, 3, 4]) // =\u003e 90\n```\n\u003e See [Array.reduceRight (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight)\n\n### reverse ::  `[a] -\u003e [a]`\nReturns a new array with the elements in reverse order.\n\n```js\nreverse([1, 2, 3, 4, 5]) // =\u003e [5, 4, 3, 2, 1]\n```\n\u003e See [Array.reverse (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse)\n\n### shift :: `[a] -\u003e [a]`\nReturns a new array with the first element removed.\n\n```js\nshift([1, 2, 3, 4, 5]) // =\u003e [2, 3, 4, 5]\n```\n\u003e See [Array.shift (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift)\n\n### slice :: `(int, int) -\u003e [a] -\u003e [a]`\nTakes a slice from a given array and returns it as a new array.\n\n```js\nconst removeFirst = slice(1)\nremoveFirst([2, 3, 4]) // =\u003e [3, 4]\n```\n\u003e See [Array.slice (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice)\n\n### splice :: `(int, int, [a]) -\u003e [a] -\u003e [a]`\nReturns a new array with the indicated elements removed. An optional set of new elements can be inserted in their place.\n```js\nconst takeTwo = splice(2)\ntakeTwo([1, 2, 3, 4, 5]) // =\u003e [1, 2]\n\n```\n\u003e See [Array.splice (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)\n\n### some :: `(a -\u003e Boolean) -\u003e [a] -\u003e Boolean`\nReturns true if any element in the given array matches the given predicate.\n\n```js\nconst lessThanFour = some(x =\u003e x \u003c 4)\nlessThanFour([1, 2, 3, 4, 5]) // =\u003e true\n```\n\u003e See [Array.some (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some)\n\n### sort :: `((a, a) -\u003e int) -\u003e [a] -\u003e [a]`\nReturns a copy of the original array with the values sorted. If a comparator function is provided it should return -1, 0 or 1 depending on whether the first element is less than, equal to or greater than the second, respectively. If no comparator is given, lexical sorting is used.\n\n```js\nconst numComp = (a, b) =\u003e (a \u003c b) ? -1 : (a === b) ? 0 : 1\nconst sortBy = sort(numComp)\nsortBy([20, 1, 3, 4, 2]) // =\u003e [1, 2, 3, 4, 20]\n```\n\u003e See [Array.sort (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)\n\n### toLocaleString :: `(String, Obj) -\u003e [a] -\u003e String`\nConverts each element of an array into a string based on current locale settings or locale options passed in. The resulting strings are appended together using commas.\n\n```js\nconst toYen = toLocaleString('ja-JP', { style: 'currency', currency: 'JPY' })\ntoYen([\"￥7\", 500, 8123, 12]) // =\u003e ￥7,500,8,123,12\n```\n\u003e See [Array.toLocaleString (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/toLocaleString)\n\n### toString :: `[a] -\u003e String`\nConverts each element of an array into a string and appends them together with a comma.\n\n```js\ntoString([1, 2, 3, 4, 5]) // =\u003e '1,2,3,4,5'\n```\n\u003e See [Array.toString (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/toString)\n\n### unshift :: `a -\u003e [a] -\u003e [a]`\nReturns a new copy of an array with the given element added to the front.\n\n```js\nconst addOne = unshift(1)\naddOne([2, 3]) // =\u003e [1, 2, 3]\n```\n\u003e See [Array.unshift (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/unshift)\n\n## Where are ...?\n- `length` - This is a property, not a method, so it doesn't really belong here.\n- `forEach` - This is inherently side-effect-y, it adds nothing that can't be done with `filter`, `map` and `reduce`.\n\nIf you don't agree with anything above that's great! Just log an issue so we can discuss.\n\n---\n## pstring\n---\n### charAt :: `Int -\u003e String -\u003e String`\nReturns the character at the given position in the string.\n\n```js\ncharAt(2)(\"123\")) //=\u003e \"3\"\n```\n\u003e See [String.charAt (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charAt)\n### charCodeAt :: `Int -\u003e String -\u003e Int`\nReturns the character code at the given position in the string.\n\n```js\ncharAt(2)(\"123\")) //=\u003e 51\n\n```\n\u003e See [String.charCodeAt (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt)\n### codePointAt :: `Int -\u003e String -\u003e Int`\nReturns the unicode code point at the given index.\n\n```js\ncodePointAt(0)(\"\\uD800\\uDC00\")) //=\u003e 65536\n```\n\u003e See [String.codePointAt (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt)\n### concat :: `(String, ...String) -\u003e String -\u003e String`\nReturns a new string combining the given strings. Multiple strings can be passed to the initial call.\n\n```js\nconst stringOne = \"123\"\nconst addTwo = concat(\"45\", \"67\")\nconst result = addTwo(stringOne) //result = \"1234567\"\n```\n\u003e See [String.concat (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/concat)\n### endsWith :: `String -\u003e String -\u003e Boolean` | `(String, Int) -\u003e String -\u003e String`\nReturns true if the second string ends with the characters in the first. If the integer parameter is passed, the second string is considered to be only that long (or the length of the second string itself whichever is shorter)\n\n```js\nendsWith(\"bc\")(\"abc\")    //=\u003e true\nendsWith(\"bc\", 2)(\"abc\") //=\u003e false\nendsWith(\"bc\")(\"abcd\")   //=\u003e false\n```\n\u003e See [String.endsWidth (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWidth)\n### includes :: `String -\u003e String -\u003e Boolean` | `(String, Int) -\u003e String -\u003e Boolean`\nReturns true if the characters from the first string appear together as a substring in the second. If the integer is provided it indicates where to start searching in the second string.\n\n```js\nincludes(\"not to be,\")(\"To be, or not to be, that is the question.\")  //=\u003e true\nincludes(\"not to be,\", 20)(\"To be, or not to be, that is the question.\")  //=\u003e false\nincludes(\"nonexistent\")(\"To be, or not to be, that is the question.\") //=\u003e false\n```\n\u003e See [String.includes (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes)\n### indexOf :: `String -\u003e String -\u003e Int` | `(String, Int) -\u003e String -\u003e Int`\nReturns the first index where the second string appears as a substring of the first. Optionally you can provide a starting index and the search will start there. If the first string is not found it returns -1\n\n```js\nindexOf(\"a\")(\"abc\") //=\u003e 0\nindexOf(\"b\")(\"abc\") //=\u003e 1\nindexOf(\"c\")(\"abc\") //=\u003e 2\nindexOf(\"z\")(\"abc\") //=\u003e -1\n```\n\u003e See [String.indexOf (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf)\n### lastIndexOf :: `String -\u003e String -\u003e Int` | `(String, Int) -\u003e String -\u003e Int`\nWorks like index of but starting at the end and working forward.\n\n```js\nlastIndexOf(\"a\")(\"abc\") //=\u003e 0\nlastIndexOf(\"b\")(\"abc\") //=\u003e 1\nlastIndexOf(\"c\")(\"abc\") //=\u003e 2\nlastIndexOf(\"z\")(\"abc\") //=\u003e -1\n```\n\u003e See [String.lastIndexOf (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/lastIndexOf)\n### localeCompare :: `String -\u003e String -\u003e Int` | `(String, String) -\u003e String -\u003e Int` | `(String, String, Object) -\u003e String -\u003e Int`\nCompares two strings taking the locale into account. The return value will be negative if the second string comes before the first. Positive if it comes later. And zero if they are equal. The additional, optional parameters allow a locale and other options to be specified.\n\n```js\nlocaleCompare(\"b\")(\"a\")                                //=\u003e \u003c0\nlocaleCompare(\"a\")(\"b\")                                //=\u003e \u003e0\nlocaleCompare(\"a\")(\"a\")                                //=\u003e 0\nlocaleCompare('a', 'de', { sensitivity: 'base' })('ä') //=\u003e 0\n```\n\u003e See [String.localeCompare (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare)\n### match :: `Regexp -\u003e String -\u003e [String]`\nReturns an array of strings for the value matched by the regular expression as well as all matching groups defined therein.\n\n```js\nconst str = 'For more information, see Chapter 3.4.5.1'\nconst re = /see (chapter \\d+(\\.\\d)*)/i\nmatch(re)(str)  //=\u003e [\"see Chapter 3.4.5.1\", \"Chapter 3.4.5.1\", \".1\"]\n```\n\u003e See [String.match (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match)\n### normalize :: `String -\u003e String`\nReturns the Unicode Normalization Form of a string.\n\n```js\nnormalize('NFKC')('\\u1E9B\\u0323') //=\u003e '\\u1E69'\n```\n\u003e See [String.normalize (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize)\n### repeat :: `Int -\u003e String -\u003e String`\nReturns string comprised of the given number of repeats of the given string.\n\n```js\nrepeat(2)('abc') //=\u003e 'abcabc'\n```\n\u003e See [String.repeat (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat)\n### replace :: `(Regexp, String) -\u003e String -\u003e String`\nReplaces all locations in the second string that match the given regular expression with the value in the first string. Back references in the first string will be filled appropriately.\n\n```js\nreplace(/xmas/i, 'Christmas')('Twas the night before Xmas...')) //=\u003e 'Twas the night before Christmas...'\n```\n\u003e See [String.replace (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace)\n### search :: `Regexp -\u003e String -\u003e String`\nReturns the first position where given regular expression matches in the second string. If it doesn't match, -1 is returned.\n\n```js\nsearch(/xmas/i)('Twas the night before Xmas...')) //=\u003e 22\n```\n\u003e See [String.search (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/search)\n### slice :: `Int -\u003e String -\u003e String` | `(Int, Int) -\u003e String -\u003e String`\nReturns a substring of the second string defined by the given index and optional end index. Either may be negative to count from the end of the string.\n\n```js\nslice(4, -2)('Twas the night before Xmas...') //=\u003e ' the night before Xmas.'\n```\n\u003e See [String.slice (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice)\n### split :: `String -\u003e String -\u003e [String]` | `(String, Int) -\u003e String -\u003e [String]`\nSplits a string into an array of substrings that are separated by the first string given. If the integer parameter is provided the split will stop at the given limit.\n\n```js\nsplit(',')(\"1,2\")         //=\u003e ['1', '2']\nsplit(',', 2)(\"1,2,3,4\")  //=\u003e ['1', '2']\n```\n\u003e See [String.split (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split)\n### startsWith :: `String -\u003e String -\u003e Boolean` | `(String, Int) -\u003e String -\u003e Boolean`\nReturns true if the second string starts with the characters in the first. If the integer parameter is passed, the second string is considered to start at that position\n\n```js\nstartsWith(\"ab\")(\"abc\")    //=\u003e true\nstartsWith(\"bc\")(\"abcd\")   //=\u003e false\n```\n\u003e See [String.startsWith (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith)\n### substr :: `Int -\u003e String` | `(Int, Int) -\u003e String`\nReturns the characters in a string beginning at the specified location through the specified number of characters.\n\n```js\nsubstr(2)(\"abcde\")     //=\u003e 'cde'\nsubstr(2, 2)(\"abcde\")  //=\u003e 'cd'\n```\n\u003e See [String.substr (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr)\n### substring :: `Int -\u003e String` | `(Int, Int) -\u003e String`\nReturns a subset of a string between one index and another, or through the end of the string.\n\n```js\nsubstring(2)(\"abcde\")    //=\u003e 'cde'\nsubstring(2, 4)(\"abcde\") //=\u003e 'cd'\n```\n\u003e See [String.substring (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substring)\n### toLocaleLowerCase :: `String -\u003e String`\nReturns the primitive value of a string.\n\n```js\n\n```\n\u003e See [String.toLocaleLowerCase (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase)\n### toLocaleUpperCase :: `String -\u003e String`\nReturns the calling string value converted to lower case, according to any locale-specific case mappings.\n\n```js\ntoLocaleLowerCase(\"ABC\") //=\u003e 'abc'\n```\n\u003e See [String.toLocaleUpperCase (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleUpperCase)\n### toLowerCase :: `String -\u003e String`\nReturns the primitive value of a string.\n\n```js\ntoLocaleLowerCase(\"ABC\") //=\u003e 'abc'\n```\n\u003e See [String.toLowerCase (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLowerCase)\n### toString :: `String -\u003e String`\nReturns the calling string value converted to upper case, according to any locale-specific case mappings.\n\n```js\ntoLocaleUpperCase(\"abc\") //=\u003e 'ABC'\n```\n\u003e See [String.toString (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toString)\n### toUpperCase :: `String -\u003e String`\nReturns the calling string value converted to upper case.\n\n```js\ntoUpperCase(\"abc\") //=\u003e 'ABC'\n```\n\u003e See [String.toUpperCase (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toUpperCase)\n### trim :: `String -\u003e String`\n Removes whitespace from both ends of a string. Whitespace in this context is all the whitespace characters (space, tab, no-break space, etc.) and all the line terminator characters (LF, CR, etc.).\n\n```js\ntrim(\" abc \") //=\u003e 'abc'\n```\n\u003e See [String.trim (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim)\n### trimLeft :: `String -\u003e String`\nRemoves whitespace from the left end of a string. Whitespace in this context is all the whitespace characters (space, tab, no-break space, etc.) and all the line terminator characters (LF, CR, etc.).\n\n```js\ntrimLeft(\" abc \") //=\u003e 'abc '\n```\n\u003e See [String.trimLeft (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trimLeft)\n### trimRight :: `String -\u003e String`\nRemoves whitespace from the left end of a string. Whitespace in this context is all the whitespace characters (space, tab, no-break space, etc.) and all the line terminator characters (LF, CR, etc.).\n\n```js\ntrimRight(\" abc \") //=\u003e ' abc'\n```\n\u003e See [String.trimRight (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trimRight)\n### valueOf :: `String -\u003e String`\nReturns the primitive value of a string.\n\n```js\nvalueOf(\"abc\") //=\u003e 'abc'\n```\n\u003e See [String.valueOf (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/valueOf)\n","funding_links":[],"categories":["Libraries"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrainyard%2Fpico-lambda","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftrainyard%2Fpico-lambda","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrainyard%2Fpico-lambda/lists"}