[
  {
    "path": ".commitlintrc.json",
    "content": "{\n    \"extends\": [\"@commitlint/config-conventional\"]\n}"
  },
  {
    "path": ".eslintrc.json",
    "content": "{ // https://github.com/Microsoft/vscode-eslint/issues/284\n    \"parser\": \"@typescript-eslint/parser\",\n    \"extends\": [\"eslint:recommended\"],\n    \"plugins\": [\"react\", \"fp\"],\n    \"env\": {\n        \"browser\": true,\n        \"es6\": true,\n        \"commonjs\": true\n    },\n    \"globals\": {\n        \"__dirname\": false\n    },\n    \"parserOptions\": {\n        \"jsx\": true,\n        \"ecmaFeatures\": {\n            \"jsx\": true\n        },\n        \"ecmaVersion\": 2018,\n        \"sourceType\": \"module\"\n    },\n    \"rules\": {\n        // code features\n        \"array-callback-return\"       : [\"error\"],\n        \"arrow-parens\"                : [\"error\"],\n        \"arrow-spacing\"               : [\"error\"],\n        \"curly\"                       : [\"error\", \"multi-or-nest\"],\n        \"default-case\"                : [\"error\"],\n        \"dot-location\"                : [\"error\"],\n        \"eqeqeq\"                      : [\"warn\"],\n        \"generator-star-spacing\"      : [\"error\"],\n        \"no-caller\"                   : [\"error\"],\n        \"no-console\"                  : [\"off\"],\n        \"no-div-regex\"                : [\"error\"],\n        \"no-else-return\"              : [\"error\"],\n        \"no-extend-native\"            : [\"error\"],\n        \"no-floating-decimal\"         : [\"error\"],\n        // \"no-implicit-coercion\"        : [\"error\"],\n        \"no-implicit-globals\"         : [\"error\"],\n        \"no-implied-eval\"             : [\"error\"],\n        \"no-invalid-this\"             : [\"error\"],\n        \"no-labels\"                   : [\"error\"],\n        \"no-new-wrappers\"             : [\"error\"],\n        \"no-proto\"                    : [\"error\"],\n        \"no-return-assign\"            : [\"error\"],\n        \"no-return-await\"             : [\"error\"],\n        \"no-self-compare\"             : [\"error\"],\n        \"no-sequences\"                : [\"error\"],\n        \"no-unmodified-loop-condition\": [\"warn\"],\n        \"no-undef\"                    : [\"off\"],\n        \"no-unused-vars\"              : [\"off\"],\n        \"no-useless-call\"             : [\"error\"],\n        \"no-useless-catch\"            : [\"error\"],\n        \"no-useless-concat\"           : [\"error\"],\n        \"no-useless-return\"           : [\"error\"],\n        \"no-var\"                      : [\"error\"],\n        \"no-with\"                     : [\"error\"],\n        // \"object-shorthand\"            : [\"warn\"],\n        \"prefer-arrow-callback\"       : [\"error\"],\n        \"prefer-rest-params\"          : [\"error\"],\n        \"prefer-spread\"               : [\"error\"],\n        \"prefer-template\"             : [\"error\"],\n        \"require-await\"               : [\"warn\"],\n        \"require-unicode-regexp\"      : [\"error\"],\n        \"rest-spread-spacing\"         : [\"error\"],\n        \"symbol-description\"          : [\"error\"],\n        \"template-curly-spacing\"      : [\"error\"],\n        \"yield-star-spacing\"          : [\"error\", \"before\"],\n        \"yoda\"                        : [\"error\"],\n        // code style\n        \"array-bracket-newline\"        : [\"error\", \"consistent\"],\n        \"array-bracket-spacing\"        : [\"error\"],\n        \"block-spacing\"                : [\"error\", \"never\"],\n        \"brace-style\"                  : [\"error\", \"1tbs\", {\"allowSingleLine\": true}],\n        \"comma-dangle\"                 : [\"error\", \"always-multiline\"],\n        \"comma-spacing\"                : [\"error\", {\"before\": false, \"after\": true}],\n        \"computed-property-spacing\"    : [\"error\"],\n        \"eol-last\"                     : [\"error\"],\n        \"func-call-spacing\"            : [\"error\"],\n        \"indent\"                       : [\"error\", 4, {\"MemberExpression\": 0}],\n        \"key-spacing\"                  : [\"error\", {\"align\": \"colon\"}],\n        \"keyword-spacing\"              : [\"error\"],\n        \"linebreak-style\"              : [\"error\"],\n        \"new-cap\"                      : [\"error\", {\"capIsNew\": false}],\n        \"no-array-constructor\"         : [\"error\"],\n        \"no-multi-assign\"              : [\"error\"],\n        \"no-nested-ternary\"            : [\"error\"],\n        \"no-whitespace-before-property\": [\"error\"],\n        \"object-curly-newline\"         : [\"error\"],\n        \"object-curly-spacing\"         : [\"error\"],\n        \"prefer-object-spread\"         : [\"error\"],\n        \"quotes\"                       : [\"error\", \"single\"],\n        \"semi\"                         : [\"error\", \"never\"],\n        \"no-trailing-spaces\"           : [\"error\"]\n        // \"multiline-comment-style\"      : [\"error\", \"starred-block\"]\n    }\n}"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "* @millsp"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: millsp\ncustom: https://www.buymeacoffee.com/millsp\npatreon: millsp\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/---bug-report.md",
    "content": "---\nname: \"🐞 Bug Report\"\nabout: \"Something isn't working well 💔\"\n\n---\n\n## 🐞 Bug Report\n\n#### Describe the bug\n<!-- A clear and concise description of what the bug is. -->\n\n#### Reproduce the bug\n```ts\n// REPL or a link to your repository if applicable.\n// A *self-contained* demonstration of the problem.\n```\n\n#### Expected behavior\n<!-- A clear & concise description of what you expected to happen. -->\n\n#### Possible Solution\n<!-- Only if you have suggestions on a fix for the bug. -->\n\n#### Screenshots\n<!-- If applicable, add screenshots to help explaining. -->\n\n#### Additional context\n<!-- Add any other context about the problem here (version, environment, tools...). -->\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/---feature-request.md",
    "content": "---\nname: \"🍩 Feature Request\"\nabout: \"Suggest an idea for this project 💡\"\n\n---\n\n## 🍩 Feature Request\n\n#### Is your feature request related to a problem?\n<!-- A clear & concise description of what the problem is. (e.g. I have an issue when [...]). -->\n\n#### Describe the solution you'd like\n<!-- A clear & concise description of what you want to happen. Add any considered drawbacks. -->\n\n#### Describe alternatives you've considered\n<!-- A clear & concise description of any alternative solutions or features you've considered. -->\n\n#### Teachability, Documentation, Adoption, Migration Strategy\n<!-- If you can, explain how users will be able to use this and possibly write out a\nversion of the docs.\n\nMaybe a screenshot or design? -->\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "## 🎁 Pull Request\n\n<!-- Fill the following checklist. -->\n* [ ] Used a clear / meaningful title for this pull request\n* [ ] Tested the changes in your own code (on your projects)\n* [ ] Added / Edited tests to reflect changes (`tests` folder)\n* [ ] Have read the **Contributing** part of the **Readme**\n* [ ] Passed `npm test`\n\n<!-- Complete the following parts. -->\n\n#### Fixes\n<!-- List the issues that this fixes. -->\n\n#### Why have you made changes?\n<!-- A clear & concise explanation. -->\n\n#### What changes have you made?\n* changed this to achieve this\n* changed that to achieve this\n* ...\n\n#### What tests have you updated?\n* tested this in `tests/...`\n* tested that in `tests/...`\n* ...\n\n#### Is there any breaking changes?\n<!-- Fill the following checklist. -->\n* [ ] Yes, I changed the public API & documented it\n* [ ] Yes, I changed existing tests\n* [ ] No,  I added to the public API & documented it\n* [ ] No,  I added to the existing tests\n* [ ] I don't know\n\n#### Anything else worth mentioning?\n<!-- Please help with the PR process. -->\n<!-- Leave any extra useful information. -->\n<!-- Or mention someone who is concerned. -->\n"
  },
  {
    "path": ".github/stale.yml",
    "content": "# Number of days of inactivity before an issue becomes stale\ndaysUntilStale: 60\n# Number of days of inactivity before a stale issue is closed\ndaysUntilClose: 7\n# Issues with these labels will never be considered stale\nexemptLabels:\n  - pinned #todo\n  - security\n# Label to use when marking an issue as stale\nstaleLabel: wontfix\n# Comment to post when marking an issue as stale. Set to `false` to disable\nmarkComment: >\n  This issue has been automatically marked as stale because it has not had\n  recent activity. It will be closed if no further activity occurs. Thank you\n  for your contributions.\n# Comment to post when closing a stale issue. Set to `false` to disable\ncloseComment: false\n"
  },
  {
    "path": ".gitignore",
    "content": "package-lock.json\nnode_modules\n.vscode\n*.tgz\ndocs\nout\ndt"
  },
  {
    "path": ".huskyrc.json",
    "content": "{\n    \"hooks\": {\n        \"commit-msg\": \"commitlint -E HUSKY_GIT_PARAMS\"\n    }\n}"
  },
  {
    "path": ".travis.yml",
    "content": "# https://docs.travis-ci.com/user/job-lifecycle\n\nlanguage: node_js\n\nnode_js:\n- '12.0'\n\ngit:\n  depth: 5\n\ninstall:\n- npm install --only=dev\n\nenv:\n  - DEPLOY=true\n\nstages:\n  - test\n  - deploy:master\n  - deploy:branch\n  - deploy:docs\n\njobs:\n  include:\n    - stage: test\n      if: tag IS blank # filter double build with tags\n      script:\n        - npm run test \n      deploy:\n        edge: true\n        provider: npm\n        email: $NPM_EMAIL\n        api_key: $NPM_TOKEN\n        skip_cleanup: true\n        tag: test\n        on:\n          all_branches: true\n      before_deploy: # https://github.com/travis-ci/travis-ci/issues/1574#issuecomment-451787844\n        - if ! npm run ci:test:bd; then travis_terminate 1; fi\n      after_deploy: # the above link explains how to make the build fail if something went wrong\n        - if ! npm run ci:test:ad; then travis_terminate 1; fi\n\n    - stage: deploy:master\n      if: tag IS blank AND branch = master AND fork = false AND env(DEPLOY) = true\n      deploy:\n        edge: true\n        provider: npm\n        email: $NPM_EMAIL\n        api_key: $NPM_TOKEN\n        tag: latest\n        skip_cleanup: true\n        on:\n          all_branches: true\n      before_deploy:\n        - if ! npm run ci:master:bd; then travis_terminate 1; fi\n      after_deploy:\n        - if ! npm run ci:master:ad; then travis_terminate 1; fi\n  \n    - stage: deploy:branch\n      if: tag IS blank AND branch != master AND fork = false AND env(DEPLOY) = true\n      deploy:\n        edge: true\n        provider: npm\n        email: $NPM_EMAIL\n        api_key: $NPM_TOKEN\n        tag: $TRAVIS_BRANCH\n        skip_cleanup: true\n        on:\n          all_branches: true\n      before_deploy:\n        - if ! npm run ci:branch:bd; then travis_terminate 1; fi\n      after_deploy:\n        - if ! npm run ci:branch:ad; then travis_terminate 1; fi\n\n    - stage: deploy:docs #deploys doc to gh-pages branch\n      if: tag IS blank AND branch = master AND fork = false AND env(DEPLOY) = true\n      deploy:\n        edge: true\n        provider: pages\n        skip_cleanup: true\n        github_token: $GH_TOKEN\n        local_dir: \"docs\"\n        keep_history: true\n        on:\n          all_branches: true\n      before_deploy:\n        - if ! npm run ci:docs:bd; then travis_terminate 1; fi\n      after_deploy:\n        - if ! npm run ci:docs:ad; then travis_terminate 1; fi\n"
  },
  {
    "path": ".versionrc.json",
    "content": "{\n    \"types\": [\n        {\"type\": \"feat\", \"section\": \"Features\"},\n        {\"type\": \"fix\", \"section\": \"Bug Fixes\"},\n        {\"type\": \"build\", \"section\": \"Others\"},\n        {\"type\": \"ci\", \"section\": \"Others\"},\n        {\"type\": \"chore\", \"section\": \"Others\"},\n        {\"type\": \"docs\", \"section\": \"Others\"},\n        {\"type\": \"perf\", \"section\": \"Others\"},\n        {\"type\": \"refactor\", \"section\": \"Others\"},\n        {\"type\": \"revert\", \"section\": \"Others\"},\n        {\"type\": \"style\", \"section\": \"Others\"},\n        {\"type\": \"test\", \"section\": \"Others\"}\n    ]\n}"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog\n\nAll notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.\n\n## [9.6.0](https://github.com/millsp/ts-toolbelt/compare/v9.5.1...v9.6.0) (2021-03-10)\n\n\n### Features\n\n* **paths:** parameter for AutoPath delimiter ([6d5bbdc](https://github.com/millsp/ts-toolbelt/commit/6d5bbdc834ce15dd3339d101c828457b1a34cce4))\n\n\n### Bug Fixes\n\n* **f.autopath:** distribute ([29eddd9](https://github.com/millsp/ts-toolbelt/commit/29eddd99c6826696941c50681ce4858243786110))\n* **f.autopath:** do not show primitive props ([1ad2638](https://github.com/millsp/ts-toolbelt/commit/1ad26389aa6a9a795d19d90d2724c73ae2bd51d9))\n* **f.autopath:** no primitve paths ([2bdb477](https://github.com/millsp/ts-toolbelt/commit/2bdb4778325288154c8f71c0a5ae4a1b7e2b217f))\n* **f.narrow:** fix variance and array inference ([4c7618d](https://github.com/millsp/ts-toolbelt/commit/4c7618d77b07d6b8c6dfd5087aa85a073bf57db3))\n* **f.narrow:** higher order function support ([dad05ee](https://github.com/millsp/ts-toolbelt/commit/dad05eec6e6710ea4f63063658a3dee4d9c0ca28))\n* **f.narrow:** preserve fns and better display ([a0d62d8](https://github.com/millsp/ts-toolbelt/commit/a0d62d8cfcd28eab7132c225ba187556ca749b4d))\n* **f.narrow:** preserve functions ([c34f1b9](https://github.com/millsp/ts-toolbelt/commit/c34f1b95d0e0855203104eb696cfcb8221a65374))\n* **f.narrow:** revert variance fixes ([12e014a](https://github.com/millsp/ts-toolbelt/commit/12e014a3f3d34047a3722486a73493f857a3697a))\n* **f.narrow:** variance ([866ecd7](https://github.com/millsp/ts-toolbelt/commit/866ecd76744fc38244d85e7ef7b4bb90105cf7eb))\n* **fn:** allow for curried in compose ([2bc5604](https://github.com/millsp/ts-toolbelt/commit/2bc560446916b423977c25e396b4f1f310b6c03f))\n* **o.paths:** dive within arrays and deeper ([626beb6](https://github.com/millsp/ts-toolbelt/commit/626beb61b3100c5e4fd699c946e0e2fed7e24cb6))\n\n\n### Others\n\n* **list:** more flexible keys ([d9415b2](https://github.com/millsp/ts-toolbelt/commit/d9415b2f85633c7c74a815c9909899114faf530c))\n* **o.p:** re-implement ([0f44362](https://github.com/millsp/ts-toolbelt/commit/0f443626dc3b114b6784d2053510a1e0c2f7f839))\n* **release:** 9.5.10 ([1f3928a](https://github.com/millsp/ts-toolbelt/commit/1f3928a70ff2a7e903a5398b53295c9c9997b42c))\n* **release:** 9.5.11 ([bde9210](https://github.com/millsp/ts-toolbelt/commit/bde9210d0a361ddb1e03920a0c2bd42dad17ee30))\n* **release:** 9.5.12 ([80579e1](https://github.com/millsp/ts-toolbelt/commit/80579e1eaa17b2d1c61bd7881d0ea6ff94753141))\n* **release:** 9.5.13 ([277a6e2](https://github.com/millsp/ts-toolbelt/commit/277a6e2ac5ca8be2bbcd7593d987aaac3ea9bb75))\n* **release:** 9.5.2 ([ec4a953](https://github.com/millsp/ts-toolbelt/commit/ec4a953cabe6c4d704c0dca5f37d1dc630de047b))\n* **release:** 9.5.3 ([0836f6e](https://github.com/millsp/ts-toolbelt/commit/0836f6e8187287a0c86f249e4e552d68a44e4f60))\n* **release:** 9.5.4 ([855855e](https://github.com/millsp/ts-toolbelt/commit/855855e520ed4a04059f9d61884d2045dd0d751b))\n* **release:** 9.5.5 ([e28bddf](https://github.com/millsp/ts-toolbelt/commit/e28bddf33066850a764e2ba344883ff84da561b9))\n* **release:** 9.5.6 ([b8e0d0a](https://github.com/millsp/ts-toolbelt/commit/b8e0d0a83228baf666e00f4fdb0d99ca936c133f))\n* **release:** 9.5.7 ([5646455](https://github.com/millsp/ts-toolbelt/commit/564645547862c7d698f4a03b15ccb7a5ffb5fc29))\n* **release:** 9.5.8 ([bceb8be](https://github.com/millsp/ts-toolbelt/commit/bceb8be67701f9c7aba9608aed851567e8118ca5))\n* **release:** 9.5.9 ([533a6ac](https://github.com/millsp/ts-toolbelt/commit/533a6ac0f7b713933c94f0962166c7a0245b055e))\n* **release:** 9.6.0 ([5e6d008](https://github.com/millsp/ts-toolbelt/commit/5e6d008888c1705e41bf752b3a308323a5c563fe))\n* **string:** instantiation limiters ([9a678d8](https://github.com/millsp/ts-toolbelt/commit/9a678d8a400c97436d428dad05405abb154af958))\n* **update:** remove dirty code ([9d0ff64](https://github.com/millsp/ts-toolbelt/commit/9d0ff6441518c2c9a01cea7726c08acd19eb37d9))\n* cleanup ([6f23f2e](https://github.com/millsp/ts-toolbelt/commit/6f23f2ec79145a0545eb45d15d50d0363a119b12))\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to make participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, sex characteristics, gender identity and expression,\nlevel of experience, education, socio-economic status, nationality, personal\nappearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or\n  advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic\n  address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or\nreject comments, commits, code, wiki edits, issues, and other contributions\nthat are not aligned to this Code of Conduct, or to ban temporarily or\npermanently any contributor for other behaviors that they deem inappropriate,\nthreatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies within all project spaces, and it also applies when\nan individual is representing the project or its community in public spaces.\nExamples of representing a project or community include using an official\nproject e-mail address, posting via an official social media account, or acting\nas an appointed representative at an online or offline event. Representation of\na project may be further defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the project team at [gitter.im/millsp](https://gitter.im/millsp). All\ncomplaints will be reviewed and investigated and will result in a response that\nis deemed necessary and appropriate to the circumstances. The project team is\nobligated to maintain confidentiality with regard to the reporter of an incident.\nFurther details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,\navailable at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see\nhttps://www.contributor-covenant.org/faq\n\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**. There are many ways to contribute to the project:\n\n### Community\n\n* [Help the community with answers on Gitter](https://gitter.im/ts-toolbelt/community?utm_source=share-link&utm_medium=link&utm_campaign=share-link)\n* [Reporting bugs or requesting new features](https://github.com/millsp/ts-toolbelt/issues/new/choose)\n\n### Codebase\n\n* Improving existing documentation \n* Adding new types to the collection\n* [Getting involved with things to do](#-whats-next)\n\n### Pull Requests\n\n1. [Read the tutorial](https://medium.com/free-code-camp/typescript-curry-ramda-types-f747e99744ab)\n\n2. Fork the project\n\n3. Clone your fork\n\n4. Create a pr/**feature** branch\n\n   ```sh\n   git checkout -b pr/CoolFeature\n   ```\n   \n5. Commit your changes\n\n   You **must** follow the [conventional commit](https://conventionalcommits.org) to be able to commit\n   ```sh\n   git commit -m \"feat(name): Added this CoolFeature\"\n   ```\n\n6. [Run the tests](#-running-tests)\n\n7. Push your changes\n\n   ```sh\n   npm run release -- --no-tags\n   ```\n\n8. Open a pull request\n"
  },
  {
    "path": "LICENSE",
    "content": "                              Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2019 Pierre-Antoine Mills\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License."
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\">\n  <a href=\"https://github.com/millsp/ts-toolbelt\">\n    <img alt=\"banner\" title=\"ts-toolbelt\" src=\"https://raw.githubusercontent.com/millsp/ts-toolbelt/master/.github/banner.svg\">\n  </a>\n  <h4 align=\"center\">TypeScript's largest utility library</h4>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.com/package/ts-toolbelt\" >\n    <img src=\"https://img.shields.io/npm/v/ts-toolbelt.svg\">\n  </a>\n  <a href=\"#\">\n    <img src=\"https://img.shields.io/npm/dm/ts-toolbelt.svg\">\n  </a>\n  <a href=\"#\">\n    <img src=\"http://isitmaintained.com/badge/resolution/millsp/ts-toolbelt.svg\"/>\n  </a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://gitter.im/ts-toolbelt/community?utm_source=share-link&utm_medium=link&utm_campaign=share-link\" >\n    <img src=\"https://img.shields.io/gitter/room/ts-toolbelt/community.svg\">\n  </a>\n  <a href=\"http://makeapullrequest.com\" >\n    <img src=\"https://img.shields.io/badge/PRs-welcome-brightgreen.svg\">\n  </a>\n  <a href=\"https://conventionalcommits.org\" >\n    <img src=\"https://img.shields.io/badge/Conventional%20Commits-1.0.0-green.svg\">\n  </a>\n  <a href=\"https://github.com/millsp/ts-toolbelt/blob/master/CODE_OF_CONDUCT.md\" >\n    <img src=\"https://img.shields.io/badge/CoC-Contributor%20Covenant-green.svg\">\n  </a>\n  <a href=\"#\">\n    <img src=\"https://img.shields.io/npm/l/ts-toolbelt.svg\">\n  </a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://millsp.github.io/ts-toolbelt/\">📖 Documentation</a>\n  ·\n  <a href=\"https://github.com/millsp/ts-toolbelt/issues?utf8=✓&q=is%3Aissue+label%3Aannouncement+sort%3Acreated-desc+\">📣 Announcements</a>\n  ·\n  <a href=\"https://github.com/millsp/ts-toolbelt/issues/new?template=---bug-report.md\" alt=\"Bug Report\">🐞 Report Bug</a>\n  ·\n  <a href=\"https://github.com/millsp/ts-toolbelt/issues/new?template=---feature-request.md\" alt=\"Request Feature\">🍩 Request Feature</a>\n  ·\n  <a href=\"https://github.com/millsp/ts-toolbelt/discussions/new\" alt=\"Ask Questions\">🤔 Ask Questions</a>\n</p>\n\n## About\n\n**ts-toolbelt** is the largest, and most tested type library available right\nnow, featuring **+200 utilities**. Our type collection packages some of the most\nadvanced mapped types, conditional types, and recursive types on the market.\n\n**Spend less time, build stronger**. Benefit from a wide range of generic type\nfunctions to achieve better type safety. \n\nWe work just like lodash, or ramda, but applied to the type system. Our mission\nis to provide you with simple ways to compute, change, and create types. We\nabstract all those complex type checks away for you. We provide a simple,\nreusable, and standard API to help you get more done with TypeScript.\n\n**ts-toolbelt** is a well organized package that can help you perform advanced\noperations on object types, union types, as well as function, and literal types.\nIt is carefully and coherently designed for building robust, flexible, and\ntype-safe software.\n\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/s/ts-toolbelt-x4jly?file=/src/index.ts\">\n    <img alt=\"demo\" width=\"800\" title=\"ts-toolbelt\" src=\"https://raw.githubusercontent.com/millsp/ts-toolbelt/master/.github/demo.svg\">\n  </a>\n</p>\n\nWe are a community and a knowledge base. Everyone is welcome to ask questions\nabout types. If you are stuck or you misunderstand something, you came to the\nright place!. We welcome beginners and advanced developers to come take part.\n**Welcome!**\n\n## Getting Started\n\n### Prerequisites\n\n```sh\nnpm install typescript@^4.1.0 --save-dev\n```\n\nFor best results, add this to your `tsconfig.json`\n\n```ts\n{\n  \"compilerOptions\": {\n    // highly recommended (required by few utilities)\n    \"strictNullChecks\": true,\n\n    // this is optional, but enable whenever possible\n    \"strict\": true,\n\n    // this is the lowest supported standard library\n    \"lib\": [\"es2015\"],\n  }\n}\n```\n\n### Installation\n\n```sh\nnpm install ts-toolbelt --save\n```\n\n### Hello World\n\n```ts\nimport {Object} from \"ts-toolbelt\"\n// Check the docs below for more\n\n// Merge two `object` together\ntype merge = Object.Merge<{name: string}, {age?: number}>\n// {name: string, age?: number}\n\n// Make a field of an `object` optional\ntype optional = Object.Optional<{id: number, name: string}, \"name\">\n// {id: number, name?: string}\n```\n\nYou can [**level-up, and re-code this library from\nscratch**](https://medium.com/free-code-camp/typescript-curry-ramda-types-f747e99744ab).\n\n## [Documentation ⤢](https://millsp.github.io/ts-toolbelt/)\n\n### Imports\n\nThe project is organized around TypeScript's main concepts:\n\n| **Any**    | **Boolean** | **Class**    | **Function** | **Iteration** | **List** |\n|------------|-------------|--------------|--------------|---------------|----------|\n| **Number** | **Object**  | **Object.P** | **String**   | **Union**     | **Test** |\n\n> **`TIP`** How to choose categories? Match your type with them.\n\nThere are many ways to import the types into your project:\n\n* **Explicit**\n  ```ts\n  import {Any, Boolean, Class, Function, Iteration, List, Number, Object, String, Union} from \"ts-toolbelt\"\n  ```\n\n* **Compact**\n  ```ts\n  import {A, B, C, F, I, L, N, O, S, U} from \"ts-toolbelt\"\n  ```\n\n* **Portable**\n  ```ts\n  import tb from \"ts-toolbelt\"\n  ```\n\nYou can also import our non-official API from the community:\n  ```ts\n  import {Community} from \"ts-toolbelt\"\n  ```\n\n> **`TIP`** The community API is for our community to publish useful types that\n> don't see fit in the standard API.\n\n### Utility Index\n\n|ANY|OBJECT|LIST|FUNCTION|STRING|UNION|CLASS|BOOLEAN|NUMBER|OBJECT.P|ITERATION|\n|---|---|---|---|---|---|---|---|---|---|---|\n|[Await](https://millsp.github.io/ts-toolbelt/modules/any_await.html)|[Assign](https://millsp.github.io/ts-toolbelt/modules/object_assign.html)|[Append](https://millsp.github.io/ts-toolbelt/modules/list_append.html)|[AutoPath](https://millsp.github.io/ts-toolbelt/modules/function_autopath.html)|[At](https://millsp.github.io/ts-toolbelt/modules/string_at.html)|[Diff](https://millsp.github.io/ts-toolbelt/modules/union_diff.html)|[Class](https://millsp.github.io/ts-toolbelt/modules/class_class.html)|[And](https://millsp.github.io/ts-toolbelt/modules/boolean_and.html)|[Absolute](https://millsp.github.io/ts-toolbelt/modules/number_absolute.html)|[Merge](https://millsp.github.io/ts-toolbelt/modules/object_p_merge.html)|[Iteration](https://millsp.github.io/ts-toolbelt/modules/iteration_iteration.html)|\n|[At](https://millsp.github.io/ts-toolbelt/modules/any_at.html)|[AtLeast](https://millsp.github.io/ts-toolbelt/modules/object_atleast.html)|[Assign](https://millsp.github.io/ts-toolbelt/modules/list_assign.html)|[Compose](https://millsp.github.io/ts-toolbelt/modules/function_compose.html)|[Join](https://millsp.github.io/ts-toolbelt/modules/string_join.html)|[Exclude](https://millsp.github.io/ts-toolbelt/modules/union_exclude.html)|[Instance](https://millsp.github.io/ts-toolbelt/modules/class_instance.html)|[Not](https://millsp.github.io/ts-toolbelt/modules/boolean_not.html)|[Add](https://millsp.github.io/ts-toolbelt/modules/number_add.html)|[Omit](https://millsp.github.io/ts-toolbelt/modules/object_p_omit.html)|[IterationOf](https://millsp.github.io/ts-toolbelt/modules/iteration_iterationof.html)|\n|[Cast](https://millsp.github.io/ts-toolbelt/modules/any_cast.html)|[Compulsory](https://millsp.github.io/ts-toolbelt/modules/object_compulsory.html)|[AtLeast](https://millsp.github.io/ts-toolbelt/modules/list_atleast.html)|[Curry](https://millsp.github.io/ts-toolbelt/modules/function_curry.html)|[Length](https://millsp.github.io/ts-toolbelt/modules/string_length.html)|[Filter](https://millsp.github.io/ts-toolbelt/modules/union_filter.html)|[Parameters](https://millsp.github.io/ts-toolbelt/modules/class_parameters.html)|[Or](https://millsp.github.io/ts-toolbelt/modules/boolean_or.html)|[Greater](https://millsp.github.io/ts-toolbelt/modules/number_greater.html)|[Pick](https://millsp.github.io/ts-toolbelt/modules/object_p_pick.html)|[Key](https://millsp.github.io/ts-toolbelt/modules/iteration_key.html)|\n|[Compute](https://millsp.github.io/ts-toolbelt/modules/any_compute.html)|[CompulsoryKeys](https://millsp.github.io/ts-toolbelt/modules/object_compulsorykeys.html)|[Compulsory](https://millsp.github.io/ts-toolbelt/modules/list_compulsory.html)|[Exact](https://millsp.github.io/ts-toolbelt/modules/function_exact.html)|[Replace](https://millsp.github.io/ts-toolbelt/modules/string_replace.html)|[Has](https://millsp.github.io/ts-toolbelt/modules/union_has.html)||[Xor](https://millsp.github.io/ts-toolbelt/modules/boolean_xor.html)|[GreaterEq](https://millsp.github.io/ts-toolbelt/modules/number_greatereq.html)|[Readonly](https://millsp.github.io/ts-toolbelt/modules/object_p_readonly.html)|[Next](https://millsp.github.io/ts-toolbelt/modules/iteration_next.html)|\n|[Contains](https://millsp.github.io/ts-toolbelt/modules/any_contains.html)|[Diff](https://millsp.github.io/ts-toolbelt/modules/object_diff.html)|[CompulsoryKeys](https://millsp.github.io/ts-toolbelt/modules/list_compulsorykeys.html)|[Function](https://millsp.github.io/ts-toolbelt/modules/function_function.html)|[Split](https://millsp.github.io/ts-toolbelt/modules/string_split.html)|[IntersectOf](https://millsp.github.io/ts-toolbelt/modules/union_intersectof.html)|||[IsNegative](https://millsp.github.io/ts-toolbelt/modules/number_isnegative.html)|[Update](https://millsp.github.io/ts-toolbelt/modules/object_p_update.html)|[Pos](https://millsp.github.io/ts-toolbelt/modules/iteration_pos.html)|\n|[Equals](https://millsp.github.io/ts-toolbelt/modules/any_equals.html)|[Either](https://millsp.github.io/ts-toolbelt/modules/object_either.html)|[Concat](https://millsp.github.io/ts-toolbelt/modules/list_concat.html)|[Length](https://millsp.github.io/ts-toolbelt/modules/function_length.html)||[Last](https://millsp.github.io/ts-toolbelt/modules/union_last.html)|||[IsPositive](https://millsp.github.io/ts-toolbelt/modules/number_ispositive.html)|[Record](https://millsp.github.io/ts-toolbelt/modules/object_p_record.html)|[Prev](https://millsp.github.io/ts-toolbelt/modules/iteration_prev.html)|\n|[Extends](https://millsp.github.io/ts-toolbelt/modules/any_extends.html)|[Exclude](https://millsp.github.io/ts-toolbelt/modules/object_exclude.html)|[Diff](https://millsp.github.io/ts-toolbelt/modules/list_diff.html)|[Narrow](https://millsp.github.io/ts-toolbelt/modules/function_narrow.html)||[Merge](https://millsp.github.io/ts-toolbelt/modules/union_merge.html)|||[IsZero](https://millsp.github.io/ts-toolbelt/modules/number_iszero.html)|||\n|[Key](https://millsp.github.io/ts-toolbelt/modules/any_key.html)|[ExcludeKeys](https://millsp.github.io/ts-toolbelt/modules/object_excludekeys.html)|[Drop](https://millsp.github.io/ts-toolbelt/modules/list_drop.html)|[NoInfer](https://millsp.github.io/ts-toolbelt/modules/function_noinfer.html)||[NonNullable](https://millsp.github.io/ts-toolbelt/modules/union_nonnullable.html)|||[Lower](https://millsp.github.io/ts-toolbelt/modules/number_lower.html)|||\n|[Keys](https://millsp.github.io/ts-toolbelt/modules/any_keys.html)|[Filter](https://millsp.github.io/ts-toolbelt/modules/object_filter.html)|[Either](https://millsp.github.io/ts-toolbelt/modules/list_either.html)|[Parameters](https://millsp.github.io/ts-toolbelt/modules/function_parameters.html)||[Nullable](https://millsp.github.io/ts-toolbelt/modules/union_nullable.html)|||[LowerEq](https://millsp.github.io/ts-toolbelt/modules/number_lowereq.html)|||\n|[KnownKeys](https://millsp.github.io/ts-toolbelt/modules/any_knownkeys.html)|[FilterKeys](https://millsp.github.io/ts-toolbelt/modules/object_filterkeys.html)|[Exclude](https://millsp.github.io/ts-toolbelt/modules/list_exclude.html)|[Pipe](https://millsp.github.io/ts-toolbelt/modules/function_pipe.html)||[Pop](https://millsp.github.io/ts-toolbelt/modules/union_pop.html)|||[Negate](https://millsp.github.io/ts-toolbelt/modules/number_negate.html)|||\n|[Is](https://millsp.github.io/ts-toolbelt/modules/any_is.html)|[Has](https://millsp.github.io/ts-toolbelt/modules/object_has.html)|[ExcludeKeys](https://millsp.github.io/ts-toolbelt/modules/list_excludekeys.html)|[Promisify](https://millsp.github.io/ts-toolbelt/modules/function_promisify.html)||[Replace](https://millsp.github.io/ts-toolbelt/modules/union_replace.html)|||[Range](https://millsp.github.io/ts-toolbelt/modules/number_range.html)|||\n|[Promise](https://millsp.github.io/ts-toolbelt/modules/any_promise.html)|[HasPath](https://millsp.github.io/ts-toolbelt/modules/object_haspath.html)|[Extract](https://millsp.github.io/ts-toolbelt/modules/list_extract.html)|[Return](https://millsp.github.io/ts-toolbelt/modules/function_return.html)||[Select](https://millsp.github.io/ts-toolbelt/modules/union_select.html)|||[Sub](https://millsp.github.io/ts-toolbelt/modules/number_sub.html)|||\n|[Try](https://millsp.github.io/ts-toolbelt/modules/any_try.html)|[Includes](https://millsp.github.io/ts-toolbelt/modules/object_includes.html)|[Filter](https://millsp.github.io/ts-toolbelt/modules/list_filter.html)|[UnCurry](https://millsp.github.io/ts-toolbelt/modules/function_uncurry.html)||[Strict](https://millsp.github.io/ts-toolbelt/modules/union_strict.html)||||||\n|[Type](https://millsp.github.io/ts-toolbelt/modules/any_type.html)|[Intersect](https://millsp.github.io/ts-toolbelt/modules/object_intersect.html)|[FilterKeys](https://millsp.github.io/ts-toolbelt/modules/list_filterkeys.html)|[ValidPath](https://millsp.github.io/ts-toolbelt/modules/function_validpath.html)||[ListOf](https://millsp.github.io/ts-toolbelt/modules/union_listof.html)||||||\n|[x](https://millsp.github.io/ts-toolbelt/modules/any_x.html)|[IntersectKeys](https://millsp.github.io/ts-toolbelt/modules/object_intersectkeys.html)|[Flatten](https://millsp.github.io/ts-toolbelt/modules/list_flatten.html)|||||||||\n||[Invert](https://millsp.github.io/ts-toolbelt/modules/object_invert.html)|[Group](https://millsp.github.io/ts-toolbelt/modules/list_group.html)|||||||||\n||[ListOf](https://millsp.github.io/ts-toolbelt/modules/object_listof.html)|[Has](https://millsp.github.io/ts-toolbelt/modules/list_has.html)|||||||||\n||[Merge](https://millsp.github.io/ts-toolbelt/modules/object_merge.html)|[HasPath](https://millsp.github.io/ts-toolbelt/modules/list_haspath.html)|||||||||\n||[MergeAll](https://millsp.github.io/ts-toolbelt/modules/object_mergeall.html)|[Head](https://millsp.github.io/ts-toolbelt/modules/list_head.html)|||||||||\n||[Modify](https://millsp.github.io/ts-toolbelt/modules/object_modify.html)|[Includes](https://millsp.github.io/ts-toolbelt/modules/list_includes.html)|||||||||\n||[NonNullable](https://millsp.github.io/ts-toolbelt/modules/object_nonnullable.html)|[Intersect](https://millsp.github.io/ts-toolbelt/modules/list_intersect.html)|||||||||\n||[NonNullableKeys](https://millsp.github.io/ts-toolbelt/modules/object_nonnullablekeys.html)|[IntersectKeys](https://millsp.github.io/ts-toolbelt/modules/list_intersectkeys.html)|||||||||\n||[Nullable](https://millsp.github.io/ts-toolbelt/modules/object_nullable.html)|[KeySet](https://millsp.github.io/ts-toolbelt/modules/list_keyset.html)|||||||||\n||[NullableKeys](https://millsp.github.io/ts-toolbelt/modules/object_nullablekeys.html)|[Last](https://millsp.github.io/ts-toolbelt/modules/list_last.html)|||||||||\n||[Object](https://millsp.github.io/ts-toolbelt/modules/object_object.html)|[LastKey](https://millsp.github.io/ts-toolbelt/modules/list_lastkey.html)|||||||||\n||[Omit](https://millsp.github.io/ts-toolbelt/modules/object_omit.html)|[Length](https://millsp.github.io/ts-toolbelt/modules/list_length.html)|||||||||\n||[Optional](https://millsp.github.io/ts-toolbelt/modules/object_optional.html)|[List](https://millsp.github.io/ts-toolbelt/modules/list_list.html)|||||||||\n||[OptionalKeys](https://millsp.github.io/ts-toolbelt/modules/object_optionalkeys.html)|[Longest](https://millsp.github.io/ts-toolbelt/modules/list_longest.html)|||||||||\n||[Overwrite](https://millsp.github.io/ts-toolbelt/modules/object_overwrite.html)|[Merge](https://millsp.github.io/ts-toolbelt/modules/list_merge.html)|||||||||\n||[Partial](https://millsp.github.io/ts-toolbelt/modules/object_partial.html)|[MergeAll](https://millsp.github.io/ts-toolbelt/modules/list_mergeall.html)|||||||||\n||[Patch](https://millsp.github.io/ts-toolbelt/modules/object_patch.html)|[Modify](https://millsp.github.io/ts-toolbelt/modules/list_modify.html)|||||||||\n||[PatchAll](https://millsp.github.io/ts-toolbelt/modules/object_patchall.html)|[NonNullable](https://millsp.github.io/ts-toolbelt/modules/list_nonnullable.html)|||||||||\n||[Path](https://millsp.github.io/ts-toolbelt/modules/object_path.html)|[NonNullableKeys](https://millsp.github.io/ts-toolbelt/modules/list_nonnullablekeys.html)|||||||||\n||[Paths](https://millsp.github.io/ts-toolbelt/modules/object_paths.html)|[Nullable](https://millsp.github.io/ts-toolbelt/modules/list_nullable.html)|||||||||\n||[Pick](https://millsp.github.io/ts-toolbelt/modules/object_pick.html)|[NullableKeys](https://millsp.github.io/ts-toolbelt/modules/list_nullablekeys.html)|||||||||\n||[Readonly](https://millsp.github.io/ts-toolbelt/modules/object_readonly.html)|[ObjectOf](https://millsp.github.io/ts-toolbelt/modules/list_objectof.html)|||||||||\n||[ReadonlyKeys](https://millsp.github.io/ts-toolbelt/modules/object_readonlykeys.html)|[Omit](https://millsp.github.io/ts-toolbelt/modules/list_omit.html)|||||||||\n||[Record](https://millsp.github.io/ts-toolbelt/modules/object_record.html)|[Optional](https://millsp.github.io/ts-toolbelt/modules/list_optional.html)|||||||||\n||[Replace](https://millsp.github.io/ts-toolbelt/modules/object_replace.html)|[OptionalKeys](https://millsp.github.io/ts-toolbelt/modules/list_optionalkeys.html)|||||||||\n||[Required](https://millsp.github.io/ts-toolbelt/modules/object_required.html)|[Overwrite](https://millsp.github.io/ts-toolbelt/modules/list_overwrite.html)|||||||||\n||[RequiredKeys](https://millsp.github.io/ts-toolbelt/modules/object_requiredkeys.html)|[Partial](https://millsp.github.io/ts-toolbelt/modules/list_partial.html)|||||||||\n||[Select](https://millsp.github.io/ts-toolbelt/modules/object_select.html)|[Patch](https://millsp.github.io/ts-toolbelt/modules/list_patch.html)|||||||||\n||[SelectKeys](https://millsp.github.io/ts-toolbelt/modules/object_selectkeys.html)|[PatchAll](https://millsp.github.io/ts-toolbelt/modules/list_patchall.html)|||||||||\n||[Undefinable](https://millsp.github.io/ts-toolbelt/modules/object_undefinable.html)|[Path](https://millsp.github.io/ts-toolbelt/modules/list_path.html)|||||||||\n||[UndefinableKeys](https://millsp.github.io/ts-toolbelt/modules/object_undefinablekeys.html)|[Paths](https://millsp.github.io/ts-toolbelt/modules/list_paths.html)|||||||||\n||[Unionize](https://millsp.github.io/ts-toolbelt/modules/object_unionize.html)|[Pick](https://millsp.github.io/ts-toolbelt/modules/list_pick.html)|||||||||\n||[UnionOf](https://millsp.github.io/ts-toolbelt/modules/object_unionof.html)|[Pop](https://millsp.github.io/ts-toolbelt/modules/list_pop.html)|||||||||\n||[Update](https://millsp.github.io/ts-toolbelt/modules/object_update.html)|[Prepend](https://millsp.github.io/ts-toolbelt/modules/list_prepend.html)|||||||||\n||[Writable](https://millsp.github.io/ts-toolbelt/modules/object_writable.html)|[Readonly](https://millsp.github.io/ts-toolbelt/modules/list_readonly.html)|||||||||\n||[WritableKeys](https://millsp.github.io/ts-toolbelt/modules/object_writablekeys.html)|[ReadonlyKeys](https://millsp.github.io/ts-toolbelt/modules/list_readonlykeys.html)|||||||||\n|||[Remove](https://millsp.github.io/ts-toolbelt/modules/list_remove.html)|||||||||\n|||[Repeat](https://millsp.github.io/ts-toolbelt/modules/list_repeat.html)|||||||||\n|||[Replace](https://millsp.github.io/ts-toolbelt/modules/list_replace.html)|||||||||\n|||[Required](https://millsp.github.io/ts-toolbelt/modules/list_required.html)|||||||||\n|||[RequiredKeys](https://millsp.github.io/ts-toolbelt/modules/list_requiredkeys.html)|||||||||\n|||[Reverse](https://millsp.github.io/ts-toolbelt/modules/list_reverse.html)|||||||||\n|||[Select](https://millsp.github.io/ts-toolbelt/modules/list_select.html)|||||||||\n|||[SelectKeys](https://millsp.github.io/ts-toolbelt/modules/list_selectkeys.html)|||||||||\n|||[Shortest](https://millsp.github.io/ts-toolbelt/modules/list_shortest.html)|||||||||\n|||[Tail](https://millsp.github.io/ts-toolbelt/modules/list_tail.html)|||||||||\n|||[Take](https://millsp.github.io/ts-toolbelt/modules/list_take.html)|||||||||\n|||[Undefinable](https://millsp.github.io/ts-toolbelt/modules/list_undefinable.html)|||||||||\n|||[UndefinableKeys](https://millsp.github.io/ts-toolbelt/modules/list_undefinablekeys.html)|||||||||\n|||[Unionize](https://millsp.github.io/ts-toolbelt/modules/list_unionize.html)|||||||||\n|||[UnionOf](https://millsp.github.io/ts-toolbelt/modules/list_unionof.html)|||||||||\n|||[UnNest](https://millsp.github.io/ts-toolbelt/modules/list_unnest.html)|||||||||\n|||[Update](https://millsp.github.io/ts-toolbelt/modules/list_update.html)|||||||||\n|||[Writable](https://millsp.github.io/ts-toolbelt/modules/list_writable.html)|||||||||\n|||[WritableKeys](https://millsp.github.io/ts-toolbelt/modules/list_writablekeys.html)|||||||||\n|||[Zip](https://millsp.github.io/ts-toolbelt/modules/list_zip.html)|||||||||\n|||[ZipObj](https://millsp.github.io/ts-toolbelt/modules/list_zipobj.html)|||||||||\n\n### [Archives ⤢](https://github.com/millsp/ts-toolbelt/tree/gh-pages)\n\n> **`EXAMPLE`** https://millsp.github.io/ts-toolbelt/4.2.1/\n\n## [Good to Know ⤢](https://github.com/millsp/ts-toolbelt/discussions/categories/q-a)\n\nIn this wiki, you will find some extra resources for your learning, and\nunderstanding.\n\n**Are you missing something?** Participate to the open-wiki by [posting your\nquestions](https://github.com/millsp/ts-toolbelt/discussions/new).\n\n## Running tests\n\n### For this project\n\nTo run the `lint` & `type` tests, simply run:\n\n```sh\nnpm test\n```\n\n### For your project\n\nWant to test your own types? Let's get started:\n\n```ts\nimport {Number, Test} from \"ts-toolbelt\"\n\nconst {checks, check} = Test\n\nchecks([\n    check<Number.Add<1, 30>, 31, Test.Pass>(),\n    check<Number.Add<5, -3>, 2,  Test.Pass>(),\n])\n```\n\n> **`TIP`** Place it in a file that won't be executed, it's just for TypeScript\n> to test types.\n\n### Continuous Integration\n\nThe releases are done with Travis CI in stages & whenever a branch or PR is\npushed:\n\n- Tests are run with `npm test`\n- Tests against\n  [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped/)\n- Releases to npm@[branch-name]\n\n## Compatibility\n\nThe project is maintained to adapt to the constant [changes of\nTypeScript](https://github.com/Microsoft/TypeScript/wiki/Roadmap):\n\n| ts-toolbelt | typescript |\n|-------------|------------|\n| 9.x.x       | ^4.1.x     |\n\nMajor version numbers will upgrade whenever TypeScript had breaking changes. \n\nOtherwise, the release versions will naturally follow the semantic versioning.\n\n## What's next\n\n* Automated performance tests\n  ```sh\n  # performance is checked manually with \n  npx tsc --noEmit --extendedDiagnostics\n  ```\n\n* Need to write more examples\n\n## License\n\n[![FOSSA\nStatus](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fpirix-gh%2Fts-toolbelt.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fpirix-gh%2Fts-toolbelt?ref=badge_large)\n"
  },
  {
    "path": "SECURITY.md",
    "content": "If you have discovered a security vulnerability, please report it via [Tidelift](https://tidelift.com/security).\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"ts-toolbelt\",\n  \"version\": \"9.6.0\",\n  \"description\": \"TypeScript's largest utility library\",\n  \"keywords\": [\n    \"safe\",\n    \"tools\",\n    \"types\",\n    \"typesafe\",\n    \"typescript\"\n  ],\n  \"homepage\": \"https://github.com/millsp/ts-toolbelt\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/millsp/ts-toolbelt\"\n  },\n  \"license\": \"Apache-2.0\",\n  \"author\": {\n    \"name\": \"Pierre-Antoine Mills\",\n    \"url\": \"https://github.com/millsp\"\n  },\n  \"main\": \"out/index.js\",\n  \"types\": \"out/index.d.ts\",\n  \"files\": [\n    \"out\"\n  ],\n  \"scripts\": {\n    \"build:clean\": \"bash scripts/build/clean.sh\",\n    \"build:code\": \"bash scripts/build/code.sh\",\n    \"build:docs\": \"bash scripts/build/docs.sh\",\n    \"build:types\": \"bash scripts/build/types.sh\",\n    \"ci:branch:ad\": \"bash scripts/ci/branch/ad.sh\",\n    \"ci:branch:bd\": \"bash scripts/ci/branch/bd.sh\",\n    \"ci:docs:ad\": \"bash scripts/ci/docs/ad.sh\",\n    \"ci:docs:bd\": \"bash scripts/ci/docs/bd.sh\",\n    \"ci:master:ad\": \"bash scripts/ci/master/ad.sh\",\n    \"ci:master:bd\": \"bash scripts/ci/master/bd.sh\",\n    \"ci:test:ad\": \"bash scripts/ci/test/ad.sh\",\n    \"ci:test:bd\": \"bash scripts/ci/test/bd.sh\",\n    \"release\": \"bash scripts/release.sh\",\n    \"test\": \"bash scripts/test/all.sh\",\n    \"test:code\": \"bash scripts/test/code.sh\",\n    \"test:lint\": \"bash scripts/test/lint.sh\",\n    \"test:types\": \"bash scripts/test/types.sh\"\n  },\n  \"dependencies\": {},\n  \"devDependencies\": {\n    \"@commitlint/cli\": \"^11.0.0\",\n    \"@commitlint/config-conventional\": \"^11.0.0\",\n    \"@typescript-eslint/parser\": \"^4.14.0\",\n    \"eledoc\": \"^0.2.0\",\n    \"eslint\": \"^7.18.0\",\n    \"eslint-plugin-fp\": \"^2.3.0\",\n    \"eslint-plugin-react\": \"^7.22.0\",\n    \"husky\": \"^4.3.0\",\n    \"npx\": \"^10.2.0\",\n    \"sort-package-json\": \"^1.48.0\",\n    \"standard-version\": \"^9.1.0\",\n    \"ts-node\": \"^9.1.0\",\n    \"tslib\": \"^2.1.0\",\n    \"typedoc\": \"^0.20.0\",\n    \"typescript\": \"latest\"\n  }\n}\n"
  },
  {
    "path": "scripts/build/clean.sh",
    "content": "#!/bin/bash\n\nrm -fr out\nrm -fr docs\n"
  },
  {
    "path": "scripts/build/code.sh",
    "content": "#!/bin/bash\n\nmkdir -p out\n\ntouch out/index.js\n"
  },
  {
    "path": "scripts/build/docs.sh",
    "content": "#!/bin/bash\n\n# creates folder if it doesn't exist yet\nmkdir -p docs\n\n# get the current version of the package\nDOCS_VERSION=$(node -p \"require('./package.json').version\")\n\n# force typedoc to use higher ts version\nrm -rf node_modules/typedoc/node_modules/typescript\n# !\\ can cause bugs, be vigilent with it\n\n# generate docs their own version folder\nnpx typedoc --out \"docs/${DOCS_VERSION}\" sources --theme node_modules/eledoc/bin/default/ && \n\n# & for github to display them correctly\ntouch \"docs/${DOCS_VERSION}/.nojekyll\"\n"
  },
  {
    "path": "scripts/build/types.sh",
    "content": "#!/bin/bash\n\nmkdir -p out\n\nnpx tsc sources/index.ts -d --emitDeclarationOnly --outDir out\n"
  },
  {
    "path": "scripts/ci/branch/ad.sh",
    "content": "#!/bin/bash\n\nbash ./scripts/tools/check-deploy.sh\n"
  },
  {
    "path": "scripts/ci/branch/bd.sh",
    "content": "#!/bin/bash\n\nnpm run build:clean\nnpm run build:code &&\nnpm run build:types\n"
  },
  {
    "path": "scripts/ci/master/ad.sh",
    "content": "#!/bin/bash\n\nbash ./scripts/tools/check-deploy.sh"
  },
  {
    "path": "scripts/ci/master/bd.sh",
    "content": "#!/bin/bash\n\nnpm run build:clean\nnpm run build:code &&\nnpm run build:types\n"
  },
  {
    "path": "scripts/ci/test/ad.sh",
    "content": "#!/bin/bash\n\n# rm -fr dt\n\n# git clone --depth=1 https://github.com/DefinitelyTyped/DefinitelyTyped.git dt &&\n\n# npx ts-node scripts/tools/dt-update-version.ts &&\n\n# cd dt &&\n\n# git commit -am \"dependents testing\" &&\n\n# npm i &&\n\n# npm test\n"
  },
  {
    "path": "scripts/ci/test/bd.sh",
    "content": "#!/bin/bash\n\nnpm run build:clean\n\nnpx ts-node scripts/tools/package-test-version.ts &&\nnpm run build:code &&\nnpm run build:types"
  },
  {
    "path": "scripts/release.sh",
    "content": "#!/bin/bash\n\n# Make sure that we passed all tests\nnpm run test &&\n\n# Get the name of the current branch\nBRANCH=`git rev-parse --symbolic-full-name --abbrev-ref HEAD` &&\n\n# Sort package.json, keeps neat\nnpx sort-package-json &&\n\n# check if we have to do a release\nRELEASE=$(node -p \"require('./package.json').version.split('.')[2] === '0'\") &&\n\n# Publish the current branch origin\nif [ \"$BRANCH\" != \"master\" ]; then\n    npx standard-version --skip.tag &&        # skip changelog\n    git push origin $BRANCH                   # not a release\nelse\n    if [ \"$RELEASE\" = \"false\" ]; then\n        npx standard-version --skip.tag &&    # gen changelog\n        git push origin $BRANCH\n    else\n        npx standard-version &&               # gen changelog\n        git push origin $BRANCH --follow-tags # only releases\n    fi;\nfi;\n"
  },
  {
    "path": "scripts/test/all.sh",
    "content": "#!/bin/bash\n\nnpm run test:code &&\nnpm run test:lint &&\nnpm run test:types\n"
  },
  {
    "path": "scripts/test/code.sh",
    "content": "#!/bin/bash\n"
  },
  {
    "path": "scripts/test/lint.sh",
    "content": "#!/bin/bash\n\nnpx eslint 'sources/**'\n"
  },
  {
    "path": "scripts/test/types.sh",
    "content": "#!/bin/bash\n\nnpx tsc --noEmit --diagnostics\n"
  },
  {
    "path": "scripts/tools/check-deploy.sh",
    "content": "#!/bin/bash\n\nsleep 60s # we'll just wait a little for it to get propagated\n\n# we replace the travis branch name with \"latest\" if \"master\"\nPKG_VERSTAG=$(echo ${TRAVIS_BRANCH//master/latest})\n\n# we need to compare the current push and published versions\nPKG_VERSION=$(node -p \"require('./package.json').version\")\nPUB_VERSION=$(npm info .@${PKG_VERSTAG} version)\n\nif [ $PKG_VERSION != $PUB_VERSION ]; then\n    echo \n    exit 1 # travis has just failed the build, force to fail\nfi\n\nexit 0\n"
  },
  {
    "path": "scripts/tools/dt-update-version.ts",
    "content": "import replace from './regex-update-file'\n\nreplace('./dt/types', '\"ts-toolbelt\": \".*\"', '\"ts-toolbelt\": \"test\"',\n    [\n        '?.*/package.json',\n    ],\n    [],\n)\n"
  },
  {
    "path": "scripts/tools/package-test-version.ts",
    "content": "import replace from './regex-update-file'\n\nreplace('.', '\"version\": \"(?<version>.*)\"', `\"version\": \"<version>-test.${Date.now()}\"`,\n    [\n        'package.json',\n    ],\n    [],\n)\n"
  },
  {
    "path": "scripts/tools/regex-update-file.ts",
    "content": "// @ts-ignore\nimport * as fs from 'fs'\n// @ts-ignore\nimport * as rl from 'readline'\n\n// regex-update-file\n// regex-find-file\n\nconst updateMatchTo = (line: string, match: RegExp, to: string) => {\n    const result = match.exec(line) || {groups: {}}\n    const groups = result.groups\n\n    // if user is not using groups just do\n    if (!groups) return line.replace(match, to)\n\n    Object.keys(groups).forEach((key) => {\n        const groupMatch = new RegExp(`<${key}>`, 'gu')\n\n        to   = to.replace(groupMatch, groups[key])\n        line = line.replace(match, to)\n    })\n\n    return line\n}\n\n\nconst replaceInFile = (\n    file : string,\n    path : string,\n    match: RegExp,\n    to   : string,\n) => {\n    let content  = ''\n    let didMatch = false\n\n    const filePath = `${path}/${file}`\n    const streamFD = fs.createReadStream(filePath)\n\n    rl.createInterface(streamFD).\n    on('line', (line: string) => {\n        if (line.match(match)) {\n            line = updateMatchTo(line, match, to)\n\n            didMatch = true\n        }\n\n        content += `${line}\\n`\n    }).\n    on('close', () => {\n        if (didMatch) {\n            fs.writeFileSync(filePath, content)\n\n            console.info(`wrote: ${filePath}`)\n        }\n\n        streamFD.close()\n    })\n}\n\nconst isPathIncluded = (\n    path: string,\n    include: string[],\n    exclude: string[],\n) => {\n    // reduces down to `true` if a regex is a match\n    const isExcluded = exclude.reduce((acc, val) => {\n        return !!path.match(new RegExp(val, 'u')) || acc\n    }, false)\n\n    if (isExcluded)\n        return false\n\n    // reduces down to `true` if a regex is a match\n    const isIncluded = include.reduce((acc, val) => {\n        return !!path.match(new RegExp(val, 'u')) || acc\n    }, false)\n\n    return isIncluded\n}\n\nconst replaceInDir = (\n    path   : string,\n    match  : RegExp,\n    replc  : string,\n    include: string[],\n    exclude: string[],\n) => fs.readdir(path, 'utf8', (error: Error, docs: string[]) => {\n    if (error)\n        console.error(error)\n    else {\n        docs.forEach((doc) => {\n            const docPath = `${path}/${doc}`\n\n            if (fs.statSync(docPath).isDirectory()) {\n                // it is important to add `/` for the regex matching\n                if (isPathIncluded(`${docPath}/`, include, exclude))\n                    replaceInDir(docPath, match, replc, include, exclude)\n            }\n\n            if (fs.statSync(docPath).isFile()) {\n                if (isPathIncluded(docPath, include, exclude))\n                    replaceInFile(doc, path, match, replc)\n            }\n        })\n    }\n})\n\nconst pathToRegExp = (root: string) => (path: string) => {\n    path = `^${root}/${path}`\n\n    // // prepare insertion of different regexps\n    // path = path.replace(/\\*\\*/gu, '[rec]')  // .*\n    // path = path.replace(/\\*/gu,   '[any]')  // [\\\\w\\\\.]+\n    // // we do this because we can't replace '*'\n\n    // // insert the regexps at their positions\n    // path = path.replace(/\\[rec\\]/gu, '.*')\n    // path = path.replace(/\\[any\\]/gu, '[\\\\w\\\\.]*')\n\n    return `${path}$`\n}\n\nconst paths = (paths: string[]) => {\n    let possibilities: string[] = []\n\n    paths.forEach((path) => {\n        possibilities = [\n            ...possibilities,                         // merge previous\n            ...path.split('/').                       // split the path\n            // @ts-ignore\n            map((path, index, array) => {             // get combination\n                return array.slice(0, index + 1)\n            }).                                       // got combinations\n            map((splitPath, index, splitPaths) => {   // put it back as path\n                if (index < splitPaths.length - 1)    // add regex `$` for all\n                    return `${splitPath.join('/')}/$` // merge string back\n                return splitPath.join('/')            // but not the last one\n            }),\n        ]\n    })\n\n    return possibilities\n}\n\nconst replace = (\n    path: string,\n    match: string,\n    replc: string,\n    include: string[],\n    exclude: string[],\n) => {\n    // change/map paths to string regexps\n    include = include.map(pathToRegExp(path))\n    exclude = exclude.map(pathToRegExp(path))\n\n    // only the end directory is included\n    // so the algo can't follow by default\n    // let's include all the possible paths\n    const pathsInclude = paths(include)\n    const pathsExclude = paths(exclude)\n\n    include = include.concat(pathsInclude)\n    exclude = exclude.concat(pathsExclude)\n\n    // console.log(include)\n\n    return replaceInDir(path, new RegExp(match, 'u'), replc, include, exclude)\n}\n\nexport default replace\n"
  },
  {
    "path": "sources/Any/At.ts",
    "content": "import {Key} from './Key'\nimport {List} from '../List/List'\n\n/**\n * Get in `O` the type of a field of key `K`\n * @param O to extract from\n * @param K to extract at\n * @returns [[Any]]\n * @example\n * ```ts\n * import {O} from 'ts-toolbelt'\n *\n * type User = {\n *  info: {\n *      name: string\n *      age: number\n *      payment: {}\n *  }\n *  id: number\n * }\n *\n * type test0 = O.At<User, 'id'> // number\n * ```\n */\nexport type At<A extends any, K extends Key> =\n    A extends List\n    ? number extends A['length']\n      ? K extends number | `${number}`\n        ? A[never] | undefined\n        : undefined\n      : K extends keyof A ? A[K] : undefined\n    : unknown extends A ? unknown :\n      K extends keyof A ? A[K] :\n      undefined;\n"
  },
  {
    "path": "sources/Any/Await.ts",
    "content": "/**\n * Get the result type of a `Promise`\n * @param P A promise\n * @returns [[Any]]\n * @example\n * ```ts\n * import {C} from 'ts-toolbelt'\n *\n * const promise = new Promise<string>((res, rej) => res('x'))\n *\n * type test0 = C.Await<typeof promise>  // string\n * type test1 = C.Await<Promise<number>> // number\n * ```\n */\nexport type Await<P extends any> =\n    P extends Promise<infer A>\n    ? A\n    : P\n"
  },
  {
    "path": "sources/Any/Cast.ts",
    "content": "/**\n * Ask TS to re-check that `A1` extends `A2`.\n * And if it fails, `A2` will be enforced anyway.\n * Can also be used to add constraints on parameters.\n * @param A1 to check against\n * @param A2 to cast to\n * @returns `A1 | A2`\n * @example\n * ```ts\n * import {A} from 'ts-toolbelt'\n *\n * type test0 = A.Cast<'42', string> // '42'\n * type test1 = A.Cast<'42', number> // number\n * ```\n */\nexport type Cast<A1 extends any, A2 extends any> =\n    A1 extends A2\n    ? A1\n    : A2\n"
  },
  {
    "path": "sources/Any/Compute.ts",
    "content": "import {Depth} from '../Object/_Internal'\nimport {BuiltIn} from '../Misc/BuiltIn'\nimport {Has} from '../Union/Has'\nimport {If} from './If'\nimport {Key} from './Key'\n\n/**\n * @hidden\n */\nexport type ComputeRaw<A extends any> =\n    A extends Function\n    ? A\n    : {[K in keyof A]: A[K]} & unknown\n\n/**\n * @hidden\n */\ntype ComputeFlat<A extends any> =\n    A extends BuiltIn ? A :\n    A extends Array<any>\n    ? A extends Array<Record<Key, any>>\n      ? Array<{[K in keyof A[number]]: A[number][K]} & unknown>\n      : A\n    : A extends ReadonlyArray<any>\n      ? A extends ReadonlyArray<Record<Key, any>>\n        ? ReadonlyArray<{[K in keyof A[number]]: A[number][K]} & unknown>\n        : A\n      : {[K in keyof A]: A[K]} & unknown;\n\n/**\n * @hidden\n */\ntype ComputeDeep<A extends any, Seen = never> =\n    A extends BuiltIn ? A : If<Has<Seen, A>, A, (\n      A extends Array<any>\n      ? A extends Array<Record<Key, any>>\n        ? Array<{[K in keyof A[number]]: ComputeDeep<A[number][K], A | Seen>} & unknown>\n        : A\n      : A extends ReadonlyArray<any>\n        ? A extends ReadonlyArray<Record<Key, any>>\n          ? ReadonlyArray<{[K in keyof A[number]]: ComputeDeep<A[number][K], A | Seen>} & unknown>\n          : A\n        : {[K in keyof A]: ComputeDeep<A[K], A | Seen>} & unknown\n    )>;\n\n/**\n * Force TS to load a type that has not been computed (to resolve composed\n * types that TS haven't fully resolved, for display purposes mostly).\n * @param A to compute\n * @returns `A`\n * @example\n * ```ts\n * import {A} from 'ts-toolbelt'\n *\n * type test0 = A.Compute<{x: 'x'} & {y: 'y'}> // {x: 'x', y: 'y'}\n * ```\n */\nexport type Compute<A extends any, depth extends Depth = 'deep'> = {\n    'flat': ComputeFlat<A>\n    'deep': ComputeDeep<A>\n}[depth]\n"
  },
  {
    "path": "sources/Any/Contains.ts",
    "content": "import {Extends} from './Extends'\n\n/**\n * Check whether `A1` is part of `A2` or not. It works like\n * [[Extends]] but [[Boolean]] results are narrowed to [[False]].\n * @param A1\n * @param A2\n * @returns [[Boolean]]\n * @example\n * ```ts\n * type test0 = A.Contains<'a' | 'b', 'b'> // False\n * type test1 = A.Contains<'a', 'a' | 'b'> // True\n *\n * type test2 = A.Contains<{a: string}, {a: string, b: number}> // False\n * type test3 = A.Contains<{a: string, b: number}, {a: string}> // True\n *\n * type test4 = A.Contains<never, never> // False\n * /// Nothing cannot contain nothing, use `A.Equals`\n * ```\n */\nexport type Contains<A1 extends any, A2 extends any> =\n    Extends<A1, A2> extends 1\n    ? 1\n    : 0\n"
  },
  {
    "path": "sources/Any/Equals.ts",
    "content": "/**\n * Check whether `A1` is equal to `A2` or not.\n * @param A1\n * @param A2\n * @returns [[Boolean]]\n * @example\n * ```ts\n * import {A} from 'ts-toolbelt'\n *\n * type test0 = A.Equals<42 | 0, 42 | 0>                    // true\n * type test1 = A.Equals<{a: string}, {b: string}>          // false\n * type test3 = A.Equals<{a: string}, {readonly a: string}> // false\n * ```\n */\nexport type Equals<A1 extends any, A2 extends any> =\n    (<A>() => A extends A2 ? 1 : 0) extends (<A>() => A extends A1 ? 1 : 0)\n    ? 1\n    : 0\n\n// Credit https://stackoverflow.com/a/52473108/3570903\n"
  },
  {
    "path": "sources/Any/Extends.ts",
    "content": "/**\n * Check whether `A1` is part of `A2` or not. The difference with\n * `extends` is that it forces a [[Boolean]] return.\n * @param A1\n * @param A2\n * @returns [[Boolean]]\n * @example\n * ```ts\n * import {A} from 'ts-toolbelt'\n *\n * type test0 = A.Extends<'a' | 'b', 'b'> // Boolean\n * type test1 = A.Extends<'a', 'a' | 'b'> // True\n *\n * type test2 = A.Extends<{a: string}, {a: any}>      // True\n * type test3 = A.Extends<{a: any}, {a: any, b: any}> // False\n *\n * type test4 = A.Extends<never, never> // False\n * /// Nothing cannot extend nothing, use `A.Equals`\n * ```\n */\nexport type Extends<A1 extends any, A2 extends any> =\n    [A1] extends [never]\n    ? 0\n    : A1 extends A2\n      ? 1\n      : 0\n\n/*\n * Comes from the fact that `never` is a fall-through type that we want to\n * narrow down to `0`. So it means that `Extends<never, never>` is false\n */\n"
  },
  {
    "path": "sources/Any/If.ts",
    "content": "import {Boolean} from '../Boolean/_Internal'\n\nexport type If<B extends Boolean, Then, Else = never> =\n    B extends 1\n    ? Then\n    : Else\n"
  },
  {
    "path": "sources/Any/Is.ts",
    "content": "import {Match} from './_Internal'\nimport {Extends} from './Extends'\nimport {Equals} from './Equals'\nimport {Contains} from './Contains'\n\n/**\n * Check whether `A` is similar to `A1` or not. In other words, it is a compact\n * type that bundles [[Equals]], [[Extends]], [[Contains]], comparison types.\n * @param A to be compared\n * @param A1 to compare to\n * @param match (?=`'default'`) to change precision\n * @returns [[Boolean]]\n * @example\n * ```ts\n * import {A} from 'ts-toolbelt'\n *\n * type test0 = A.Is<'a', 'a' | 'b', 'extends->'> // True\n * type test1 = A.Is<'a' | 'b', 'a', 'extends->'> // Boolean\n *\n * type test2 = A.Is<'a', 'a' | 'b', '<-extends'> // Boolean\n * type test3 = A.Is<'a' | 'b', 'a', '<-extends'> // True\n *\n * type test4 = A.Is<'a', 'a' | 'b', 'contains->'> // True\n * type test5 = A.Is<'a' | 'b', 'a', 'contains->'> // False\n *\n * type test6 = A.Is<'a', 'a' | 'b', '<-contains'> // False\n * type test7 = A.Is<'a' | 'b', 'a', '<-contains'> // True\n *\n * type test8 = A.Is<'a', 'a' | 'b', 'equals'>      // False\n * type test9 = A.Is<'b' |'a', 'a' | 'b', 'equals'> // True\n * ```\n */\nexport type Is<A extends any, A1 extends any, match extends Match = 'default'> = {\n    'default'   : Extends<A,   A1>\n    'contains->': Contains<A,  A1>\n    'extends->' : Extends<A,   A1>\n    '<-contains': Contains<A1, A>\n    '<-extends' : Extends<A1,  A>\n    'equals'    : Equals<A1,   A>\n}[match]\n"
  },
  {
    "path": "sources/Any/Key.ts",
    "content": "/**\n * Describes index keys for any type\n */\nexport type Key = string | number | symbol\n"
  },
  {
    "path": "sources/Any/Keys.ts",
    "content": "import {List} from '../List/List'\n\n/**\n * Get the keys of `A`\n * @param A\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type Keys<A extends any> =\n    A extends List\n    ? Exclude<keyof A, keyof any[]> | number\n    : keyof A\n"
  },
  {
    "path": "sources/Any/KnownKeys.ts",
    "content": "import {Keys} from './Keys'\n\n/**\n * Get the known keys of an [[Object]]\n * @param O\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type KnownKeys<O extends object> = {\n    [K in keyof O]:\n    string extends K ? never :\n    number extends K ? never :\n    K\n} extends {\n    [K in keyof O]: infer U\n} ? U & Keys<O> : never;\n"
  },
  {
    "path": "sources/Any/Promise.ts",
    "content": "/**\n * Create an asynchronous operation like the original `Promise` type but this\n * one prevents promises to be wrapped within more promises (not possible).\n * @param A\n * @example\n * ```ts\n * import {A} from 'ts-toolbelt'\n *\n * type test0 = A.Promise<Promise<number>> // Promise<number>\n * type test1 = Promise<Promise<number>> // Promise<Promise<number>>\n * ```\n */\nexport type Promise<A extends any> =\n    globalThis.Promise<\n        A extends globalThis.Promise<infer X>\n        ? X\n        : A\n    >\n"
  },
  {
    "path": "sources/Any/Try.ts",
    "content": "/**\n * Similar to [[Cast]] but with a custom fallback `Catch`. If it fails,\n * it will enforce `Catch` instead of `A2`.\n * @param A1 to check against\n * @param A2 to try/test with\n * @param Catch to fallback to if the test failed\n * @returns `A1 | Catch`\n * @example\n * ```ts\n * import {A} from 'ts-toolbelt'\n *\n * type test0 = A.Try<'42', string>          // '42'\n * type test1 = A.Try<'42', number>          // never\n * type test1 = A.Try<'42', number, 'tried'> // 'tried'\n * ```\n */\nexport type Try<A1 extends any, A2 extends any, Catch = never> =\n    A1 extends A2\n    ? A1\n    : Catch\n"
  },
  {
    "path": "sources/Any/Type.ts",
    "content": "import {Key} from './Key'\n\ndeclare const id: unique symbol\n\n/**\n * Create your own opaque sub-type from a type `A`\n * @param A to be personalized\n * @param Id to name the sub-type\n * @returns A new type `Type<A, Id>`\n * @example\n * ```ts\n * import {A} from 'ts-toolbelt'\n *\n * type EUR = A.Type<number, 'eur'>\n * type USD = A.Type<number, 'usd'>\n *\n * let eurWallet = 10 as EUR\n * let usdWallet = 15 as USD\n *\n * eurWallet = usdWallet // error\n * ```\n */\nexport type Type<A extends any, Id extends Key> = {\n    [id]: Id\n} & A\n"
  },
  {
    "path": "sources/Any/_Internal.ts",
    "content": "/**\n * Describes the match strategy when matching types\n * * `default`     : `extends->`\n * * `contains->`  : X contains   Y ([[Contains]]<X, Y>)\n * * `extends->`   : X extends    Y ([[Extends]]<X, Y>)\n * * `<-contains`  : Y contains   X ([[Contains]]<Y, X>)\n * * `<-extends`   : Y extends    X ([[Extends]]<Y, X>)\n * * `equals`      : X equals     Y (([[Equals]]<X, Y>))\n */\nexport type Match = | 'default'\n                    | 'contains->'\n                    | 'extends->'\n                    | '<-contains'\n                    | '<-extends'\n                    | 'equals'\n"
  },
  {
    "path": "sources/Any/_api.ts",
    "content": "/** @ignore *//** */\n\nexport {Await} from './Await'\nexport {At} from './At'\nexport {Cast} from './Cast'\nexport {Compute} from './Compute'\nexport {Contains} from './Contains'\nexport {Equals} from './Equals'\nexport {Extends} from './Extends'\nexport {Key} from './Key'\nexport {Keys} from './Keys'\nexport {KnownKeys} from './KnownKeys'\nexport {Is} from './Is'\nexport {Promise} from './Promise'\nexport {Try} from './Try'\nexport {Type} from './Type'\nexport {x} from './x'\n"
  },
  {
    "path": "sources/Any/x.ts",
    "content": "const _ = Symbol('x')\n\n/**\n * A placeholder that is used in various ways\n */\nexport type x = typeof _ & {}\n"
  },
  {
    "path": "sources/Boolean/And.ts",
    "content": "import {Boolean} from './_Internal'\n\n/**\n * Logical `&&` operator (behaves like the JS one)\n * @param B1 Left-hand side\n * @param B2 Right-hand side\n * @returns [[Boolean]]\n * @example\n * ```ts\n * import {B} from 'ts-toolbelt'\n *\n * type test0 = B.And<B.True, B.False>          // False\n * type test1 = B.And<B.True, B.True>           // True\n * type test2 = B.And<B.True | B.False, B.True> // Boolean\n * ```\n */\nexport type And<B1 extends Boolean, B2 extends Boolean> = {\n    0: {\n      0: 0\n      1: 0\n    }\n    1: {\n      0: 0\n      1: 1\n    }\n}[B1][B2]\n\n"
  },
  {
    "path": "sources/Boolean/Not.ts",
    "content": "import {Boolean} from './_Internal'\n\n/**\n * Logical `!` operator (behaves like the JS one)\n * @param B to negate\n * @returns [[Boolean]]\n * @example\n * ```ts\n * import {B} from 'ts-toolbelt'\n *\n * type test0 = B.Not<B.True>  // False\n * type test1 = B.Not<B.False> // True\n * ```\n */\nexport type Not<B extends Boolean> = {\n    0: 1\n    1: 0\n}[B]\n"
  },
  {
    "path": "sources/Boolean/Or.ts",
    "content": "import {Boolean} from './_Internal'\n\n/**\n * Logical `||` operator (behaves like the JS one)\n * @param B1 Left-hand side\n * @param B2 Right-hand side\n * @returns [[Boolean]]\n * @example\n * ```ts\n * import {B} from 'ts-toolbelt'\n *\n * type test0 = B.Or<B.True, B.False>    // True\n * type test1 = B.Or<B.True, B.True>     // True\n * type test2 = B.Or<B.Boolean, B.False> // Boolean\n * ```\n */\nexport type Or<B1 extends Boolean, B2 extends Boolean> = {\n    0: {\n        0: 0\n        1: 1\n    }\n    1: {\n        0: 1\n        1: 1\n    }\n}[B1][B2]\n"
  },
  {
    "path": "sources/Boolean/Xor.ts",
    "content": "import {Boolean} from './_Internal'\n\n/**\n * Logical `^` operator (behaves like the JS one)\n * @param B1 Left-hand side\n * @param B2 Right-hand side\n * @returns [[Boolean]]\n * @example\n * ```ts\n * import {B} from 'ts-toolbelt'\n *\n * type test0 = B.Xor<B.True, B.True>    // False\n * type test1 = B.Xor<B.False, B.True>   // True\n * type test2 = B.Xor<B.Boolean, B.True> // Boolean\n * ```\n */\nexport type Xor<B1 extends Boolean, B2 extends Boolean> = {\n    0: {\n        0: 0\n        1: 1\n    }\n    1: {\n        0: 1\n        1: 0\n    }\n}[B1][B2]\n"
  },
  {
    "path": "sources/Boolean/_Internal.ts",
    "content": "export type Boolean = 0 | 1\n"
  },
  {
    "path": "sources/Boolean/_api.ts",
    "content": "/** @ignore *//** */\n\nexport {And} from './And'\nexport {Not} from './Not'\nexport {Or} from './Or'\nexport {Xor} from './Xor'\n"
  },
  {
    "path": "sources/Class/Class.ts",
    "content": "import {List} from '../List/List'\n\n/**\n * Alias to create/describe a `class`\n * @param P its constructor parameters\n * @param R the object it constructs\n * @returns `class`\n * @example\n * ```ts\n * import {C} from 'ts-toolbelt'\n *\n * type test0 = C.Class<[string, number], {a: string, b: number}>\n *\n * declare const SomeClass: test0\n *\n * const obj = new SomeClass('foo', 42) // {a: string, b: number}\n * ```\n */\nexport type Class<P extends List = any[], R extends object = object> = {\n    new (...args: P): R\n}\n"
  },
  {
    "path": "sources/Class/Instance.ts",
    "content": "import {Class} from './Class'\n\n/**\n * Get the instance type of a `class` from a class object\n * @param C * *typeof** class\n * @returns [[Object]]\n * @example\n * ```ts\n * import {C} from 'ts-toolbelt'\n *\n * /// `create` takes an instance constructor and creates an instance of it\n * declare function create<C extends (new (...args: any[]) => any)>(c: C): C.InstanceOf<C>\n *\n * class A {}\n * class B {}\n *\n * let a = create(A) // A\n * let b = create(B) // B\n * ```\n */\nexport type Instance<C extends Class> =\n    C extends Class<any[], infer R>\n    ? R\n    : any\n"
  },
  {
    "path": "sources/Class/Parameters.ts",
    "content": "import {Class} from './Class'\n\n/**\n * Get the parameters of a class constructor\n * @param C **typeof** class\n * @returns [[List]]\n * @example\n * ```ts\n * import {C} from 'ts-toolbelt'\n *\n * type User = C.Class<[string, string], {firstname: string, lastname: string}>\n *\n * type test0 = C.Parameters<User> // [string, string]\n * ```\n */\nexport type Parameters<C extends Class> =\n    C extends Class<infer P, any>\n    ? P\n    : never\n"
  },
  {
    "path": "sources/Class/_api.ts",
    "content": "/** @ignore *//** */\n\nexport {Class} from './Class'\nexport {Instance} from './Instance'\nexport {Parameters} from './Parameters'\n"
  },
  {
    "path": "sources/Community/IncludesDeep.ts",
    "content": "import {Match} from '../Any/_Internal'\nimport {UnionOf} from '../Object/UnionOf'\nimport {Next} from '../Iteration/Next'\nimport {Prev} from '../Iteration/Prev'\nimport {Iteration} from '../Iteration/Iteration'\nimport {IterationOf} from '../Iteration/IterationOf'\nimport {Is} from '../Any/Is'\nimport {Boolean} from '../Boolean/_Internal'\nimport {Cast} from '../Any/Cast'\nimport {Pos} from '../Iteration/Pos'\n\n/**\n * @hidden\n */\ntype _IncludesDeep<O, M extends any, match extends Match, limit extends number, I extends Iteration = IterationOf<0>> = {\n    0: _IncludesDeep<O extends object ? UnionOf<O> : O, M, match, limit, Next<I>>\n    1: 1\n    2: 0\n}[\n    Pos<Prev<I>> extends limit // if we go past the limit\n    ? 2                        // end the loop here\n    : Is<O, M, match>          // if 0 => continue, if 1 => end\n]\n\n/**\n * Check whether `O`, or its sub-objects have fields that match `M`\n * where the maximum allowed depth is set with `limit`.\n *\n * @param O to be inspected\n * @param M to check field type\n * @param match (?=`'default'`) to change precision\n * @param limit (?=`'10'`) to change the check depth\n * @returns [[Boolean]]\n * @example\n * ```ts\n * ```\n * @author millsp, ctrlplusb\n */\nexport type IncludesDeep<O extends object, M extends any, match extends Match = 'default', limit extends number = 10> =\n    _IncludesDeep<O, M, match, limit> extends infer X\n    ? Cast<X, Boolean>\n    : never\n"
  },
  {
    "path": "sources/Community/IsLiteral.ts",
    "content": "import {And} from '../Boolean/And'\nimport {Or} from '../Boolean/Or'\nimport {Extends} from '../Any/Extends'\n\n/**\n * @hidden\n */\nexport type IsStringLiteral<A extends any> =\n    A extends string\n    ? string extends A\n      ? 0\n      : 1\n    : 0\n\n/**\n * @hidden\n */\nexport type IsNumberLiteral<A extends any> =\n    A extends number\n    ? number extends A\n      ? 0\n      : 1\n    : 0\n\n/**\n * Literal to restrict against\n */\nexport type Kind = string | number\n\n/**\n * Determine whether `A` is literal or not\n * @param A to be checked\n * @param kind (?=`'string' | 'number'`) to restrict\n * @example\n * ```ts\n * import {A} from 'ts-toolbelt'\n *\n * type test0 = A.IsLiteral<1 | 2> // 1\n * type test1 = A.IsLiteral<1 | 2, string> // 0\n * type test2 = A.IsLiteral<1 | '2', string> // 0 | 1\n * type test3 = A.IsLiteral<number> // 0\n * ```\n */\nexport type IsLiteral<A extends any, kind extends Kind = Kind> =\n    And<Or<IsStringLiteral<A>, IsNumberLiteral<A>>, Extends<A, kind>>\n"
  },
  {
    "path": "sources/Community/_api.ts",
    "content": "/** @ignore *//** */\n\nexport {IncludesDeep} from './IncludesDeep'\nexport {IsLiteral} from './IsLiteral'\n"
  },
  {
    "path": "sources/Function/AutoPath.ts",
    "content": "import {Key} from '../Any/Key'\nimport {Head} from '../List/Head'\nimport {List} from '../List/List'\nimport {Pop} from '../List/Pop'\nimport {Tail} from '../List/Tail'\nimport {Path} from '../Object/Path'\nimport {UnionOf} from '../Object/UnionOf'\nimport {Select} from '../Union/Select'\nimport {Join} from '../String/Join'\nimport {Split} from '../String/Split'\n\n/**\n * @ignore\n */\ntype Index = number | string;\n\n/**\n * @ignore\n */\ntype KeyToIndex<K extends Key, SP extends List<Index>> =\n  number extends K ? Head<SP> : K & Index;\n\n/**\n * @ignore\n */\ntype MetaPath<O, D extends string, SP extends List<Index> = [], P extends List<Index> = []> = {\n  [K in keyof O]:\n    | MetaPath<O[K], D, Tail<SP>, [...P, KeyToIndex<K, SP>]>\n    | Join<[...P, KeyToIndex<K, SP>], D>;\n};\n\n/**\n * @ignore\n */\ntype NextPath<OP> =\n  // the next paths after property `K` are on sub objects\n  // O[K] === K | {x: '${K}.x' | {y: '${K}.x.y' ...}}\n  // So we access O[K] then we only keep the next paths\n  // To do this, we can just exclude `string` out of it:\n  // O[K] === {x: '${K}.x' | {y: '${K}.x.y' ...}}\n  // To do this, we create a union of what we just got\n  // This will yield a union of paths and meta paths\n  // We exclude the next paths (meta) paths by excluding\n  // `object`. Then we are left with the direct next path\n  Select<UnionOf<Exclude<OP, string> & {}>, string>;\n\n/**\n * @ignore\n */\ntype ExecPath<A, SP extends List<Index>, Delimiter extends string> =\n  // We go in the `MetaPath` of `O` to get the prop at `SP`\n  // So we query what is going the `NextPath` at `O[...SP]`\n  NextPath<Path<MetaPath<A, Delimiter, SP>, SP>>;\n\n/**\n * @ignore\n */\ntype HintPath<A, P extends string, SP extends List<Index>, Exec extends string, D extends string> = [Exec] extends [never] // if has not found paths\n  ? ExecPath<A, Pop<SP>, D> // display previous paths\n  : Exec | P; // display current + next\n\n/**\n * @ignore\n */\ntype _AutoPath<A, P extends string, D extends string, SP extends List<Index> = Split<P, D>> =\n  HintPath<A, P, SP, ExecPath<A, SP, D>, D>;\n\n/**\n * Auto-complete, validate, and query the string path of an object `O`\n * @param O to work on\n * @param P path of `O`\n * @param D (?=`'.'`) delimiter for path\n *\n * ```ts\n * declare function get<O extends object, P extends string>(\n *     object: O, path: AutoPath<O, P>\n * ): Path<O, Split<P, '.'>>\n *\n * declare const user: User\n *\n * type User = {\n *     name: string\n *     friends: User[]\n * }\n *\n * // works\n * const friendName = get(user, 'friends.40.name')\n * const friendFriendName = get(user, 'friends.40.friends.12.name')\n *\n * // errors\n * const friendNames = get(user, 'friends.40.names')\n * const friendFriendNames = get(user, 'friends.40.friends.12.names')\n * ```\n */\nexport type AutoPath<O extends any, P extends string, D extends string = '.'> =\n  _AutoPath<O, P, D>;\n"
  },
  {
    "path": "sources/Function/Compose/List/Async.ts",
    "content": "/** @ignore *//** */\n\nimport {Function} from '../../Function'\nimport {Await} from '../../../Any/Await'\nimport {Curry} from '../../Curry'\n\n/**\n *@hidden\n */\nexport type ComposeListAsync = {\n    <\n        R0,\n        P extends any[],\n    >(fns: [\n        Function<P,               R0> | Curry<Function<P,           R0>>,\n    ]): Function<P, Promise<Await<R0>>>\n\n    <\n        R0,\n        R1,\n        P extends any[],\n    >(fns: [\n        Function<[Await<R0>],     R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<P,               R0> | Curry<Function<P,           R0>>,\n    ]): Function<P, Promise<Await<R1>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        P extends any[],\n    >(fns: [\n        Function<[Await<R1>],     R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R0>],     R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<P,               R0> | Curry<Function<P,           R0>>,\n    ]): Function<P, Promise<Await<R2>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        P extends any[],\n    >(fns: [\n        Function<[Await<R2>],     R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R1>],     R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R0>],     R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<P,               R0> | Curry<Function<P,           R0>>,\n    ]): Function<P, Promise<Await<R3>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        P extends any[],\n    >(fns: [\n        Function<[Await<R3>],     R4> | Curry<Function<[Await<R3>], R4>>,\n        Function<[Await<R2>],     R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R1>],     R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R0>],     R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<P,               R0> | Curry<Function<P,           R0>>,\n    ]): Function<P, Promise<Await<R4>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        P extends any[],\n    >(fns: [\n        Function<[Await<R4>],     R5> | Curry<Function<[Await<R4>], R5>>,\n        Function<[Await<R3>],     R4> | Curry<Function<[Await<R3>], R4>>,\n        Function<[Await<R2>],     R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R1>],     R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R0>],     R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<P,               R0> | Curry<Function<P,           R0>>,\n    ]): Function<P, Promise<Await<R5>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        P extends any[],\n    >(fns: [\n        Function<[Await<R5>],     R6> | Curry<Function<[Await<R5>], R6>>,\n        Function<[Await<R4>],     R5> | Curry<Function<[Await<R4>], R5>>,\n        Function<[Await<R3>],     R4> | Curry<Function<[Await<R3>], R4>>,\n        Function<[Await<R2>],     R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R1>],     R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R0>],     R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<P,               R0> | Curry<Function<P,           R0>>,\n    ]): Function<P, Promise<Await<R6>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        R7,\n        P extends any[],\n    >(fns: [\n        Function<[Await<R6>],     R7> | Curry<Function<[Await<R6>], R7>>,\n        Function<[Await<R5>],     R6> | Curry<Function<[Await<R5>], R6>>,\n        Function<[Await<R4>],     R5> | Curry<Function<[Await<R4>], R5>>,\n        Function<[Await<R3>],     R4> | Curry<Function<[Await<R3>], R4>>,\n        Function<[Await<R2>],     R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R1>],     R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R0>],     R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<P,               R0> | Curry<Function<P,           R0>>,\n    ]): Function<P, Promise<Await<R7>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        R7,\n        R8,\n        P extends any[],\n    >(fns: [\n        Function<[Await<R7>],     R8> | Curry<Function<[Await<R7>], R8>>,\n        Function<[Await<R6>],     R7> | Curry<Function<[Await<R6>], R7>>,\n        Function<[Await<R5>],     R6> | Curry<Function<[Await<R5>], R6>>,\n        Function<[Await<R4>],     R5> | Curry<Function<[Await<R4>], R5>>,\n        Function<[Await<R3>],     R4> | Curry<Function<[Await<R3>], R4>>,\n        Function<[Await<R2>],     R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R1>],     R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R0>],     R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<P,               R0> | Curry<Function<P,           R0>>,\n    ]): Function<P, Promise<Await<R8>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        R7,\n        R8,\n        R9,\n        P extends any[],\n    >(fns: [\n        Function<[Await<R8>],     R9> | Curry<Function<[Await<R8>], R9>>,\n        Function<[Await<R7>],     R8> | Curry<Function<[Await<R7>], R8>>,\n        Function<[Await<R6>],     R7> | Curry<Function<[Await<R6>], R7>>,\n        Function<[Await<R5>],     R6> | Curry<Function<[Await<R5>], R6>>,\n        Function<[Await<R4>],     R5> | Curry<Function<[Await<R4>], R5>>,\n        Function<[Await<R3>],     R4> | Curry<Function<[Await<R3>], R4>>,\n        Function<[Await<R2>],     R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R1>],     R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R0>],     R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<P,               R0> | Curry<Function<P,           R0>>,\n    ]): Function<P, Promise<Await<R9>>>\n}\n"
  },
  {
    "path": "sources/Function/Compose/List/Sync.ts",
    "content": "/** @ignore *//** */\n\nimport {Curry} from '../../Curry'\nimport {Function} from '../../Function'\n\n/**\n *@hidden\n */\nexport type ComposeListSync = {\n    <\n        R0,\n        P extends any[],\n    >(fns: [\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n    ]): Function<P,    R0>\n\n    <\n        R0,\n        R1,\n        P extends any[],\n    >(fns: [\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n    ]): Function<P,    R1>\n\n    <\n        R0,\n        R1,\n        R2,\n        P extends any[],\n    >(fns: [\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n    ]): Function<P,    R2>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        P extends any[],\n    >(fns: [\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n    ]): Function<P,    R3>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        P extends any[],\n    >(fns: [\n        Function<[R3], R4> | Curry<Function<[R3], R4>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n    ]): Function<P,    R4>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        P extends any[],\n    >(fns: [\n        Function<[R4], R5> | Curry<Function<[R4], R5>>,\n        Function<[R3], R4> | Curry<Function<[R3], R4>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n    ]): Function<P,    R5>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        P extends any[],\n    >(fns: [\n        Function<[R5], R6> | Curry<Function<[R5], R6>>,\n        Function<[R4], R5> | Curry<Function<[R4], R5>>,\n        Function<[R3], R4> | Curry<Function<[R3], R4>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n    ]): Function<P,    R6>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        R7,\n        P extends any[],\n    >(fns: [\n        Function<[R6], R7> | Curry<Function<[R6], R7>>,\n        Function<[R5], R6> | Curry<Function<[R5], R6>>,\n        Function<[R4], R5> | Curry<Function<[R4], R5>>,\n        Function<[R3], R4> | Curry<Function<[R3], R4>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n    ]): Function<P,    R7>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        R7,\n        R8,\n        P extends any[],\n    >(fns: [\n        Function<[R7], R8> | Curry<Function<[R7], R8>>,\n        Function<[R6], R7> | Curry<Function<[R6], R7>>,\n        Function<[R5], R6> | Curry<Function<[R5], R6>>,\n        Function<[R4], R5> | Curry<Function<[R4], R5>>,\n        Function<[R3], R4> | Curry<Function<[R3], R4>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n    ]): Function<P,    R8>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        R7,\n        R8,\n        R9,\n        P extends any[],\n    >(fns: [\n        Function<[R8], R9> | Curry<Function<[R8], R9>>,\n        Function<[R7], R8> | Curry<Function<[R7], R8>>,\n        Function<[R6], R7> | Curry<Function<[R6], R7>>,\n        Function<[R5], R6> | Curry<Function<[R5], R6>>,\n        Function<[R4], R5> | Curry<Function<[R4], R5>>,\n        Function<[R3], R4> | Curry<Function<[R3], R4>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n    ]): Function<P,    R9>\n}\n"
  },
  {
    "path": "sources/Function/Compose/Multi/Async.ts",
    "content": "/** @ignore *//** */\n\nimport {Function} from '../../Function'\nimport {Await} from '../../../Any/Await'\nimport {Curry} from '../../Curry'\n\n/**\n *@hidden\n */\nexport type ComposeMultiAsync = {\n    <\n        R0,\n        P extends any[],\n    >(...fns: [\n        Function<P,               R0> | Curry<Function<P,           R0>>,\n    ]): Function<P, Promise<Await<R0>>>\n\n    <\n        R0,\n        R1,\n        P extends any[],\n    >(...fns: [\n        Function<[Await<R0>],     R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<P,               R0> | Curry<Function<P,           R0>>,\n    ]): Function<P, Promise<Await<R1>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        P extends any[],\n    >(...fns: [\n        Function<[Await<R1>],     R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R0>],     R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<P,               R0> | Curry<Function<P,           R0>>,\n    ]): Function<P, Promise<Await<R2>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        P extends any[],\n    >(...fns: [\n        Function<[Await<R2>],     R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R1>],     R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R0>],     R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<P,               R0> | Curry<Function<P,           R0>>,\n    ]): Function<P, Promise<Await<R3>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        P extends any[],\n    >(...fns: [\n        Function<[Await<R3>],     R4> | Curry<Function<[Await<R3>], R4>>,\n        Function<[Await<R2>],     R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R1>],     R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R0>],     R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<P,               R0> | Curry<Function<P,           R0>>,\n    ]): Function<P, Promise<Await<R4>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        P extends any[],\n    >(...fns: [\n        Function<[Await<R4>],     R5> | Curry<Function<[Await<R4>], R5>>,\n        Function<[Await<R3>],     R4> | Curry<Function<[Await<R3>], R4>>,\n        Function<[Await<R2>],     R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R1>],     R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R0>],     R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<P,               R0> | Curry<Function<P,           R0>>,\n    ]): Function<P, Promise<Await<R5>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        P extends any[],\n    >(...fns: [\n        Function<[Await<R5>],     R6> | Curry<Function<[Await<R5>], R6>>,\n        Function<[Await<R4>],     R5> | Curry<Function<[Await<R4>], R5>>,\n        Function<[Await<R3>],     R4> | Curry<Function<[Await<R3>], R4>>,\n        Function<[Await<R2>],     R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R1>],     R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R0>],     R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<P,               R0> | Curry<Function<P,           R0>>,\n    ]): Function<P, Promise<Await<R6>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        R7,\n        P extends any[],\n    >(...fns: [\n        Function<[Await<R6>],     R7> | Curry<Function<[Await<R6>], R7>>,\n        Function<[Await<R5>],     R6> | Curry<Function<[Await<R5>], R6>>,\n        Function<[Await<R4>],     R5> | Curry<Function<[Await<R4>], R5>>,\n        Function<[Await<R3>],     R4> | Curry<Function<[Await<R3>], R4>>,\n        Function<[Await<R2>],     R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R1>],     R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R0>],     R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<P,               R0> | Curry<Function<P,           R0>>,\n    ]): Function<P, Promise<Await<R7>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        R7,\n        R8,\n        P extends any[],\n    >(...fns: [\n        Function<[Await<R7>],     R8> | Curry<Function<[Await<R7>], R8>>,\n        Function<[Await<R6>],     R7> | Curry<Function<[Await<R6>], R7>>,\n        Function<[Await<R5>],     R6> | Curry<Function<[Await<R5>], R6>>,\n        Function<[Await<R4>],     R5> | Curry<Function<[Await<R4>], R5>>,\n        Function<[Await<R3>],     R4> | Curry<Function<[Await<R3>], R4>>,\n        Function<[Await<R2>],     R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R1>],     R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R0>],     R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<P,               R0> | Curry<Function<P,           R0>>,\n    ]): Function<P, Promise<Await<R8>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        R7,\n        R8,\n        R9,\n        P extends any[],\n    >(...fns: [\n        Function<[Await<R8>],     R9> | Curry<Function<[Await<R8>], R9>>,\n        Function<[Await<R7>],     R8> | Curry<Function<[Await<R7>], R8>>,\n        Function<[Await<R6>],     R7> | Curry<Function<[Await<R6>], R7>>,\n        Function<[Await<R5>],     R6> | Curry<Function<[Await<R5>], R6>>,\n        Function<[Await<R4>],     R5> | Curry<Function<[Await<R4>], R5>>,\n        Function<[Await<R3>],     R4> | Curry<Function<[Await<R3>], R4>>,\n        Function<[Await<R2>],     R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R1>],     R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R0>],     R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<P,               R0> | Curry<Function<P,           R0>>,\n    ]): Function<P, Promise<Await<R9>>>\n}\n"
  },
  {
    "path": "sources/Function/Compose/Multi/Sync.ts",
    "content": "\n/** @ignore *//** */\n\nimport {Curry} from '../../Curry'\nimport {Function} from '../../Function'\n\n/**\n *@hidden\n */\nexport type ComposeMultiSync = {\n    <\n        R0,\n        P extends any[],\n    >(...fns: [\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n    ]): Function<P,    R0>\n\n    <\n        R0,\n        R1,\n        P extends any[],\n    >(...fns: [\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n    ]): Function<P,    R1>\n\n    <\n        R0,\n        R1,\n        R2,\n        P extends any[],\n    >(...fns: [\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n    ]): Function<P,    R2>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        P extends any[],\n    >(...fns: [\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n    ]): Function<P,    R3>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        P extends any[],\n    >(...fns: [\n        Function<[R3], R4> | Curry<Function<[R3], R4>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n    ]): Function<P,    R4>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        P extends any[],\n    >(...fns: [\n        Function<[R4], R5> | Curry<Function<[R4], R5>>,\n        Function<[R3], R4> | Curry<Function<[R3], R4>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n    ]): Function<P,    R5>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        P extends any[],\n    >(...fns: [\n        Function<[R5], R6> | Curry<Function<[R5], R6>>,\n        Function<[R4], R5> | Curry<Function<[R4], R5>>,\n        Function<[R3], R4> | Curry<Function<[R3], R4>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n    ]): Function<P,    R6>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        R7,\n        P extends any[],\n    >(...fns: [\n        Function<[R6], R7> | Curry<Function<[R6], R7>>,\n        Function<[R5], R6> | Curry<Function<[R5], R6>>,\n        Function<[R4], R5> | Curry<Function<[R4], R5>>,\n        Function<[R3], R4> | Curry<Function<[R3], R4>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n    ]): Function<P,    R7>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        R7,\n        R8,\n        P extends any[],\n    >(...fns: [\n        Function<[R7], R8> | Curry<Function<[R7], R8>>,\n        Function<[R6], R7> | Curry<Function<[R6], R7>>,\n        Function<[R5], R6> | Curry<Function<[R5], R6>>,\n        Function<[R4], R5> | Curry<Function<[R4], R5>>,\n        Function<[R3], R4> | Curry<Function<[R3], R4>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n    ]): Function<P,    R8>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        R7,\n        R8,\n        R9,\n        P extends any[],\n    >(...fns: [\n        Function<[R8], R9> | Curry<Function<[R8], R9>>,\n        Function<[R7], R8> | Curry<Function<[R7], R8>>,\n        Function<[R6], R7> | Curry<Function<[R6], R7>>,\n        Function<[R5], R6> | Curry<Function<[R5], R6>>,\n        Function<[R4], R5> | Curry<Function<[R4], R5>>,\n        Function<[R3], R4> | Curry<Function<[R3], R4>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n    ]): Function<P,    R9>\n}\n"
  },
  {
    "path": "sources/Function/Compose.ts",
    "content": "import {IntersectOf} from '../Union/IntersectOf'\nimport {ComposeListAsync} from './Compose/List/Async'\nimport {ComposeListSync} from './Compose/List/Sync'\nimport {ComposeMultiAsync} from './Compose/Multi/Async'\nimport {ComposeMultiSync} from './Compose/Multi/Sync'\nimport {Input, Mode} from './_Internal'\n\n/**\n * Compose [[Function]]s together\n * @param mode  (?=`'sync'`)    sync/async (this depends on your implementation)\n * @param input (?=`'multi'`)   whether you want it to take a list or parameters\n * @example\n * ```ts\n * import {F} from 'ts-toolbelt'\n *\n * /// If you are looking for creating types for `compose`\n * /// `Composer` will check for input & `Compose` the output\n * declare const compose: F.Compose\n *\n * const a = (a1: number) => `${a1}`\n * const c = (c1: string[]) => [c1]\n * const b = (b1: string) => [b1]\n *\n * compose(c, b, a)(42)\n *\n * /// And if you are looking for an async `compose` type\n * declare const compose: F.Compose<'async'>\n *\n * const a = async (a1: number) => `${a1}`\n * const b = async (b1: string) => [b1]\n * const c = async (c1: string[]) => [c1]\n *\n * await compose(c, b, a)(42)\n */\nexport type Compose<mode extends Mode = 'sync', input extends Input = 'multi'> = IntersectOf<{\n    'sync' : {\n        'multi': ComposeMultiSync\n        'list' : ComposeListSync\n    }\n    'async': {\n        'multi': ComposeMultiAsync\n        'list' : ComposeListAsync\n    }\n}[mode][input]> // `IntersectOf` in case of unions\n"
  },
  {
    "path": "sources/Function/Curry.ts",
    "content": "import {Pos} from '../Iteration/Pos'\nimport {Concat} from '../List/Concat'\nimport {Length} from '../List/Length'\nimport {Next} from '../Iteration/Next'\nimport {Cast} from '../Any/Cast'\nimport {Parameters} from './Parameters'\nimport {Return} from './Return'\nimport {IterationOf} from '../Iteration/IterationOf'\nimport {Iteration} from '../Iteration/Iteration'\nimport {NonNullableFlat} from '../Object/NonNullable'\nimport {x} from '../Any/x'\nimport {List} from '../List/List'\nimport {Function} from './Function'\nimport {Extends} from '../Any/Extends'\nimport {Tail} from '../List/Tail'\nimport {RequiredKeys} from '../List/RequiredKeys'\n\n/**\n * @hidden\n */\ntype _SplitParams<P extends List, PSplit extends List[] = [], PRest extends List = Tail<P>> = {\n    0: P extends [...infer A, ...PRest]\n       ? _SplitParams<Tail<P>, [...PSplit, A], Tail<PRest>>\n       : never\n    1: PSplit\n    2: P[number][][]\n}[\n    number extends Length<P>\n    ? 2\n    : P extends []\n      ? 1\n      : 0\n]\n\n/**\n * Splits tuples to preserve their labels\n * @hidden\n */\ntype SplitParams<P extends List> =\n    _SplitParams<P> extends infer X\n    ? Cast<X, List[]>\n    : never\n\n/**\n * @hidden\n */\ntype _JoinParams<PSplit extends List[], L extends List = []> = {\n    0: _JoinParams<Tail<PSplit>, [...L, ...PSplit[0]]>\n    1: L\n    2: PSplit[number][]\n}[\n    number extends Length<PSplit>\n    ? 2\n    : PSplit extends []\n      ? 1\n      : 0\n]\n\n/**\n * Undoes the job of [[SplitParams]]\n * @hidden\n */\ntype JoinParams<P extends List[]> =\n    _JoinParams<P> extends infer X\n    ? Cast<X, List>\n    : never\n\n/**\n * @hidden\n */\ntype GapOf<L1 extends List, L2 extends List[], LN extends List, I extends Iteration> =\n    L1[Pos<I>] extends x\n    ? Concat<LN, L2[Pos<I>]>\n    : LN\n\n/**\n * @hidden\n */\ntype _GapsOf<L1 extends List, L2 extends List[], LN extends List = [], L2D extends List[] = L2, I extends Iteration = IterationOf<0>> = {\n    0: _GapsOf<L1, L2, GapOf<L1, L2, LN, I>, Tail<L2D>, Next<I>>\n    1: Concat<LN, JoinParams<L2D>>\n}[Extends<Pos<I>, Length<L1>>]\n\n/**\n * @hidden\n */\ntype GapsOf<L1 extends List, L2 extends List> =\n    _GapsOf<L1, SplitParams<L2>> extends infer X\n    ? Cast<X, List>\n    : never\n\n/**\n * @hidden\n */\ntype Gaps<L extends List> = Cast<NonNullableFlat<{\n    [K in keyof L]?: L[K] | x\n}>, List>\n\n/**\n * Curry a [[Function]]\n * @param F to curry\n * @returns [[Function]]\n * @example\n * ```ts\n * import {F} from 'ts-toolbelt'\n *\n * /// If you are looking for creating types for `curry`\n * /// It handles placeholders and variable arguments\n * declare function curry<Fn extends F.Function>(fn: Fn): F.Curry<Fn>\n * ```\n */\nexport type Curry<F extends Function> =\n    <\n        P extends Gaps<Parameters<F>>,\n        G extends List = GapsOf<P, Parameters<F>>,\n        R extends any = Return<F>\n    >(...p: Gaps<Parameters<F>> | P) =>\n        // handles optional parameters\n        RequiredKeys<G> extends never\n        ? R\n        : Curry<(...p: G) => R>\n"
  },
  {
    "path": "sources/Function/Exact.ts",
    "content": "import {Narrowable} from './_Internal'\n\n/**\n * Force `A` to comply with `W`. `A` must be a shape of `W`. In other words, `A`\n * must extend `W` and have the same properties - no more, no less.\n * @param A\n * @param W\n */\ntype Exact<A, W> =\nW extends unknown ?\n    A extends W\n    ? A extends Narrowable\n      ? A\n      : {\n            [K in keyof A]: K extends keyof W\n                            ? Exact<A[K], W[K]>\n                            : never\n        }\n    : W\n: never;\n\nexport {Exact}\n"
  },
  {
    "path": "sources/Function/Function.ts",
    "content": "import {List} from '../List/List'\n\n/**\n * Alias to create a [[Function]]\n * @param P parameters\n * @param R return type\n * @returns [[Function]]\n * @example\n * ```ts\n * import {F} from 'ts-toolbelt'\n *\n * type test0 = F.Function<[string, number], boolean>\n * /// (args_0: string, args_1: number) => boolean\n * ```\n */\nexport type Function<P extends List = any, R extends any = any> =\n    (...args: P) => R\n"
  },
  {
    "path": "sources/Function/Length.ts",
    "content": "import {Function} from './Function'\nimport {Parameters} from './Parameters'\nimport {Length as LLength} from '../List/Length'\n\n/**\n * Extract arguments' length from a [[Function]]\n * @param F to extract from\n * @returns [[String]] or `number`\n * @example\n * ```ts\n * import {F} from 'ts-toolbelt'\n *\n * const fn = (a1: any, a2: any) => {}\n *\n * type test0 = F.LengthOf<typeof fn>               // 2\n *\n * type test1 = F.LengthOf<(a1?: any) => any>       // 0 | 1\n *\n * type test2 = F.LengthOf<(...a: any[]) => any>    // number\n * ```\n */\nexport type Length<Fn extends Function> =\n    LLength<Parameters<Fn>>\n"
  },
  {
    "path": "sources/Function/Narrow.ts",
    "content": "import {Try} from '../Any/Try'\nimport {Narrowable} from './_Internal'\n\n/**\n * @hidden\n */\ntype NarrowRaw<A> =\n| (A extends [] ? [] : never)\n| (A extends Narrowable ? A : never)\n| ({[K in keyof A]: A[K] extends Function\n                    ? A[K]\n                    : NarrowRaw<A[K]>});\n\n/**\n * Prevent type widening on generic function parameters\n * @param A to narrow\n * @returns `A`\n * @example\n * ```ts\n * import {F} from 'ts-toolbelt'\n *\n * declare function foo<A extends any[]>(x: F.Narrow<A>): A;\n * declare function bar<A extends object>(x: F.Narrow<A>): A;\n *\n * const test0 = foo(['e', 2, true, {f: ['g', ['h']]}])\n * // `A` inferred : ['e', 2, true, {f: ['g']}]\n *\n * const test1 = bar({a: 1, b: 'c', d: ['e', 2, true, {f: ['g']}]})\n * // `A` inferred : {a: 1, b: 'c', d: ['e', 2, true, {f: ['g']}]}\n * ```\n */\ntype Narrow<A extends any> =\n    Try<A, [], NarrowRaw<A>>\n\nexport {Narrow}\n"
  },
  {
    "path": "sources/Function/NoInfer.ts",
    "content": "/**\n * Explain to TS which function parameter has priority for generic inference\n * @param A to de-prioritize\n * @returns `A`\n * @example\n * ```ts\n * import {F} from 'ts-toolbelt'\n *\n * const fn0 = <A extends any>(a0: A, a1: F.NoInfer<A>): A => {\n *  return {} as unknown as A // just for the example\n * }\n *\n * const fn1 = <A extends any>(a0: F.NoInfer<A>, a1: A): A => {\n *  return {} as unknown as A // just for the example\n * }\n *\n * const fn2 = <A extends any>(a0: F.NoInfer<A>, a1: F.NoInfer<A>): A => {\n *  return {} as unknown as A // just for the example\n * }\n *\n * const test0 = fn0('b', 'a') // error: infer priority is `a0`\n * const test1 = fn1('b', 'a') // error: infer priority is `a1`\n * const test2 = fn2('b', 'a') // works: infer priority is `a0` | `a1`\n * ```\n * @see https://stackoverflow.com/questions/56687668\n */\nexport type NoInfer<A extends any> =\n    [A][A extends any ? 0 : never]\n\n/*\n * https://github.com/microsoft/TypeScript/issues/14829#issuecomment-322267089\n * https://stackoverflow.com/questions/56687668\n */\n\n\n"
  },
  {
    "path": "sources/Function/Parameters.ts",
    "content": "import {Function} from './Function'\n\n/**\n * Extract parameters from a [[Function]]\n * @param F to extract from\n * @returns [[List]]\n * @example\n * ```ts\n * import {F} from 'ts-toolbelt'\n *\n * const fn = (name: string, age: number) => {}\n *\n * type test0 = F.ParamsOf<typeof fn>                         // [string, number]\n *\n * type test1 = F.ParamsOf<(name: string, age: number) => {}> // [string, number]\n * ```\n */\nexport type Parameters<F extends Function> =\n    F extends ((...args: infer L) => any)\n    ? L\n    : never\n"
  },
  {
    "path": "sources/Function/Pipe/List/Async.ts",
    "content": "/** @ignore *//** */\nimport {Function} from '../../Function'\nimport {Await} from '../../../Any/Await'\nimport {Curry} from '../../Curry'\n\n/**\n *@hidden\n */\nexport type PipeListAsync = {\n    <\n        R0,\n        P extends any[],\n    >(fns: [\n        Function<P,                 R0> | Curry<Function<P,           R0>>,\n    ]): Function<P,   Promise<Await<R0>>>\n\n    <\n        R0,\n        R1,\n        P extends any[],\n    >(fns: [\n        Function<P,                 R0> | Curry<Function<P,           R0>>,\n        Function<[Await<R0>],       R1> | Curry<Function<[Await<R0>], R1>>,\n    ]): Function<P,   Promise<Await<R1>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        P extends any[],\n    >(fns: [\n        Function<P,                 R0> | Curry<Function<P,           R0>>,\n        Function<[Await<R0>],       R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<[Await<R1>],       R2> | Curry<Function<[Await<R1>], R2>>,\n    ]): Function<P,   Promise<Await<R2>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        P extends any[],\n    >(fns: [\n        Function<P,                 R0> | Curry<Function<P,           R0>>,\n        Function<[Await<R0>],       R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<[Await<R1>],       R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R2>],       R3> | Curry<Function<[Await<R2>], R3>>,\n    ]): Function<P,   Promise<Await<R3>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        P extends any[],\n    >(fns: [\n        Function<P,                 R0> | Curry<Function<P,           R0>>,\n        Function<[Await<R0>],       R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<[Await<R1>],       R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R2>],       R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R3>],       R4> | Curry<Function<[Await<R3>], R4>>,\n    ]): Function<P,   Promise<Await<R4>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        P extends any[],\n    >(fns: [\n        Function<P,                 R0> | Curry<Function<P,           R0>>,\n        Function<[Await<R0>],       R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<[Await<R1>],       R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R2>],       R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R3>],       R4> | Curry<Function<[Await<R3>], R4>>,\n        Function<[Await<R4>],       R5> | Curry<Function<[Await<R4>], R5>>,\n    ]): Function<P,   Promise<Await<R5>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        P extends any[],\n    >(fns: [\n        Function<P,                 R0> | Curry<Function<P,           R0>>,\n        Function<[Await<R0>],       R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<[Await<R1>],       R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R2>],       R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R3>],       R4> | Curry<Function<[Await<R3>], R4>>,\n        Function<[Await<R4>],       R5> | Curry<Function<[Await<R4>], R5>>,\n        Function<[Await<R5>],       R6> | Curry<Function<[Await<R5>], R6>>,\n    ]): Function<P,   Promise<Await<R6>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        R7,\n        P extends any[],\n    >(fns: [\n        Function<P,                 R0> | Curry<Function<P,           R0>>,\n        Function<[Await<R0>],       R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<[Await<R1>],       R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R2>],       R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R3>],       R4> | Curry<Function<[Await<R3>], R4>>,\n        Function<[Await<R4>],       R5> | Curry<Function<[Await<R4>], R5>>,\n        Function<[Await<R5>],       R6> | Curry<Function<[Await<R5>], R6>>,\n        Function<[Await<R6>],       R7> | Curry<Function<[Await<R6>], R7>>,\n    ]): Function<P,   Promise<Await<R7>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        R7,\n        R8,\n        P extends any[],\n    >(fns: [\n        Function<P,                 R0> | Curry<Function<P,           R0>>,\n        Function<[Await<R0>],       R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<[Await<R1>],       R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R2>],       R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R3>],       R4> | Curry<Function<[Await<R3>], R4>>,\n        Function<[Await<R4>],       R5> | Curry<Function<[Await<R4>], R5>>,\n        Function<[Await<R5>],       R6> | Curry<Function<[Await<R5>], R6>>,\n        Function<[Await<R6>],       R7> | Curry<Function<[Await<R6>], R7>>,\n        Function<[Await<R7>],       R8> | Curry<Function<[Await<R7>], R8>>,\n    ]): Function<P,   Promise<Await<R8>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        R7,\n        R8,\n        R9,\n        P extends any[],\n    >(fns: [\n        Function<P,                 R0> | Curry<Function<P,           R0>>,\n        Function<[Await<R0>],       R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<[Await<R1>],       R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R2>],       R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R3>],       R4> | Curry<Function<[Await<R3>], R4>>,\n        Function<[Await<R4>],       R5> | Curry<Function<[Await<R4>], R5>>,\n        Function<[Await<R5>],       R6> | Curry<Function<[Await<R5>], R6>>,\n        Function<[Await<R6>],       R7> | Curry<Function<[Await<R6>], R7>>,\n        Function<[Await<R7>],       R8> | Curry<Function<[Await<R7>], R8>>,\n        Function<[Await<R8>],       R9> | Curry<Function<[Await<R8>], R9>>,\n    ]): Function<P,   Promise<Await<R9>>>\n}\n"
  },
  {
    "path": "sources/Function/Pipe/List/Sync.ts",
    "content": "/** @ignore *//** */\n\nimport {Curry} from '../../Curry'\nimport {Function} from '../../Function'\n\n/**\n *@hidden\n */\nexport type PipeListSync = {\n    <\n        R0,\n        P extends any[],\n    >(fns: [\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n    ]): Function<P,    R0>\n\n    <\n        R0,\n        R1,\n        P extends any[],\n    >(fns: [\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n    ]): Function<P,    R1>\n\n    <\n        R0,\n        R1,\n        R2,\n        P extends any[],\n    >(fns: [\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n    ]): Function<P,    R2>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        P extends any[],\n    >(fns: [\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n    ]): Function<P,    R3>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        P extends any[],\n    >(fns: [\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R3], R4> | Curry<Function<[R3], R4>>,\n    ]): Function<P,    R4>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        P extends any[],\n    >(fns: [\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R3], R4> | Curry<Function<[R3], R4>>,\n        Function<[R4], R5> | Curry<Function<[R4], R5>>,\n    ]): Function<P,    R5>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        P extends any[],\n    >(fns: [\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R3], R4> | Curry<Function<[R3], R4>>,\n        Function<[R4], R5> | Curry<Function<[R4], R5>>,\n        Function<[R5], R6> | Curry<Function<[R5], R6>>,\n    ]): Function<P,    R6>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        R7,\n        P extends any[],\n    >(fns: [\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R3], R4> | Curry<Function<[R3], R4>>,\n        Function<[R4], R5> | Curry<Function<[R4], R5>>,\n        Function<[R5], R6> | Curry<Function<[R5], R6>>,\n        Function<[R6], R7> | Curry<Function<[R6], R7>>,\n    ]): Function<P,    R7>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        R7,\n        R8,\n        P extends any[],\n    >(fns: [\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R3], R4> | Curry<Function<[R3], R4>>,\n        Function<[R4], R5> | Curry<Function<[R4], R5>>,\n        Function<[R5], R6> | Curry<Function<[R5], R6>>,\n        Function<[R6], R7> | Curry<Function<[R6], R7>>,\n        Function<[R7], R8> | Curry<Function<[R7], R8>>,\n    ]): Function<P,    R8>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        R7,\n        R8,\n        R9,\n        P extends any[],\n    >(fns: [\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R3], R4> | Curry<Function<[R3], R4>>,\n        Function<[R4], R5> | Curry<Function<[R4], R5>>,\n        Function<[R5], R6> | Curry<Function<[R5], R6>>,\n        Function<[R6], R7> | Curry<Function<[R6], R7>>,\n        Function<[R7], R8> | Curry<Function<[R7], R8>>,\n        Function<[R8], R9> | Curry<Function<[R8], R9>>,\n    ]): Function<P,    R9>\n}\n"
  },
  {
    "path": "sources/Function/Pipe/Multi/Async.ts",
    "content": "/** @ignore *//** */\n\nimport {Function} from '../../Function'\nimport {Await} from '../../../Any/Await'\nimport {Curry} from '../../Curry'\n\n/**\n *@hidden\n */\nexport type PipeMultiAsync = {\n    <\n        R0,\n        P extends any[],\n    >(...fns: [\n        Function<P,                 R0> | Curry<Function<P,           R0>>,\n    ]): Function<P,   Promise<Await<R0>>>\n\n    <\n        R0,\n        R1,\n        P extends any[],\n    >(...fns: [\n        Function<P,                 R0> | Curry<Function<P,           R0>>,\n        Function<[Await<R0>],       R1> | Curry<Function<[Await<R0>], R1>>,\n    ]): Function<P,   Promise<Await<R1>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        P extends any[],\n    >(...fns: [\n        Function<P,                 R0> | Curry<Function<P,           R0>>,\n        Function<[Await<R0>],       R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<[Await<R1>],       R2> | Curry<Function<[Await<R1>], R2>>,\n    ]): Function<P,   Promise<Await<R2>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        P extends any[],\n    >(...fns: [\n        Function<P,                 R0> | Curry<Function<P,           R0>>,\n        Function<[Await<R0>],       R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<[Await<R1>],       R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R2>],       R3> | Curry<Function<[Await<R2>], R3>>,\n    ]): Function<P,   Promise<Await<R3>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        P extends any[],\n    >(...fns: [\n        Function<P,                 R0> | Curry<Function<P,           R0>>,\n        Function<[Await<R0>],       R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<[Await<R1>],       R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R2>],       R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R3>],       R4> | Curry<Function<[Await<R3>], R4>>,\n    ]): Function<P,   Promise<Await<R4>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        P extends any[],\n    >(...fns: [\n        Function<P,                 R0> | Curry<Function<P,           R0>>,\n        Function<[Await<R0>],       R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<[Await<R1>],       R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R2>],       R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R3>],       R4> | Curry<Function<[Await<R3>], R4>>,\n        Function<[Await<R4>],       R5> | Curry<Function<[Await<R4>], R5>>,\n    ]): Function<P,   Promise<Await<R5>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        P extends any[],\n    >(...fns: [\n        Function<P,                 R0> | Curry<Function<P,           R0>>,\n        Function<[Await<R0>],       R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<[Await<R1>],       R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R2>],       R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R3>],       R4> | Curry<Function<[Await<R3>], R4>>,\n        Function<[Await<R4>],       R5> | Curry<Function<[Await<R4>], R5>>,\n        Function<[Await<R5>],       R6> | Curry<Function<[Await<R5>], R6>>,\n    ]): Function<P,   Promise<Await<R6>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        R7,\n        P extends any[],\n    >(...fns: [\n        Function<P,                 R0> | Curry<Function<P,           R0>>,\n        Function<[Await<R0>],       R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<[Await<R1>],       R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R2>],       R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R3>],       R4> | Curry<Function<[Await<R3>], R4>>,\n        Function<[Await<R4>],       R5> | Curry<Function<[Await<R4>], R5>>,\n        Function<[Await<R5>],       R6> | Curry<Function<[Await<R5>], R6>>,\n        Function<[Await<R6>],       R7> | Curry<Function<[Await<R6>], R7>>,\n    ]): Function<P,   Promise<Await<R7>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        R7,\n        R8,\n        P extends any[],\n    >(...fns: [\n        Function<P,                 R0> | Curry<Function<P,           R0>>,\n        Function<[Await<R0>],       R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<[Await<R1>],       R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R2>],       R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R3>],       R4> | Curry<Function<[Await<R3>], R4>>,\n        Function<[Await<R4>],       R5> | Curry<Function<[Await<R4>], R5>>,\n        Function<[Await<R5>],       R6> | Curry<Function<[Await<R5>], R6>>,\n        Function<[Await<R6>],       R7> | Curry<Function<[Await<R6>], R7>>,\n        Function<[Await<R7>],       R8> | Curry<Function<[Await<R7>], R8>>,\n    ]): Function<P,   Promise<Await<R8>>>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        R7,\n        R8,\n        R9,\n        P extends any[],\n    >(...fns: [\n        Function<P,                 R0> | Curry<Function<P,           R0>>,\n        Function<[Await<R0>],       R1> | Curry<Function<[Await<R0>], R1>>,\n        Function<[Await<R1>],       R2> | Curry<Function<[Await<R1>], R2>>,\n        Function<[Await<R2>],       R3> | Curry<Function<[Await<R2>], R3>>,\n        Function<[Await<R3>],       R4> | Curry<Function<[Await<R3>], R4>>,\n        Function<[Await<R4>],       R5> | Curry<Function<[Await<R4>], R5>>,\n        Function<[Await<R5>],       R6> | Curry<Function<[Await<R5>], R6>>,\n        Function<[Await<R6>],       R7> | Curry<Function<[Await<R6>], R7>>,\n        Function<[Await<R7>],       R8> | Curry<Function<[Await<R7>], R8>>,\n        Function<[Await<R8>],       R9> | Curry<Function<[Await<R8>], R9>>,\n    ]): Function<P,   Promise<Await<R9>>>\n}\n"
  },
  {
    "path": "sources/Function/Pipe/Multi/Sync.ts",
    "content": "/** @ignore *//** */\n\nimport {Curry} from '../../Curry'\nimport {Function} from '../../Function'\n\n/**\n *@hidden\n */\nexport type PipeMultiSync = {\n    <\n        R0,\n        P extends any[],\n    >(...fns: [\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n    ]): Function<P,    R0>\n\n    <\n        R0,\n        R1,\n        P extends any[],\n    >(...fns: [\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n    ]): Function<P,    R1>\n\n    <\n        R0,\n        R1,\n        R2,\n        P extends any[],\n    >(...fns: [\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n    ]): Function<P,    R2>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        P extends any[],\n    >(...fns: [\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n    ]): Function<P,    R3>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        P extends any[],\n    >(...fns: [\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R3], R4> | Curry<Function<[R3], R4>>,\n    ]): Function<P,    R4>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        P extends any[],\n    >(...fns: [\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R3], R4> | Curry<Function<[R3], R4>>,\n        Function<[R4], R5> | Curry<Function<[R4], R5>>,\n    ]): Function<P,    R5>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        P extends any[],\n    >(...fns: [\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R3], R4> | Curry<Function<[R3], R4>>,\n        Function<[R4], R5> | Curry<Function<[R4], R5>>,\n        Function<[R5], R6> | Curry<Function<[R5], R6>>,\n    ]): Function<P,    R6>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        R7,\n        P extends any[],\n    >(...fns: [\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R3], R4> | Curry<Function<[R3], R4>>,\n        Function<[R4], R5> | Curry<Function<[R4], R5>>,\n        Function<[R5], R6> | Curry<Function<[R5], R6>>,\n        Function<[R6], R7> | Curry<Function<[R6], R7>>,\n    ]): Function<P,    R7>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        R7,\n        R8,\n        P extends any[],\n    >(...fns: [\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R3], R4> | Curry<Function<[R3], R4>>,\n        Function<[R4], R5> | Curry<Function<[R4], R5>>,\n        Function<[R5], R6> | Curry<Function<[R5], R6>>,\n        Function<[R6], R7> | Curry<Function<[R6], R7>>,\n        Function<[R7], R8> | Curry<Function<[R7], R8>>,\n    ]): Function<P,    R8>\n\n    <\n        R0,\n        R1,\n        R2,\n        R3,\n        R4,\n        R5,\n        R6,\n        R7,\n        R8,\n        R9,\n        P extends any[],\n    >(...fns: [\n        Function<P,    R0> | Curry<Function<P,    R0>>,\n        Function<[R0], R1> | Curry<Function<[R0], R1>>,\n        Function<[R1], R2> | Curry<Function<[R1], R2>>,\n        Function<[R2], R3> | Curry<Function<[R2], R3>>,\n        Function<[R3], R4> | Curry<Function<[R3], R4>>,\n        Function<[R4], R5> | Curry<Function<[R4], R5>>,\n        Function<[R5], R6> | Curry<Function<[R5], R6>>,\n        Function<[R6], R7> | Curry<Function<[R6], R7>>,\n        Function<[R7], R8> | Curry<Function<[R7], R8>>,\n        Function<[R8], R9> | Curry<Function<[R8], R9>>,\n    ]): Function<P,    R9>\n}\n"
  },
  {
    "path": "sources/Function/Pipe.ts",
    "content": "import {IntersectOf} from '../Union/IntersectOf'\nimport {PipeListAsync} from './Pipe/List/Async'\nimport {PipeListSync} from './Pipe/List/Sync'\nimport {PipeMultiAsync} from './Pipe/Multi/Async'\nimport {PipeMultiSync} from './Pipe/Multi/Sync'\nimport {Input, Mode} from './_Internal'\n\n/**\n * Pipe [[Function]]s together\n * @param mode (?=`'sync'`) sync/async (this depends on your implementation)\n * @param input (?=`'multi'`) whether you want to take a list or multiple parameters\n * @returns [[Function]]\n * @example\n * ```ts\n * import {F} from 'ts-toolbelt'\n *\n * /// If you are looking for creating types for `pipe`:\n * declare const pipe: F.Pipe\n *\n * const a = (a1: number) => `${a1}`\n * const b = (b1: string) => [b1]\n * const c = (c1: string[]) => [c1]\n *\n * pipe(a, b, c)(42)\n *\n * /// And if you are looking for an async `pipe` type:\n * declare const pipe: F.Pipe<'async'>\n *\n * const a = async (a1: number) => `${a1}`\n * const b = async (b1: string) => [b1]\n * const c = async (c1: string[]) => [c1]\n *\n * await pipe(a, b, c)(42)\n * ```\n */\nexport type Pipe<mode extends Mode = 'sync', input extends Input = 'multi'> = IntersectOf<{\n    'sync' : {\n        'multi': PipeMultiSync\n        'list' : PipeListSync\n    }\n    'async': {\n        'multi': PipeMultiAsync\n        'list' : PipeListAsync\n    }\n}[mode][input]> // `IntersectOf` in case of unions\n"
  },
  {
    "path": "sources/Function/Promisify.ts",
    "content": "import {Function} from './Function'\nimport {Parameters} from './Parameters'\nimport {Return} from './Return'\nimport {Promise} from '../Any/Promise'\n\n/**\n * Creates a promisified version of a `Function` `F`\n * @param F to promisify\n * @returns async F\n * @example\n * ```ts\n * import {F} from 'ts-toolbelt'\n *\n * type test0 = F.Promisify<(a: number) => number> // (a: number) => Promise<number>\n * ```\n */\nexport type Promisify<F extends Function> =\n    (...args: Parameters<F>) => Promise<Return<F>>\n"
  },
  {
    "path": "sources/Function/Return.ts",
    "content": "import {Function} from './Function'\nimport {List} from '../List/List'\n\n/**\n * Extract the return type of a [[Function]]\n * @param F to extract from\n * @returns [[Any]]\n * @example\n * ```ts\n * import {F} from 'ts-toolbelt'\n *\n * const fn = () => true\n *\n * type test0 = F.ReturnOf<typeof fn>  // boolean\n *\n * type test1 = F.ReturnOf<() => true> // true\n * ```\n */\nexport type Return<F extends Function> =\n    F extends ((...args: List) => infer R)\n    ? R\n    : never\n"
  },
  {
    "path": "sources/Function/UnCurry.ts",
    "content": "import {Curry} from './Curry'\n\n/**\n * Undoes the work that was done by [[Curry]]\n * @param F to uncurry\n * @returns [[Function]]\n * @example\n * ```ts\n * import {F} from 'ts-toolbelt'\n *\n * type test0 = F.Curry<(a: string, b: number) => boolean>\n * declare const foo: test0\n * const res0 = foo('a') // F.Curry<(b: number) => boolean> & ((b: number) => boolean)\n *\n * type test1 = F.UnCurry<test0> // (a: string, b: number) => boolean\n * declare const bar: test1\n * const res1 = bar('a') // TS2554: Expected 2 arguments, but got 1.\n * ```\n * @ignore\n */\nexport type UnCurry<F extends Curry<any>> =\n    F extends Curry<infer UF>\n    ? UF\n    : never\n"
  },
  {
    "path": "sources/Function/ValidPath.ts",
    "content": "import {IterationOf} from '../Iteration/IterationOf'\nimport {Iteration} from '../Iteration/Iteration'\nimport {Next} from '../Iteration/Next'\nimport {Pos} from '../Iteration/Pos'\nimport {At} from '../Any/At'\nimport {Cast} from '../Any/Cast'\nimport {NonNullable} from '../Union/NonNullable'\nimport {Update} from '../List/Update'\nimport {Key} from '../Iteration/Key'\nimport {Key as AKey} from '../Any/Key'\nimport {List} from '../List/List'\nimport {Length} from '../List/Length'\nimport {Extends} from '../Any/Extends'\n\n/**\n * @hidden\n */\ntype ValidatePath<O, Path extends List<AKey>, I extends Iteration> =\n    Update<\n        Path,\n        Key<I>,\n        [At<O & {}, Path[Pos<I>]>] extends [never]\n        ? keyof O\n        : Path[Pos<I>]\n    >\n\n/**\n * @hidden\n */\ntype __ValidPath<O, Path extends List<AKey>, I extends Iteration = IterationOf<0>> = {\n    0: __ValidPath<NonNullable<At<O & {}, Path[Pos<I>]>>, ValidatePath<O, Path, I>, Next<I>>\n    1: Path\n}[Extends<Pos<I>, Length<Path>>]\n\n/**\n * @hidden\n */\nexport type _ValidPath<O extends object, Path extends List<AKey>> =\n    __ValidPath<O, Path> extends infer X\n    ? Cast<X, List<AKey>>\n    : never\n\n/**\n * Replaces invalid parts of a path with `never`\n * @param O to be inspected\n * @param Path to be validated\n * @returns [[Index]][]\n * @example\n * ```ts\n * import {A, L, O} from 'ts-toolbelt'\n *\n * // Get a property in an object `o` at any depth with `path`\n * // `A.Cast<P, O.ValidPath<O, P>>` makes sure `path` is valid\n * const getAt = <\n * O extends object,\n * P extends L.List<A.Index>\n * >(o: O, path: A.Cast<P, O.ValidPath<O, P>>): O.Path<O, P> => {\n *     let valueAt = o\n *\n *     for (const p of path)\n *         valueAt = valueAt[p]\n *\n *     return valueAt as any\n * }\n *\n * const test0 = getAt({a: {b: {c: 1}}},          ['a', 'b'] as const) // {c: number}\n * const test1 = getAt({a: {b: {c: 1}}} as const, ['a', 'b'] as const) // {c: 1}\n * const test2 = getAt({a: {b: {c: 1}}},          ['x'] as const)      // error\n * ```\n */\nexport type ValidPath<O extends object, Path extends List<AKey>> =\n    O extends unknown\n    ? Path extends unknown\n      ? _ValidPath<O, Path>\n      : never\n    : never\n"
  },
  {
    "path": "sources/Function/_Internal.ts",
    "content": "/**\n * Describes function modes\n * `sync` : Normal function\n * `async`: Promised result\n */\nexport type Mode = 'sync' | 'async'\n\n/**\n * Describes function parameter input\n * `multi`: ( a, b, c ... n ) => X\n * `list` : ([a, b, c ... n]) => X\n */\nexport type Input = 'multi' | 'list'\n\n/**\n * Describes types that can be narrowed\n */\nexport type Narrowable =\n| string\n| number\n| bigint\n| boolean\n"
  },
  {
    "path": "sources/Function/_api.ts",
    "content": "/** @ignore *//** */\n\nexport {AutoPath} from './AutoPath'\nexport {Compose} from './Compose'\nexport {Exact} from './Exact'\nexport {Curry} from './Curry'\nexport {Function} from './Function'\nexport {Narrow} from './Narrow'\nexport {Length} from './Length'\nexport {NoInfer} from './NoInfer'\nexport {Parameters} from './Parameters'\nexport {Pipe} from './Pipe'\nexport {Promisify} from './Promisify'\nexport {Return} from './Return'\nexport {UnCurry} from './UnCurry'\nexport {ValidPath} from './ValidPath'\n"
  },
  {
    "path": "sources/Iteration/Iteration.ts",
    "content": "/**\n * An entry of `IterationMap`\n */\nexport type Iteration = [\n    value: number,\n    sign: '-' | '0' | '+',\n    prev: keyof IterationMap,\n    next: keyof IterationMap,\n    oppo: keyof IterationMap,\n]\n\nexport type IterationMap = {\n    '__': [number, '-' | '0' | '+', '__', '__', '__'],\n    '-100': [-100, '-', '__', '-99', '100'],\n    '-99': [-99, '-', '-100', '-98', '99'],\n    '-98': [-98, '-', '-99', '-97', '98'],\n    '-97': [-97, '-', '-98', '-96', '97'],\n    '-96': [-96, '-', '-97', '-95', '96'],\n    '-95': [-95, '-', '-96', '-94', '95'],\n    '-94': [-94, '-', '-95', '-93', '94'],\n    '-93': [-93, '-', '-94', '-92', '93'],\n    '-92': [-92, '-', '-93', '-91', '92'],\n    '-91': [-91, '-', '-92', '-90', '91'],\n    '-90': [-90, '-', '-91', '-89', '90'],\n    '-89': [-89, '-', '-90', '-88', '89'],\n    '-88': [-88, '-', '-89', '-87', '88'],\n    '-87': [-87, '-', '-88', '-86', '87'],\n    '-86': [-86, '-', '-87', '-85', '86'],\n    '-85': [-85, '-', '-86', '-84', '85'],\n    '-84': [-84, '-', '-85', '-83', '84'],\n    '-83': [-83, '-', '-84', '-82', '83'],\n    '-82': [-82, '-', '-83', '-81', '82'],\n    '-81': [-81, '-', '-82', '-80', '81'],\n    '-80': [-80, '-', '-81', '-79', '80'],\n    '-79': [-79, '-', '-80', '-78', '79'],\n    '-78': [-78, '-', '-79', '-77', '78'],\n    '-77': [-77, '-', '-78', '-76', '77'],\n    '-76': [-76, '-', '-77', '-75', '76'],\n    '-75': [-75, '-', '-76', '-74', '75'],\n    '-74': [-74, '-', '-75', '-73', '74'],\n    '-73': [-73, '-', '-74', '-72', '73'],\n    '-72': [-72, '-', '-73', '-71', '72'],\n    '-71': [-71, '-', '-72', '-70', '71'],\n    '-70': [-70, '-', '-71', '-69', '70'],\n    '-69': [-69, '-', '-70', '-68', '69'],\n    '-68': [-68, '-', '-69', '-67', '68'],\n    '-67': [-67, '-', '-68', '-66', '67'],\n    '-66': [-66, '-', '-67', '-65', '66'],\n    '-65': [-65, '-', '-66', '-64', '65'],\n    '-64': [-64, '-', '-65', '-63', '64'],\n    '-63': [-63, '-', '-64', '-62', '63'],\n    '-62': [-62, '-', '-63', '-61', '62'],\n    '-61': [-61, '-', '-62', '-60', '61'],\n    '-60': [-60, '-', '-61', '-59', '60'],\n    '-59': [-59, '-', '-60', '-58', '59'],\n    '-58': [-58, '-', '-59', '-57', '58'],\n    '-57': [-57, '-', '-58', '-56', '57'],\n    '-56': [-56, '-', '-57', '-55', '56'],\n    '-55': [-55, '-', '-56', '-54', '55'],\n    '-54': [-54, '-', '-55', '-53', '54'],\n    '-53': [-53, '-', '-54', '-52', '53'],\n    '-52': [-52, '-', '-53', '-51', '52'],\n    '-51': [-51, '-', '-52', '-50', '51'],\n    '-50': [-50, '-', '-51', '-49', '50'],\n    '-49': [-49, '-', '-50', '-48', '49'],\n    '-48': [-48, '-', '-49', '-47', '48'],\n    '-47': [-47, '-', '-48', '-46', '47'],\n    '-46': [-46, '-', '-47', '-45', '46'],\n    '-45': [-45, '-', '-46', '-44', '45'],\n    '-44': [-44, '-', '-45', '-43', '44'],\n    '-43': [-43, '-', '-44', '-42', '43'],\n    '-42': [-42, '-', '-43', '-41', '42'],\n    '-41': [-41, '-', '-42', '-40', '41'],\n    '-40': [-40, '-', '-41', '-39', '40'],\n    '-39': [-39, '-', '-40', '-38', '39'],\n    '-38': [-38, '-', '-39', '-37', '38'],\n    '-37': [-37, '-', '-38', '-36', '37'],\n    '-36': [-36, '-', '-37', '-35', '36'],\n    '-35': [-35, '-', '-36', '-34', '35'],\n    '-34': [-34, '-', '-35', '-33', '34'],\n    '-33': [-33, '-', '-34', '-32', '33'],\n    '-32': [-32, '-', '-33', '-31', '32'],\n    '-31': [-31, '-', '-32', '-30', '31'],\n    '-30': [-30, '-', '-31', '-29', '30'],\n    '-29': [-29, '-', '-30', '-28', '29'],\n    '-28': [-28, '-', '-29', '-27', '28'],\n    '-27': [-27, '-', '-28', '-26', '27'],\n    '-26': [-26, '-', '-27', '-25', '26'],\n    '-25': [-25, '-', '-26', '-24', '25'],\n    '-24': [-24, '-', '-25', '-23', '24'],\n    '-23': [-23, '-', '-24', '-22', '23'],\n    '-22': [-22, '-', '-23', '-21', '22'],\n    '-21': [-21, '-', '-22', '-20', '21'],\n    '-20': [-20, '-', '-21', '-19', '20'],\n    '-19': [-19, '-', '-20', '-18', '19'],\n    '-18': [-18, '-', '-19', '-17', '18'],\n    '-17': [-17, '-', '-18', '-16', '17'],\n    '-16': [-16, '-', '-17', '-15', '16'],\n    '-15': [-15, '-', '-16', '-14', '15'],\n    '-14': [-14, '-', '-15', '-13', '14'],\n    '-13': [-13, '-', '-14', '-12', '13'],\n    '-12': [-12, '-', '-13', '-11', '12'],\n    '-11': [-11, '-', '-12', '-10', '11'],\n    '-10': [-10, '-', '-11', '-9', '10'],\n    '-9': [-9, '-', '-10', '-8', '9'],\n    '-8': [-8, '-', '-9', '-7', '8'],\n    '-7': [-7, '-', '-8', '-6', '7'],\n    '-6': [-6, '-', '-7', '-5', '6'],\n    '-5': [-5, '-', '-6', '-4', '5'],\n    '-4': [-4, '-', '-5', '-3', '4'],\n    '-3': [-3, '-', '-4', '-2', '3'],\n    '-2': [-2, '-', '-3', '-1', '2'],\n    '-1': [-1, '-', '-2', '0', '1'],\n    '0': [0, '0', '-1', '1', '0'],\n    '1': [1, '+', '0', '2', '-1'],\n    '2': [2, '+', '1', '3', '-2'],\n    '3': [3, '+', '2', '4', '-3'],\n    '4': [4, '+', '3', '5', '-4'],\n    '5': [5, '+', '4', '6', '-5'],\n    '6': [6, '+', '5', '7', '-6'],\n    '7': [7, '+', '6', '8', '-7'],\n    '8': [8, '+', '7', '9', '-8'],\n    '9': [9, '+', '8', '10', '-9'],\n    '10': [10, '+', '9', '11', '-10'],\n    '11': [11, '+', '10', '12', '-11'],\n    '12': [12, '+', '11', '13', '-12'],\n    '13': [13, '+', '12', '14', '-13'],\n    '14': [14, '+', '13', '15', '-14'],\n    '15': [15, '+', '14', '16', '-15'],\n    '16': [16, '+', '15', '17', '-16'],\n    '17': [17, '+', '16', '18', '-17'],\n    '18': [18, '+', '17', '19', '-18'],\n    '19': [19, '+', '18', '20', '-19'],\n    '20': [20, '+', '19', '21', '-20'],\n    '21': [21, '+', '20', '22', '-21'],\n    '22': [22, '+', '21', '23', '-22'],\n    '23': [23, '+', '22', '24', '-23'],\n    '24': [24, '+', '23', '25', '-24'],\n    '25': [25, '+', '24', '26', '-25'],\n    '26': [26, '+', '25', '27', '-26'],\n    '27': [27, '+', '26', '28', '-27'],\n    '28': [28, '+', '27', '29', '-28'],\n    '29': [29, '+', '28', '30', '-29'],\n    '30': [30, '+', '29', '31', '-30'],\n    '31': [31, '+', '30', '32', '-31'],\n    '32': [32, '+', '31', '33', '-32'],\n    '33': [33, '+', '32', '34', '-33'],\n    '34': [34, '+', '33', '35', '-34'],\n    '35': [35, '+', '34', '36', '-35'],\n    '36': [36, '+', '35', '37', '-36'],\n    '37': [37, '+', '36', '38', '-37'],\n    '38': [38, '+', '37', '39', '-38'],\n    '39': [39, '+', '38', '40', '-39'],\n    '40': [40, '+', '39', '41', '-40'],\n    '41': [41, '+', '40', '42', '-41'],\n    '42': [42, '+', '41', '43', '-42'],\n    '43': [43, '+', '42', '44', '-43'],\n    '44': [44, '+', '43', '45', '-44'],\n    '45': [45, '+', '44', '46', '-45'],\n    '46': [46, '+', '45', '47', '-46'],\n    '47': [47, '+', '46', '48', '-47'],\n    '48': [48, '+', '47', '49', '-48'],\n    '49': [49, '+', '48', '50', '-49'],\n    '50': [50, '+', '49', '51', '-50'],\n    '51': [51, '+', '50', '52', '-51'],\n    '52': [52, '+', '51', '53', '-52'],\n    '53': [53, '+', '52', '54', '-53'],\n    '54': [54, '+', '53', '55', '-54'],\n    '55': [55, '+', '54', '56', '-55'],\n    '56': [56, '+', '55', '57', '-56'],\n    '57': [57, '+', '56', '58', '-57'],\n    '58': [58, '+', '57', '59', '-58'],\n    '59': [59, '+', '58', '60', '-59'],\n    '60': [60, '+', '59', '61', '-60'],\n    '61': [61, '+', '60', '62', '-61'],\n    '62': [62, '+', '61', '63', '-62'],\n    '63': [63, '+', '62', '64', '-63'],\n    '64': [64, '+', '63', '65', '-64'],\n    '65': [65, '+', '64', '66', '-65'],\n    '66': [66, '+', '65', '67', '-66'],\n    '67': [67, '+', '66', '68', '-67'],\n    '68': [68, '+', '67', '69', '-68'],\n    '69': [69, '+', '68', '70', '-69'],\n    '70': [70, '+', '69', '71', '-70'],\n    '71': [71, '+', '70', '72', '-71'],\n    '72': [72, '+', '71', '73', '-72'],\n    '73': [73, '+', '72', '74', '-73'],\n    '74': [74, '+', '73', '75', '-74'],\n    '75': [75, '+', '74', '76', '-75'],\n    '76': [76, '+', '75', '77', '-76'],\n    '77': [77, '+', '76', '78', '-77'],\n    '78': [78, '+', '77', '79', '-78'],\n    '79': [79, '+', '78', '80', '-79'],\n    '80': [80, '+', '79', '81', '-80'],\n    '81': [81, '+', '80', '82', '-81'],\n    '82': [82, '+', '81', '83', '-82'],\n    '83': [83, '+', '82', '84', '-83'],\n    '84': [84, '+', '83', '85', '-84'],\n    '85': [85, '+', '84', '86', '-85'],\n    '86': [86, '+', '85', '87', '-86'],\n    '87': [87, '+', '86', '88', '-87'],\n    '88': [88, '+', '87', '89', '-88'],\n    '89': [89, '+', '88', '90', '-89'],\n    '90': [90, '+', '89', '91', '-90'],\n    '91': [91, '+', '90', '92', '-91'],\n    '92': [92, '+', '91', '93', '-92'],\n    '93': [93, '+', '92', '94', '-93'],\n    '94': [94, '+', '93', '95', '-94'],\n    '95': [95, '+', '94', '96', '-95'],\n    '96': [96, '+', '95', '97', '-96'],\n    '97': [97, '+', '96', '98', '-97'],\n    '98': [98, '+', '97', '99', '-98'],\n    '99': [99, '+', '98', '100', '-99'],\n    '100': [100, '+', '99', '__', '-100'],\n}\n"
  },
  {
    "path": "sources/Iteration/IterationOf.ts",
    "content": "import {IterationMap} from './Iteration'\n\n/**\n * Transform a number into an [[Iteration]]\n * (to use [[Prev]], [[Next]], & [[Pos]])\n * @param N to transform\n * @returns [[Iteration]]\n * @example\n * ```ts\n * import {I} from 'ts-toolbelt'\n *\n * type i = I.IterationOf<0> // [\"-1\", \"1\", \"0\", 0, \"0\"]\n *\n * type next = I.Next<i>       // [\"0\", \"2\", \"1\", 1, \"+\"]\n * type prev = I.Prev<i>       // [\"-2\", \"0\", \"-1\", -1, \"-\"]\n *\n * type nnext = I.Pos<next>    // +1\n * type nprev = I.Pos<prev>    // -1\n * ```\n */\nexport type IterationOf<N extends number> =\n    `${N}` extends keyof IterationMap\n    ? IterationMap[`${N}`]\n    : IterationMap['__']\n"
  },
  {
    "path": "sources/Iteration/Key.ts",
    "content": "import {Iteration} from './Iteration'\n\n/**\n * Get the position of `I` (**string**)\n * @param I to query\n * @returns [[String]]\n * @example\n * ```ts\n * import {I} from 'ts-toolbelt'\n *\n * type i = I.IterationOf<'20'>\n *\n * type test0 = I.Key<i>         // '20'\n * type test1 = I.Key<I.Next<i>> // '21'\n * ```\n */\nexport type Key<I extends Iteration> =\n    `${I[0]}`\n"
  },
  {
    "path": "sources/Iteration/Next.ts",
    "content": "import {Iteration, IterationMap} from './Iteration'\n\n/**\n * Move `I`'s position forward\n * @param I to move\n * @returns [[Iteration]]\n * @example\n * ```ts\n * import {I} from 'ts-toolbelt'\n *\n * type i = I.IterationOf<'20'>\n *\n * type test0 = I.Pos<i>         // 20\n * type test1 = I.Pos<I.Next<i>> // 21\n * ```\n */\nexport type Next<I extends Iteration> =\n    IterationMap[I[3]]\n"
  },
  {
    "path": "sources/Iteration/Pos.ts",
    "content": "import {Iteration} from './Iteration'\n\n/**\n * Get the position of `I` (**number**)\n * @param I to query\n * @returns `number`\n * @example\n * ```ts\n * import {I} from 'ts-toolbelt'\n *\n * type i = I.IterationOf<'20'>\n *\n * type test0 = I.Pos<i>         // 20\n * type test1 = I.Pos<I.Next<i>> // 21\n * ```\n */\nexport type Pos<I extends Iteration> =\n    I[0]\n"
  },
  {
    "path": "sources/Iteration/Prev.ts",
    "content": "\nimport {Iteration, IterationMap} from './Iteration'\n/**\n * Move `I`'s position backwards\n * @param I to move\n * @returns [[Iteration]]\n * @example\n * ```ts\n * import {I} from 'ts-toolbelt'\n *\n * type i = I.IterationOf<'20'>\n *\n * type test0 = I.Pos<i>         // 20\n * type test1 = I.Pos<I.Prev<i>> // 19\n * ```\n */\nexport type Prev<I extends Iteration> =\n    IterationMap[I[2]] // continues iterating\n"
  },
  {
    "path": "sources/Iteration/_Internal.ts",
    "content": "/**\n * Describes how to perform iterations\n */\nexport type Way = '->' | '<-'\n\n// ---------------------------------------------------------------------------------------\n\n/**\n * Generate the [[IterationOf]] type\n * @param min -40\n * @param max +40\n */\nconst IterationOfGenerator = (min: number, max: number) => {\n    // eslint-disable-next-line no-nested-ternary\n    const sign = (i: number) => `\"${i > 0 ? '+' : i < 0 ? '-' : '0'}\"`\n    const prev = (i: number) => `\"${i === min ? '__' : i - 1}\"`\n    const next = (i: number) => `\"${i === max ? '__' : i + 1}\"`\n    const oppo = (i: number) => `\"${i * -1}\"`\n    const entry = (i: number) => `\"${i}\": [${i}, ${sign(i)}, ${prev(i)}, ${next(i)}, ${oppo(i)}],`\n\n    console.log(`{${entry(min)}`)\n\n    for (let i = min + 1, k = 1; i <= max - 1; i++, k++)\n        console.log(entry(i))\n\n    console.log(`${entry(max)}}`)\n}\n\nIterationOfGenerator(-100, +100)\n"
  },
  {
    "path": "sources/Iteration/_api.ts",
    "content": "/** @ignore *//** */\n\nexport {Iteration} from './Iteration'\nexport {IterationOf} from './IterationOf'\nexport {Key} from './Key'\nexport {Next} from './Next'\nexport {Pos} from './Pos'\nexport {Prev} from './Prev'\n"
  },
  {
    "path": "sources/List/Append.ts",
    "content": "import {List} from './List'\n\n/**\n * Add an element `A` at the end of `L`.\n * @param L to append to\n * @param A to be added to\n * @returns [[List]]\n * @example\n * ```ts\n * import {L} from 'ts-toolbelt'\n *\n * type test0 = L.Append<[1, 2, 3], 4> // [1, 2, 3, 4]\n * type test1 = L.Append<[], 'a'> // ['a']\n * type test2 = L.Append<readonly ['a', 'b'], 'c'> // ['a', 'b', 'c']\n * type test3 = L.Append<[1, 2], [3, 4]> // [1, 2, [3, 4]]\n * ```\n */\nexport type Append<L extends List, A extends any> =\n    [...L, A]\n"
  },
  {
    "path": "sources/List/Assign.ts",
    "content": "import {Assign as OAssign} from '../Object/Assign'\nimport {List} from './List'\nimport {Depth} from '../Object/_Internal'\nimport {BuiltIn} from '../Misc/BuiltIn'\nimport {Cast} from '../Any/Cast'\n\n/**\n * Assign a list of [[List]] into `L` with [[Merge]]. Merges from left to\n * right, first items get overridden by the next ones (last-in overrides).\n * @param L to assign to\n * @param Ls to assign\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @param ignore (?=`BuiltIn`) types not to merge\n * @param fill (?=`undefined`) types of `O` to be replaced with ones of `O1`\n * @returns [[Object]]\n * @example\n * ```ts\n * import {L} from 'ts-toolbelt'\n *\n * type test0 = Assign<[1, 2, 3], [[2, 1]]> // [2, 1, 3]\n * type test1 = Assign<[], [[1, 2, 3, 4], [2, 4, 6]]> // [2, 4, 6, 4]\n * type test2 = Assign<[0, 0, 0, 0, 0], [[0, 1], [0, 2, 0, 4?]]> // [0, 2, 0, 0 | 4, 0]\n * ```\n */\nexport type Assign<L extends List, Ls extends List<List>, depth extends Depth = 'flat', ignore extends object = BuiltIn, fill extends any = never> =\n    Cast<OAssign<L, Ls, depth, ignore, fill>, List>\n"
  },
  {
    "path": "sources/List/AtLeast.ts",
    "content": "import {Key} from './_Internal'\nimport {AtLeast as OAtLeast} from '../Object/AtLeast'\nimport {ObjectOf} from './ObjectOf'\nimport {_ListOf} from '../Object/ListOf'\nimport {List} from './List'\nimport {Keys} from '../Any/Keys'\n\n/**\n * Make that at least one of the keys `K` are required in `L` at a time.\n * @param L to make required\n * @param K (?=`keyof L`) to choose fields\n * @returns [[List]] [[Union]]\n * @example\n * ```ts\n * import {L} from 'ts-toolbelt'\n *\n * type test0 = L.AtLeast<[1, 2, 3], 0> // [1, 2 | undefined, 3 | undefined]\n * type test1 = L.AtLeast<[1, 2, 3], 0 | 1> // [1, 2 | undefined, 3 | undefined] | [1 | undefined, 2, 3 | undefined]\n * type test2 = L.AtLeast<[1, 2, 3]>\n * // | [1, 2, 3]\n * // | [1, 2 | undefined, 3 | undefined]\n * // | [1 | undefined, 2, 3 | undefined]\n * // | [1 | undefined, 2 | undefined, 3]\n * ```\n */\nexport type AtLeast<L extends List, K extends Key = Keys<L>> =\n    OAtLeast<ObjectOf<L>, `${K & number}` | K> extends infer U\n    ? U extends unknown // we distribute over the union\n      ? _ListOf<U & {}> // each union member to a list\n      : never\n    : never\n\ndeclare const sym: unique symbol\n"
  },
  {
    "path": "sources/List/Compulsory.ts",
    "content": "import {Depth} from '../Object/_Internal'\nimport {CompulsoryPart} from '../Object/Compulsory'\nimport {List} from './List'\nimport {_Pick} from '../Object/Pick'\nimport {Cast} from '../Any/Cast'\n\n/**\n * Make that `L`'s fields cannot be [[Nullable]] or [[Optional]] (it's like\n * [[Required]] & [[NonNullable]] at once).\n * @param L to make compulsory\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @returns [[List]]\n * @example\n * ```ts\n *  * import {L} from 'ts-toolbelt'\n *\n * type test0 = L.Compulsory<[1, 2, 3?, 4?]> // [1, 2, 3, 4]\n * type test1 = L.Compulsory<['a', 'b' | undefined, 'c', 'd', 'e' | null]> // ['a', 'b', 'c', 'd', 'e']\n * ```\n */\nexport type Compulsory<L extends List, depth extends Depth = 'flat'> =\n    Cast<CompulsoryPart<L, depth>, List>\n"
  },
  {
    "path": "sources/List/CompulsoryKeys.ts",
    "content": "import {CompulsoryKeys as OCompulsoryKeys} from '../Object/CompulsoryKeys'\nimport {ObjectOf} from './ObjectOf'\nimport {List} from './List'\n\n/**\n * Get the keys of `L` that are [[Compulsory]]\n *\n * (⚠️ needs `--strictNullChecks` enabled)\n * @param L\n * @returns [[Key]]\n * @example\n * ```ts\n * import {L} from 'ts-toolbelt'\n *\n * type test0 = L.CompulsoryKeys<[1, 2, 3]> // {0: 1, 1: 2, 2: 3}\n * ```\n */\nexport type CompulsoryKeys<L extends List> =\n    OCompulsoryKeys<ObjectOf<L>>\n"
  },
  {
    "path": "sources/List/Concat.ts",
    "content": "import {List} from './List'\n\n/**\n * Attach `L1` at the end of `L`\n * @param L to concat with\n * @param L1 to be attached\n * @returns [[List]]\n * @example\n * ```ts\n * import {L} from 'ts-toolbelt'\n *\n * type test0 = L.Concat<[1, 2], [3, 4]> // [1, 2, 3, 4]\n * type test1 = L.Concat<[1, 2], [[3], 4]> // [1, 2, [3], 4]\n * type test2 = L.Concat<[1, 2], number[]> // [1, 2, ...number[]]\n * type test3 = L.Concat<readonly [1, 2], readonly [3]> // [1, 2, 3]\n * ```\n */\nexport type Concat<L extends List, L1 extends List> =\n    [...L, ...L1]\n"
  },
  {
    "path": "sources/List/Diff.ts",
    "content": "import {Diff as ODiff} from '../Object/Diff'\nimport {ListOf} from '../Object/ListOf'\nimport {Match} from '../Any/_Internal'\nimport {ObjectOf} from './ObjectOf'\nimport {List} from './List'\n\n/**\n * Get a [[List]] that is the difference between `L` & `L1`\n * (`L`'s differences have priority over `L1`'s if entries overlap)\n * (If `match = 'default'`, no type checks are done)\n * @param L to check differences with\n * @param L1 to check differences against\n * @param match (?=`'default'`) to change precision\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Diff<L extends List, L1 extends List, match extends Match = 'default'> =\n    ListOf<ODiff<ObjectOf<L>, ObjectOf<L1>, match>>\n"
  },
  {
    "path": "sources/List/Drop.ts",
    "content": "import {Tail} from './Tail'\nimport {Cast} from '../Any/Cast'\nimport {IterationOf} from '../Iteration/IterationOf'\nimport {Iteration} from '../Iteration/Iteration'\nimport {Way} from '../Iteration/_Internal'\nimport {List} from './List'\nimport {Pos} from '../Iteration/Pos'\nimport {Prev} from '../Iteration/Prev'\nimport {Prepend} from './Prepend'\nimport {Naked} from './_Internal'\nimport {Extends} from '../Any/Extends'\n\n/**\n * @hidden\n */\ntype DropForth<L extends List, N extends Iteration> = {\n    0: DropForth<Tail<L>, Prev<N>>\n    1: L\n}[Extends<0, Pos<N>>]\n\n/**\n * @hidden\n */\ntype DropBack<L extends List, N extends Iteration, I extends Iteration = Prev<N>, LN extends List = []> = {\n    0: DropBack<L, N, Prev<I>, Prepend<LN, L[Pos<I>]>>\n    1: LN\n}[Extends<-1, Pos<I>>]\n\n/**\n * @hidden\n */\ntype __Drop<L extends List, N extends Iteration, way extends Way> = {\n    '->': DropForth<L, N>\n    '<-': DropBack<L, N>\n}[way]\n\n/**\n * @hidden\n */\nexport type _Drop<L extends List, N extends number, way extends Way = '->'> =\n    __Drop<Naked<L>, IterationOf<N>, way> extends infer X\n    ? Cast<X, List>\n    : never\n\n/**\n * Remove `N` entries out of `L`\n * @param L to remove from\n * @param N to remove out\n * @param way (?=`'->'`) from front: '->', from end: '<-'\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Drop<L extends List, N extends number, way extends Way = '->'> =\n    L extends unknown\n    ? N extends unknown\n      ? _Drop<L, N, way>\n      : never\n    : never\n"
  },
  {
    "path": "sources/List/Either.ts",
    "content": "import {Key} from './_Internal'\nimport {Either as OEither} from '../Object/Either'\nimport {ObjectOf} from './ObjectOf'\nimport {_ListOf} from '../Object/ListOf'\nimport {List} from './List'\nimport {Boolean} from '../Boolean/_Internal'\n\n/**\n * Split `L` into a [[Union]] with `K` keys in such a way that none of\n * the keys are ever present with one another within the different unions.\n * @param L to split\n * @param K to split with\n * @param strict (?=`1`) to force excess property checks https://github.com/microsoft/TypeScript/issues/20863\n * @returns [[List]] [[Union]]\n * @example\n * ```ts\n * ```\n */\nexport type Either<L extends List, K extends Key, strict extends Boolean = 1> =\n    OEither<ObjectOf<L>, `${K & number}` | K, strict> extends infer OE\n    ? OE extends unknown\n      ? _ListOf<OE & {}>\n      : never\n    : never\n"
  },
  {
    "path": "sources/List/Exclude.ts",
    "content": "import {Match} from '../Any/_Internal'\nimport {ListOf} from '../Object/ListOf'\nimport {Exclude as OExclude} from '../Object/Exclude'\nimport {ObjectOf} from './ObjectOf'\nimport {List} from './List'\n\n/**\n * Exclude the entries of `L1` out of `L`\n * (If `match = 'default'`, no type checks are done)\n * @param L to remove from\n * @param L1 to remove out\n * @param match (?=`'default'`) to change precision\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Exclude<L extends List, L1 extends List, match extends Match = 'default'> =\n    ListOf<OExclude<ObjectOf<L>, ObjectOf<L1>, match>>\n"
  },
  {
    "path": "sources/List/ExcludeKeys.ts",
    "content": "import {ExcludeKeys as OExcludeKeys} from '../Object/ExcludeKeys'\nimport {Match} from '../Any/_Internal'\nimport {ObjectOf} from './ObjectOf'\nimport {List} from './List'\n\n/**\n * Exclude the keys of `L1` out of the keys of `L`\n * (If `match = 'default'`, no type checks are done)\n * @param L to remove the keys from\n * @param L1 to remove the keys out\n * @param match (?=`'default'`) to change precision\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type ExcludeKeys<L extends List, L1 extends List, match extends Match = 'default'> =\n    OExcludeKeys<ObjectOf<L>, ObjectOf<L1>, match>\n"
  },
  {
    "path": "sources/List/Extract.ts",
    "content": "import {KeySet} from './KeySet'\nimport {Pick} from './Pick'\nimport {List} from './List'\n\n/**\n * Pick a range of entries (portion) from `L`\n * @param L to pick from\n * @param From to start with\n * @param To to end with\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Extract<L extends List, From extends number, To extends number> =\n    Pick<L, KeySet<From, To>>\n"
  },
  {
    "path": "sources/List/Filter.ts",
    "content": "import {Filter as OFilter} from '../Object/Filter'\nimport {ListOf} from '../Object/ListOf'\nimport {Match} from '../Any/_Internal'\nimport {ObjectOf} from './ObjectOf'\nimport {List} from './List'\n\n/**\n * Filter out of `L` the entries that match `M`\n * @param L to remove from\n * @param M to select entries\n * @param match (?=`'default'`) to change precision\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Filter<L extends List, M extends any, match extends Match = 'default'> =\n    ListOf<OFilter<ObjectOf<L>, M, match>>\n"
  },
  {
    "path": "sources/List/FilterKeys.ts",
    "content": "import {FilterKeys as OFilterKeys} from '../Object/FilterKeys'\nimport {Match} from '../Any/_Internal'\nimport {ObjectOf} from './ObjectOf'\nimport {List} from './List'\n\n/**\n * Filter out the keys of `L` which entries match `M`\n * @param L to remove from\n * @param M to select entries\n * @param match (?=`'default'`) to change precision\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type FilterKeys<L extends List, M extends any, match extends Match = 'default'> =\n    OFilterKeys<ObjectOf<L>, M, match>\n"
  },
  {
    "path": "sources/List/Flatten.ts",
    "content": "import {List} from './List'\nimport {_UnNest} from './UnNest'\nimport {Cast} from '../Any/Cast'\nimport {Equals} from '../Any/Equals'\nimport {Iteration} from '../Iteration/Iteration'\nimport {IterationOf} from '../Iteration/IterationOf'\nimport {Extends} from '../Any/Extends'\nimport {Next} from '../Iteration/Next'\nimport {Or} from '../Boolean/Or'\nimport {Boolean} from '../Boolean/_Internal'\n\n/**\n * @hidden\n */\ntype __Flatten<L extends List, LO extends List, strict extends Boolean, limit extends Iteration, I extends Iteration = IterationOf<0>> = {\n    0: __Flatten<_UnNest<L, strict>, L, strict, limit, Next<I>>\n    1: L\n}[Or<Equals<L, LO>, Extends<limit, I>>]\n\n/**\n * @hidden\n */\nexport type _Flatten<L extends List, strict extends Boolean, limit extends number = number> =\n    __Flatten<L, [], strict, IterationOf<limit>> extends infer X\n    ? Cast<X, List>\n    : never\n\n/**\n * Remove all dimensions of `L` (10 max)\n * @param L to un-nest\n * @param strict (?=`1`) `0` to not preserve tuples\n * @param limit (?=`string`) to stop un-nesting at\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Flatten<L extends List, strict extends Boolean = 1, limit extends number = number> =\n    L extends unknown\n    ? _Flatten<L, strict, limit>\n    : never\n"
  },
  {
    "path": "sources/List/Group.ts",
    "content": "import {_Drop} from './Drop'\nimport {_Take} from './Take'\nimport {Cast} from '../Any/Cast'\nimport {Append} from './Append'\nimport {List} from './List'\nimport {Extends} from '../Any/Extends'\n\n/**\n * @hidden\n */\ntype __Group<L extends List, N extends number, LN extends List = []> = {\n    0: __Group<_Drop<L, N>, N, Append<LN, _Take<L, N>>>\n    1: LN\n}[Extends<L, List<never>>]\n\n/**\n * @hidden\n */\nexport type _Group<L extends List, N extends number> =\n    __Group<L, N> extends infer X\n    ? Cast<X, List>\n    : never\n\n/**\n * Split `L` into sub-[[List]]s every `N`\n * @param L to group\n * @param N to split at\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Group<L extends List, N extends number> =\n    L extends unknown\n    ? N extends unknown\n      ? _Group<L, N>\n      : never\n    : never\n"
  },
  {
    "path": "sources/List/Has.ts",
    "content": "import {Match} from '../Any/_Internal'\nimport {Has as OHas} from '../Object/Has'\nimport {Key} from './_Internal'\nimport {ObjectOf} from './ObjectOf'\nimport {List} from './List'\n\n/**\n * Check whether `L` has a entry of key `K` that matches `M`\n * @param L to be inspected\n * @param K to choose entry\n * @param M (?=`any`) to check entry type\n * @param match (?=`'default'`) to change precision\n * @returns [[Boolean]]\n * @example\n * ```ts\n * ```\n */\nexport type Has<L extends List, K extends Key, M extends any = any, match extends Match = 'default'> =\n    OHas<ObjectOf<L>, `${K & number}` | K, M, match>\n"
  },
  {
    "path": "sources/List/HasPath.ts",
    "content": "import {HasPath as OHasPath} from '../Object/HasPath'\nimport {Match} from '../Any/_Internal'\nimport {Key} from '../Any/Key'\nimport {ObjectOf} from './ObjectOf'\nimport {List} from './List'\n\n/**\n * Check whether `L` has nested entries that match `M`\n * @param L to be inspected\n * @param Path to be followed\n * @param M (?=`any`) to check entry type\n * @param match (?=`'default'`) to change precision\n * @returns [[Boolean]]\n * @example\n * ```ts\n * ```\n */\nexport type HasPath<L extends List, Path extends List<Key>, M extends any = any, match extends Match = 'default'> =\n    OHasPath<ObjectOf<L>, Path, M, match>\n"
  },
  {
    "path": "sources/List/Head.ts",
    "content": "import {Length} from './Length'\nimport {List} from './List'\n\n/**\n * Get the first entry of `L`\n * @param L to extract from\n * @returns [[Any]]\n * @example\n * ```ts\n * ```\n */\nexport type Head<L extends List> =\n    Length<L> extends 0\n    ? never\n    : L[0]\n"
  },
  {
    "path": "sources/List/Includes.ts",
    "content": "import {Match} from '../Any/_Internal'\nimport {Includes as OIncludes} from '../Object/Includes'\nimport {ObjectOf} from './ObjectOf'\nimport {List} from './List'\n\n/**\n * Check whether `L` has entries that match `M`\n * @param L to be inspected\n * @param M to check entry type\n * @param match (?=`'default'`) to change precision\n * @returns [[Boolean]]\n * @example\n * ```ts\n * ```\n */\nexport type Includes<L extends List, M extends any, match extends Match = 'default'> =\n    OIncludes<ObjectOf<L>, M, match>\n"
  },
  {
    "path": "sources/List/Intersect.ts",
    "content": "import {Intersect as OIntersect} from '../Object/Intersect'\nimport {Match} from '../Any/_Internal'\nimport {ListOf} from '../Object/ListOf'\nimport {ObjectOf} from './ObjectOf'\nimport {List} from './List'\n\n/**\n * Get the intersecting entries of `L` & `L1`\n * (If `match = 'default'`, no type checks are done)\n * @param L to check similarities with\n * @param L1 to check similarities against\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Intersect<L extends List, L1 extends List, match extends Match = 'default'> =\n    ListOf<OIntersect<ObjectOf<L>, ObjectOf<L1>, match>>\n"
  },
  {
    "path": "sources/List/IntersectKeys.ts",
    "content": "import {Match} from '../Any/_Internal'\nimport {IntersectKeys as OIntersectKeys} from '../Object/IntersectKeys'\nimport {ObjectOf} from './ObjectOf'\nimport {List} from './List'\n\n/**\n * Get the intersecting entries of `L` & `L1`\n * (If `match = 'default'`, no type checks are done)\n * @param L to check similarities with\n * @param L1 to check similarities against\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type IntersectKeys<L extends List, L1 extends List, match extends Match = 'default'> =\n    OIntersectKeys<ObjectOf<L>, L1, match>\n"
  },
  {
    "path": "sources/List/KeySet.ts",
    "content": "import {Range} from '../Number/Range'\nimport {UnionOf} from './UnionOf'\n\n/**\n * Create a set of keys\n * @param From to start with\n * @param To to end with\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type KeySet<From extends number, To extends number> =\n    UnionOf<Range<From, To, '->'>>\n"
  },
  {
    "path": "sources/List/Last.ts",
    "content": "import {Tail} from './Tail'\nimport {Length} from './Length'\nimport {List} from './List'\n\n/**\n * Get the last entry of `L`\n * @param L to extract from\n * @returns [[Any]]\n * @example\n * ```ts\n * ```\n */\nexport type Last<L extends List> =\n    L[Length<Tail<L>>]\n"
  },
  {
    "path": "sources/List/LastKey.ts",
    "content": "import {Length} from './Length'\nimport {Tail} from './Tail'\nimport {List} from './List'\n\n/**\n * Get the last index of `L`\n * @param L to get from\n * @returns `number`\n * @example\n * ```ts\n * ```\n */\nexport type LastKey<L extends List> =\n    Length<Tail<L>>\n"
  },
  {
    "path": "sources/List/Length.ts",
    "content": "import {List} from './List'\n\n/**\n * Get the length of `L`\n * @param L to get length\n * @returns [[String]] or `number`\n * @example\n * ```ts\n * ```\n */\nexport type Length<L extends List> =\n    L['length']\n"
  },
  {
    "path": "sources/List/List.ts",
    "content": "/**\n * A [[List]]\n * @param A its type\n * @returns [[List]]\n * @example\n * ```ts\n * type list0 = [1, 2, 3]\n * type list1 = number[]\n * ```\n */\nexport type List<A = any> = ReadonlyArray<A>\n"
  },
  {
    "path": "sources/List/Longest.ts",
    "content": "import {Has} from '../Union/Has'\nimport {List} from './List'\n\n/**\n * Get the longest [[List]] of `L` & `L1`\n * (`L` has priority if both lengths are equal)\n * @param L to compare length\n * @param L1 to compare length\n * @returns `L | L1`\n * @example\n * ```ts\n * ```\n */\nexport type Longest<L extends List, L1 extends List> =\n    L extends unknown ? L1 extends unknown ?\n    {0: L1, 1: L}[Has<keyof L, keyof L1>]\n    : never : never\n"
  },
  {
    "path": "sources/List/Merge.ts",
    "content": "import {Merge as OMerge} from '../Object/Merge'\nimport {List} from './List'\nimport {Depth} from '../Object/_Internal'\nimport {BuiltIn} from '../Misc/BuiltIn'\nimport {Cast} from '../Any/Cast'\n\n/**\n * Accurately merge the fields of `L` with the ones of `L1`. It is\n * equivalent to the spread operator in JavaScript. [[Union]]s and [[Optional]]\n * fields will be handled gracefully.\n *\n * (⚠️ needs `--strictNullChecks` enabled)\n * @param L to complete\n * @param L1 to copy from\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @param ignore (?=`BuiltIn`) types not to merge\n * @param fill (?=`undefined`) types of `O` to be replaced with ones of `O1`\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Merge<L extends List, L1 extends List, depth extends Depth = 'flat', ignore extends object = BuiltIn, fill extends any = undefined> =\n    Cast<OMerge<L, L1, depth, ignore, fill>, List>\n"
  },
  {
    "path": "sources/List/MergeAll.ts",
    "content": "import {MergeAll as OMergeAll} from '../Object/MergeAll'\nimport {List} from '../List/List'\nimport {Depth} from '../Object/_Internal'\nimport {BuiltIn} from '../Misc/BuiltIn'\nimport {Cast} from '../Any/Cast'\n\n/**\n * [[Merge]] a list of [[List]]s into `L`. Merges from left to right, first\n * items get completed by the next ones (last-in completes).\n * @param L to start with\n * @param Ls to merge\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @param ignore (?=`BuiltIn`) types not to merge\n * @param fill (?=`undefined`) types of `O` to be replaced with ones of `O1`\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type MergeAll<L extends List, Ls extends List<List>, depth extends Depth = 'flat', ignore extends object = BuiltIn, fill extends any = undefined> =\n    Cast<OMergeAll<L, Ls, depth, ignore, fill>, List>\n"
  },
  {
    "path": "sources/List/Modify.ts",
    "content": "import {Replace} from '../Union/Replace'\nimport {x} from '../Any/x'\nimport {List} from './List'\nimport {Cast} from '../Any/Cast'\nimport {At} from '../Any/At'\n\n/**\n * Modify `L` with `LMod` & the [[x]] placeholder\n * @param L to copy from\n * @param LMod to copy to\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Modify<L extends List, LMod extends List> = Cast<{\n    [K in keyof LMod]: Replace<LMod[K], x, Exclude<At<L, K>, undefined>>\n}, List>\n"
  },
  {
    "path": "sources/List/NonNullable.ts",
    "content": "import {_Pick} from '../Object/Pick'\nimport {Key} from './_Internal'\nimport {NonNullable as UNonNullable} from '../Union/NonNullable'\nimport {Depth} from '../Object/_Internal'\nimport {BuiltIn} from '../Misc/BuiltIn'\nimport {Cast} from '../Any/Cast'\nimport {List} from './List'\n\n/**\n * @hidden\n */\nexport type NonNullableFlat<O, K extends Key = Key> = {\n    [P in keyof O]: P extends K\n                    ? UNonNullable<O[P]>\n                    : O[P]\n} & {}\n\n/**\n * @hidden\n */\ntype _NonNullableDeep<O> = {\n    [K in keyof O]: O[K] extends BuiltIn\n                    ? O[K]\n                    : NonNullableDeep<O[K], Key>\n}\n\n/**\n * @hidden\n */\nexport type NonNullableDeep<O, K extends Key = Key> =\n    _NonNullableDeep<NonNullableFlat<O, K>>\n\n/**\n * @hidden\n */\nexport type NonNullablePart<O extends object, K extends Key, depth extends Depth> = {\n    'flat': NonNullableFlat<O, K>\n    'deep': NonNullableDeep<O, K>\n}[depth]\n\n/**\n * Make some entries of `L` not nullable (deeply or not)\n * @param L to make non nullable\n * @param K (?=`Key`) to choose fields\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type NonNullable<L extends List, K extends Key = Key, depth extends Depth = 'flat'> =\n    Cast<NonNullablePart<L, `${K & number}` | K, depth>, List>\n"
  },
  {
    "path": "sources/List/NonNullableKeys.ts",
    "content": "import {NonNullableKeys as ONonNullableKeys} from '../Object/NonNullableKeys'\nimport {ObjectOf} from './ObjectOf'\nimport {List} from './List'\n\n/**\n * Get the keys of `L` that are non-nullable\n * @param L\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type NonNullableKeys<L extends List> =\n    ONonNullableKeys<ObjectOf<L>>\n"
  },
  {
    "path": "sources/List/Nullable.ts",
    "content": "import {Key} from './_Internal'\nimport {List} from './List'\nimport {Update} from '../Object/Update'\nimport {x} from '../Any/x'\nimport {Cast} from '../Any/Cast'\n\n/**\n * Make some entries of `L` nullable (deeply or not)\n * @param L to make nullable\n * @param K (?=`Key`) to choose fields\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Nullable<L extends List, K extends Key = Key> =\n    Cast<Update<L, `${K & number}` | K, x | null | undefined>, List>\n"
  },
  {
    "path": "sources/List/NullableKeys.ts",
    "content": "import {NullableKeys as ONullableKeys} from '../Object/NullableKeys'\nimport {ObjectOf} from './ObjectOf'\nimport {List} from './List'\n\n/**\n * Get the keys of `L` that are nullable\n * @param L\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type NullableKeys<L extends List> =\n    ONullableKeys<ObjectOf<L>>\n"
  },
  {
    "path": "sources/List/ObjectOf.ts",
    "content": "import {_Omit} from '../Object/Omit'\nimport {_Pick} from '../Object/Pick'\nimport {Length} from './Length'\nimport {List} from './List'\n\n/**\n * Transform a [[List]] into an [[Object]] equivalent\n * @param L to transform\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type ObjectOf<O extends List> =\n    O extends unknown\n    ? number extends Length<O> // detect arrays\n      ? _Pick<O, number>       // preserves arrays\n      : _Omit<O, keyof any[]>  // transforms tuples\n    : never\n"
  },
  {
    "path": "sources/List/Omit.ts",
    "content": "import {_Omit as _OOmit} from '../Object/Omit'\nimport {_ListOf} from '../Object/ListOf'\nimport {Key} from './_Internal'\nimport {List} from './List'\nimport {ObjectOf} from './ObjectOf'\n\n/**\n * @hidden\n */\nexport type _Omit<L extends List, K extends Key> =\n    _ListOf<_OOmit<ObjectOf<L>, `${K & number}` | K>>\n\n/**\n * Remove out of `L` the entries of key `K`\n * @param L to remove from\n * @param K to chose entries\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Omit<L extends List, K extends Key> =\n    L extends unknown\n    ? _Omit<L, K>\n    : never\n"
  },
  {
    "path": "sources/List/Optional.ts",
    "content": "import {Cast} from '../Any/Cast'\nimport {OptionalPart} from '../Object/Optional'\nimport {Depth} from '../Object/_Internal'\nimport {List} from './List'\n\n/**\n * Make `L` optional (deeply or not)\n * @param L to make optional\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Optional<L extends List, depth extends Depth = 'flat'> =\n    Cast<OptionalPart<L, depth>, List>\n"
  },
  {
    "path": "sources/List/OptionalKeys.ts",
    "content": "import {OptionalKeys as OOptionalKeys} from '../Object/OptionalKeys'\nimport {ObjectOf} from './ObjectOf'\nimport {List} from './List'\n\n/**\n * Get the keys of `L` that are optional\n * @param L\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type OptionalKeys<L extends List> =\n    OOptionalKeys<ObjectOf<L>>\n"
  },
  {
    "path": "sources/List/Overwrite.ts",
    "content": "import {Overwrite as OOverwrite} from '../Object/Overwrite'\nimport {Cast} from '../Any/Cast'\nimport {List} from './List'\n\n/**\n * Update the entries of `L` with the ones of `L1`\n * @param L to update\n * @param L1 to update with\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Overwrite<L extends List, L1 extends object> =\n    Cast<OOverwrite<L, L1>, List>\n"
  },
  {
    "path": "sources/List/Partial.ts",
    "content": "import {Partial as OPartial} from '../Object/Partial'\nimport {Depth} from '../Object/_Internal'\nimport {Cast} from '../Any/Cast'\nimport {List} from './List'\n\n/**\n * Make all fields of `O` optional (deeply or not)\n * @param L to make optional\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @returns [[List]]\n * @example\n * ```ts\n * import {O} from 'ts-toolbelt'\n *\n * type L = [1, 2, 3, [4, [5]]]\n *\n * type test0 = O.Partial<L>\n * type test1 = O.Partial<L, 'deep'>\n * ```\n */\nexport type Partial<L extends List, depth extends Depth = 'flat'> =\n    Cast<OPartial<L, depth>, List>\n"
  },
  {
    "path": "sources/List/Patch.ts",
    "content": "import {Patch as OPatch} from '../Object/Patch'\nimport {List} from './List'\nimport {Depth} from '../Object/_Internal'\nimport {BuiltIn} from '../Misc/BuiltIn'\nimport {Cast} from '../Any/Cast'\n\n/**\n * Complete the fields of `L` with the ones of `L1`. This is a version of\n * [[Merge]] that does NOT handle optional fields, it only completes fields of `O`\n * with the ones of `O1` if they don't exist.\n *\n * (⚠️ needs `--strictNullChecks` enabled)\n * @param L to complete\n * @param L1 to copy from\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @param ignore (?=`BuiltIn`) types not to merge\n * @param fill (?=`never`) types of `O` to be replaced with ones of `O1`\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Patch<L extends List, L1 extends List, depth extends Depth = 'flat', ignore extends object = BuiltIn, fill extends any = never> =\n    Cast<OPatch<L, L1, depth, ignore, fill>, List>\n"
  },
  {
    "path": "sources/List/PatchAll.ts",
    "content": "import {PatchAll as OPatchAll} from '../Object/PatchAll'\nimport {List} from '../List/List'\nimport {Depth} from '../Object/_Internal'\nimport {BuiltIn} from '../Misc/BuiltIn'\nimport {Cast} from '../Any/Cast'\n\n/**\n * [[Patch]] a list of [[List]]s into `L`. Patches from left to right, first\n * items get completed by the next ones (last-in completes).\n * @param O to start with\n * @param Os to patch\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @param ignore (?=`BuiltIn`) types not to merge\n * @param fill (?=`never`) types of `O` to be replaced with ones of `O1`\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type PatchAll<O extends List, Ls extends List<List>, depth extends Depth = 'flat', ignore extends object = BuiltIn, fill extends any = never> =\n    Cast<OPatchAll<O, Ls, depth, ignore, fill>, List>\n"
  },
  {
    "path": "sources/List/Path.ts",
    "content": "import {Path as OPath} from '../Object/Path'\nimport {Key} from '../Any/Key'\nimport {List} from './List'\n\n/**\n * Get in `L` the type of nested properties\n * @param L to be inspected\n * @param Path to be followed\n * @returns [[Any]]\n * @example\n * ```ts\n * ```\n */\nexport type Path<L extends List, Path extends List<Key>> =\n    OPath<L, Path>\n"
  },
  {
    "path": "sources/List/Paths.ts",
    "content": "import {Paths as OPaths} from '../Object/Paths'\nimport {ObjectOf} from './ObjectOf'\nimport {List} from './List'\n\n/**\n * Get all the possible paths of `L`\n * (⚠️ this won't work with circular-refs)\n * @param L to be inspected\n * @returns [[String]][]\n * @example\n * ```ts\n * ```\n */\nexport type Paths<L extends List> =\n    OPaths<ObjectOf<L>>\n"
  },
  {
    "path": "sources/List/Pick.ts",
    "content": "import {_Pick as _OPick} from '../Object/Pick'\nimport {_ListOf} from '../Object/ListOf'\nimport {Key} from './_Internal'\nimport {ObjectOf} from './ObjectOf'\nimport {List} from './List'\n\n/**\n * @hidden\n */\nexport type _Pick<L extends List, K extends Key> =\n    _ListOf<_OPick<ObjectOf<L>, `${K & number}` | K>>\n\n/**\n * Extract out of `L` the entries of key `K`\n * @param L to extract from\n * @param K to chose entries\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Pick<L extends List, K extends Key> =\n    L extends unknown\n    ? _Pick<L, K>\n    : never\n"
  },
  {
    "path": "sources/List/Pop.ts",
    "content": "import {_Omit} from './Omit'\nimport {List} from './List'\n\n/**\n * Remove the last element out of `L`\n * @param L to remove from\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Pop<L extends List> =\n    L extends (readonly [...infer LBody, any] | readonly [...infer LBody, any?])\n    ? LBody\n    : L\n"
  },
  {
    "path": "sources/List/Prepend.ts",
    "content": "import {List} from './List'\n\n/**\n * Add an element `A` at the beginning of `L`\n * @param L to append to\n * @param A to be added to\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Prepend<L extends List, A extends any> =\n    [A, ...L]\n"
  },
  {
    "path": "sources/List/Readonly.ts",
    "content": "import {Depth} from '../Object/_Internal'\nimport {ReadonlyPart} from '../Object/Readonly'\nimport {List} from './List'\nimport {Cast} from '../Any/Cast'\n\n/**\n * Make `L` readonly (deeply or not)\n * @param L to make readonly\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Readonly<L extends List, depth extends Depth = 'flat'> =\n    Cast<ReadonlyPart<L, depth>, List>\n"
  },
  {
    "path": "sources/List/ReadonlyKeys.ts",
    "content": "import {ReadonlyKeys as OReadonlyKeys} from '../Object/ReadonlyKeys'\nimport {ObjectOf} from './ObjectOf'\nimport {List} from './List'\n\n/**\n * Get the keys of `L` that are readonly\n * @param L\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type ReadonlyKeys<L extends List> =\n    OReadonlyKeys<ObjectOf<L>>\n"
  },
  {
    "path": "sources/List/Remove.ts",
    "content": "import {KeySet} from './KeySet'\nimport {Omit} from './Omit'\nimport {List} from './List'\n\n/**\n * Remove out of `L` a range of entries\n * @param L to remove from\n * @param From to start from\n * @param To to end with\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Remove<L extends List, From extends number, To extends number> =\n    Omit<L, KeySet<From, To>>\n"
  },
  {
    "path": "sources/List/Repeat.ts",
    "content": "import {Next} from '../Iteration/Next'\nimport {Prepend} from './Prepend'\nimport {IterationOf} from '../Iteration/IterationOf'\nimport {Iteration} from '../Iteration/Iteration'\nimport {Cast} from '../Any/Cast'\nimport {List} from './List'\nimport {Extends} from '../Any/Extends'\nimport {Pos} from '../Iteration/Pos'\n\n/**\n * @hidden\n */\ntype __Repeat<N extends number, A, L extends List = [], I extends Iteration = IterationOf<0>> = {\n    0: __Repeat<N, A, Prepend<L, A>, Next<I>>\n    1: L\n}[Extends<Pos<I>, N>]\n\n/**\n * @hidden\n */\nexport type _Repeat<A extends any, N extends number, L extends List = []> =\n    __Repeat<N, A, L> extends infer X\n    ? Cast<X, List>\n    : never\n\n/**\n * Fill a [[List]] with `N` times `A`\n * @param A to fill with\n * @param N to repeat it\n * @param L (?=`[]`) to be filled\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Repeat<A extends any, N extends number, L extends List = []> =\n    N extends unknown\n    ? L extends unknown\n      ? _Repeat<A, N, L>\n      : never\n    : never\n"
  },
  {
    "path": "sources/List/Replace.ts",
    "content": "import {Replace as OReplace} from '../Object/Replace'\nimport {Match} from '../Any/_Internal'\nimport {Cast} from '../Any/Cast'\nimport {List} from './List'\n\n/**\n * Update with `A` the entries of `L` that match `M`\n * @param O to update\n * @param M to select fields\n * @param A to update with\n * @param match (?=`'default'`) to change precision\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Replace<L extends List, M extends any, A extends any, match extends Match = 'default'> =\n    Cast<OReplace<L, M, A, match>, List>\n"
  },
  {
    "path": "sources/List/Required.ts",
    "content": "import {Depth} from '../Object/_Internal'\nimport {RequiredPart} from '../Object/Required'\nimport {List} from './List'\nimport {Cast} from '../Any/Cast'\n\n/**\n * Make `L` required (deeply or not)\n * @param L to make required\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Required<L extends List, depth extends Depth = 'flat'> =\n    Cast<RequiredPart<L, depth>, List>\n"
  },
  {
    "path": "sources/List/RequiredKeys.ts",
    "content": "import {RequiredKeys as ORequiredKeys} from '../Object/RequiredKeys'\nimport {ObjectOf} from './ObjectOf'\nimport {List} from './List'\n\n/**\n * Get the keys of `L` that are readonly\n * @param L\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type RequiredKeys<L extends List> =\n    ORequiredKeys<ObjectOf<L>>\n"
  },
  {
    "path": "sources/List/Reverse.ts",
    "content": "import {Prepend} from './Prepend'\nimport {Pos} from '../Iteration/Pos'\nimport {Next} from '../Iteration/Next'\nimport {Length} from './Length'\nimport {IterationOf} from '../Iteration/IterationOf'\nimport {Iteration} from '../Iteration/Iteration'\nimport {Cast} from '../Any/Cast'\nimport {List} from './List'\nimport {Naked} from './_Internal'\nimport {Extends} from '../Any/Extends'\n\n/**\n * @hidden\n */\ntype __Reverse<L extends List, LO extends List, I extends Iteration = IterationOf<0>> = {\n    0: __Reverse<L, Prepend<LO, L[Pos<I>]>, Next<I>>\n    1: LO\n}[Extends<Pos<I>, Length<L>>]\n\n/**\n * @hidden\n */\nexport type _Reverse<L extends List, LO extends List = []> =\n    __Reverse<Naked<L>, LO> extends infer X\n    ? Cast<X, List>\n    : never\n\n/**\n * Turn a [[List]] the other way around\n * @param L to reverse\n * @param LO (?=`[]`) to prepend to\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Reverse<L extends List> =\n    L extends unknown\n    ? _Reverse<L>\n    : never\n"
  },
  {
    "path": "sources/List/Select.ts",
    "content": "import {Match} from '../Any/_Internal'\nimport {Select as OSelect} from '../Object/Select'\nimport {ListOf} from '../Object/ListOf'\nimport {ObjectOf} from './ObjectOf'\nimport {List} from './List'\n\n/**\n * Extract the entries of `L` that match `M`\n * @param L to extract from\n * @param M to select entries\n * @param match (?=`'default'`) to change precision\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Select<L extends List, M extends any, match extends Match = 'default'> =\n    ListOf<OSelect<ObjectOf<L>, M, match>>\n"
  },
  {
    "path": "sources/List/SelectKeys.ts",
    "content": "import {Match} from '../Any/_Internal'\nimport {SelectKeys as OSelectKeys} from '../Object/SelectKeys'\nimport {ObjectOf} from './ObjectOf'\nimport {List} from './List'\n\n/**\n * Get the keys of `L` which entries match `M`\n * @param L to extract from\n * @param M to select entries\n * @param match (?=`'default'`) to change precision\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type SelectKeys<L extends List, M extends any, match extends Match = 'default'> =\n    OSelectKeys<ObjectOf<L>, M, match>\n"
  },
  {
    "path": "sources/List/Shortest.ts",
    "content": "import {Has} from '../Union/Has'\nimport {List} from './List'\n\n/**\n * Get the shortest [[List]] of `L` & `L1`\n * (`L` has priority if both lengths are equal)\n * @param L to compare length\n * @param L1 to compare length\n * @returns `L | L1`\n * @example\n * ```ts\n * ```\n */\nexport type Shortest<L extends List, L1 extends List> =\n    L extends unknown ? L1 extends unknown ?\n    {0: L1, 1: L}[Has<keyof L1, keyof L>]\n    : never : never\n"
  },
  {
    "path": "sources/List/Tail.ts",
    "content": "import {List} from './List'\n\n/**\n * Remove the first item out of a [[List]]\n * @param L\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Tail<L extends List> =\n    L extends readonly []\n    ? L\n    : L extends readonly [any?, ...infer LTail]\n      ? LTail\n      : L\n"
  },
  {
    "path": "sources/List/Take.ts",
    "content": "import {IterationOf} from '../Iteration/IterationOf'\nimport {Iteration} from '../Iteration/Iteration'\nimport {Pos} from '../Iteration/Pos'\nimport {Prepend} from './Prepend'\nimport {Way} from '../Iteration/_Internal'\nimport {List} from './List'\nimport {Prev} from '../Iteration/Prev'\nimport {Cast} from '../Any/Cast'\nimport {Tail} from './Tail'\nimport {Extends} from '../Any/Extends'\n\n/**\n * starts in reverse from `N` till `N` = 0\n * @hidden\n */\ntype TakeForth<L extends List, N extends Iteration, I extends Iteration = Prev<N>, LN extends List = []> = {\n    0: TakeForth<L, N, Prev<I>, Prepend<LN, L[Pos<I>]>>\n    1: LN\n}[Extends<-1, Pos<I>>]\n\n/**\n * starts in reverse from the end till `N` = 0\n * @hidden\n */\ntype TakeBack<L extends List, N extends Iteration> = {\n    0: TakeBack<Tail<L>, Prev<N>>\n    1: L\n}[Extends<0, Pos<N>>]\n\n/**\n * @hidden\n */\ntype __Take<L extends List, N extends Iteration, way extends Way> = {\n    '->': TakeForth<L, N> // Reverse logic to work naturally #`Prepend`\n    '<-': TakeBack<L, N>  // Reverse logic to work naturally #`Prepend`\n}[way]\n\n/**\n * @hidden\n */\nexport type _Take<L extends List, N extends number, way extends Way = '->'> =\n    __Take<L, IterationOf<N>, way> extends infer X\n    ? Cast<X, List>\n    : never\n\n/**\n * Extract `N` entries out of `L`\n * @param L to extract from\n * @param N to extract out\n * @param way (?=`'->'`) to extract from end\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Take<L extends List, N extends number, way extends Way = '->'> =\n    L extends unknown\n    ? N extends unknown\n      ? _Take<L, N, way>\n      : never\n    : never\n"
  },
  {
    "path": "sources/List/UnNest.ts",
    "content": "import {Concat} from './Concat'\nimport {Append} from './Append'\nimport {Cast} from '../Any/Cast'\nimport {Length} from './Length'\nimport {Iteration} from '../Iteration/Iteration'\nimport {IterationOf} from '../Iteration/IterationOf'\nimport {Next} from '../Iteration/Next'\nimport {Pos} from '../Iteration/Pos'\nimport {List} from './List'\nimport {UnionOf} from './UnionOf'\nimport {Naked} from './_Internal'\nimport {Extends} from '../Any/Extends'\nimport {Boolean} from '../Boolean/_Internal'\nimport {Not} from '../Boolean/Not'\nimport {And} from '../Boolean/And'\n\n/**\n * @hidden\n */\ntype UnNestLoose<L extends List> =\n    (UnionOf<L> extends infer UL    // make `L` a union\n    ? UL extends unknown            // for each in union\n      ? UL extends List             // if its an array\n        ? UnionOf<UL>               // make it a union\n        : UL                        // or leave as it is\n      : never\n    : never\n    )[] & {}                        // make result array\n\n/**\n * @hidden\n */\ntype Flatter<L extends List, LN extends List, I extends Iteration> =\n    L[Pos<I>] extends infer LP // handle if undefined\n    ? LP extends List\n      ? Concat<LN, L[Pos<I>]> // if it's a  list\n      : Append<LN, L[Pos<I>]> // if it's an item\n    : never\n\n/**\n * @hidden\n */\ntype UnNestStrict<L extends List, LN extends List = [], I extends Iteration = IterationOf<0>> = {\n    0: UnNestStrict<L, Flatter<L, LN, I>, Next<I>>\n    1: LN\n}[Extends<Pos<I>, Length<L>>]\n\n/**\n * @hidden\n */\ntype __UnNest<L extends List, strict extends Boolean> = {\n    0: UnNestLoose<L>\n    1: UnNestStrict<L>\n}[And<Not<Extends<number, Length<L>>>, strict>]\n\n/**\n * @hidden\n */\nexport type _UnNest<L extends List, strict extends Boolean> =\n    __UnNest<Naked<L>, strict> extends infer X\n    ? Cast<X, List>\n    : never\n\n/**\n * Remove a dimension of `L`\n * @param L to un-nest\n * @param strict (?=`1`) `0` to not preserve tuples\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type UnNest<L extends List, strict extends Boolean = 1> =\n    L extends unknown\n    ? _UnNest<L, strict>\n    : never\n"
  },
  {
    "path": "sources/List/Undefinable.ts",
    "content": "import {Key} from './_Internal'\nimport {List} from './List'\nimport {Update} from '../Object/Update'\nimport {x} from '../Any/x'\nimport {Cast} from '../Any/Cast'\n\n/**\n * Make some entries of `L` not `undefined` (deeply or not)\n * @param L to make non nullable\n * @param K (?=`Key`) to choose fields\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Undefinable<L extends List, K extends Key = Key> =\n    Cast<Update<L, `${K & number}` | K, x | undefined>, List>\n"
  },
  {
    "path": "sources/List/UndefinableKeys.ts",
    "content": "import {UndefinableKeys as OUndefinableKeys} from '../Object/UndefinableKeys'\nimport {ObjectOf} from './ObjectOf'\nimport {List} from './List'\n\n/**\n * Get the keys of `L` that are `undefined`\n * @param L\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type UndefinableKeys<L extends List> =\n    OUndefinableKeys<ObjectOf<L>>\n"
  },
  {
    "path": "sources/List/UnionOf.ts",
    "content": "import {List} from './List'\n\n/**\n * Transform a [[List]] into an [[Union]]\n * @param L to transform\n * @returns [[Any]]\n * @example\n * ```ts\n * ```\n */\nexport type UnionOf<L extends List> =\n    L[number]\n"
  },
  {
    "path": "sources/List/Unionize.ts",
    "content": "import {Key} from '../Any/Key'\nimport {List} from './List'\nimport {At} from '../Any/At'\n\n/**\n * Make the fields of `L` union the ones of `L1`\n * @param L to union from\n * @param L1 to union with\n * @param K (?=`Key`) to do choose fields\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Unionize<L extends List, L1 extends List, K extends Key = Key> = {\n    [P in keyof L]: P extends K\n                    ? L[P] | At<L1, P>\n                    : L[P]\n}\n"
  },
  {
    "path": "sources/List/Update.ts",
    "content": "import {Key} from './_Internal'\nimport {List} from './List'\nimport {Update as OUpdate} from '../Object/Update'\nimport {Cast} from '../Any/Cast'\n\n/**\n * Update in `L` the entries of key `K` with `A`.\n * Use the [[x]] placeholder to get the current field type.\n * @param L to update\n * @param K to chose fields\n * @param A to update with\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Update<L extends List, K extends Key, A extends any> =\n    Cast<OUpdate<L, `${K & number}` | K, A>, List>\n"
  },
  {
    "path": "sources/List/Writable.ts",
    "content": "import {Depth} from '../Object/_Internal'\nimport {WritablePart} from '../Object/Writable'\nimport {List} from './List'\nimport {Cast} from '../Any/Cast'\n\n/**\n * Make `L` writable (deeply or not)\n * @param L to make writable\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Writable<L extends List, depth extends Depth = 'flat'> =\n    Cast<WritablePart<L, depth>, List>\n"
  },
  {
    "path": "sources/List/WritableKeys.ts",
    "content": "import {WritableKeys as OWritableKeys} from '../Object/WritableKeys'\nimport {ObjectOf} from './ObjectOf'\nimport {List} from './List'\n\n/**\n * Get the keys of `L` that are writable\n * @param L\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type WritableKeys<L extends List> =\n    OWritableKeys<ObjectOf<L>>\n"
  },
  {
    "path": "sources/List/Zip.ts",
    "content": "import {IterationOf} from '../Iteration/IterationOf'\nimport {Iteration} from '../Iteration/Iteration'\nimport {Next} from '../Iteration/Next'\nimport {Length} from './Length'\nimport {Pos} from '../Iteration/Pos'\nimport {Cast} from '../Any/Cast'\nimport {List} from './List'\nimport {Naked} from './_Internal'\nimport {Extends} from '../Any/Extends'\nimport {Append} from './Append'\n\n/**\n * @hidden\n */\ntype __Zip<L extends List, L1 extends List, LN extends List = [], I extends Iteration = IterationOf<0>> = {\n    0: __Zip<L, L1, Append<LN, [L[Pos<I>], L1[Pos<I>]]>, Next<I>>\n    1: LN\n}[Extends<Pos<I>, Length<L>>]\n\n/**\n * @hidden\n */\nexport type _Zip<L extends List, L1 extends List> =\n    __Zip<Naked<L>, L1> extends infer X\n    ? Cast<X, List>\n    : never\n\n/**\n * Pair up the entries of `L` with `L1`\n * @param L to pair up\n * @param L1 to pair up with\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type Zip<L extends List, L1 extends List> =\n    L extends unknown\n    ? L1 extends unknown\n      ? _Zip<L, L1>\n      : never\n    : never\n"
  },
  {
    "path": "sources/List/ZipObj.ts",
    "content": "import {Length} from './Length'\nimport {Pos} from '../Iteration/Pos'\nimport {Next} from '../Iteration/Next'\nimport {IterationOf} from '../Iteration/IterationOf'\nimport {Iteration} from '../Iteration/Iteration'\nimport {Cast} from '../Any/Cast'\nimport {Record} from '../Object/Record'\nimport {Key} from '../Any/Key'\nimport {List} from './List'\nimport {Naked} from './_Internal'\nimport {Extends} from '../Any/Extends'\nimport {PatchFlat} from '../Object/Patch'\n\n/**\n * @hidden\n */\ntype __ZipObj<LKeys extends List<Key>, LFields extends List, O extends object = {}, I extends Iteration = IterationOf<0>> = {\n    0: __ZipObj<LKeys, LFields, PatchFlat<O, Record<LKeys[Pos<I>], LFields[Pos<I>]>>, Next<I>>\n    1: O\n}[Extends<Pos<I>, Length<LKeys>>]\n\n/**\n * @hidden\n */\nexport type _ZipObj<LKeys extends List<Key>, LFields extends List> =\n    __ZipObj<Naked<LKeys>, LFields> extends infer X\n    ? Cast<X, object>\n    : never\n\n/**\n * Create an [[Object]] from [[List]]s of keys & fields\n * @param LKeys its keys\n * @param LFields its fields\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type ZipObj<LKeys extends List<Key>, LFields extends List> =\n    LKeys extends unknown\n    ? LFields extends unknown\n      ? _ZipObj<LKeys, LFields>\n      : never\n    : never\n"
  },
  {
    "path": "sources/List/_Internal.ts",
    "content": "/** @ignore *//** */\n\nimport {Overwrite} from '../Object/Overwrite'\nimport {List} from './List'\n\n/**\n * Remove `?` & `readonly` from a [[List]]\n */\nexport type Naked<L extends List> =\n    Overwrite<Required<L>, L>\n\nexport type Key = string | number | symbol\n"
  },
  {
    "path": "sources/List/_api.ts",
    "content": "/** @ignore *//** */\n\nexport {Append} from './Append'\nexport {Assign} from './Assign'\nexport {AtLeast} from './AtLeast'\nexport {Compulsory} from './Compulsory'\nexport {CompulsoryKeys} from './CompulsoryKeys'\nexport {Concat} from './Concat'\nexport {Diff} from './Diff'\nexport {Drop} from './Drop'\nexport {Either} from './Either'\nexport {Exclude} from './Exclude'\nexport {ExcludeKeys} from './ExcludeKeys'\nexport {Extract} from './Extract'\nexport {Filter} from './Filter'\nexport {FilterKeys} from './FilterKeys'\nexport {Flatten} from './Flatten'\nexport {Group} from './Group'\nexport {Has} from './Has'\nexport {HasPath} from './HasPath'\nexport {Head} from './Head'\nexport {Includes} from './Includes'\nexport {Intersect} from './Intersect'\nexport {IntersectKeys} from './IntersectKeys'\nexport {KeySet} from './KeySet'\nexport {Last} from './Last'\nexport {LastKey} from './LastKey'\nexport {Length} from './Length'\nexport {List} from './List'\nexport {Longest} from './Longest'\nexport {Merge} from './Merge'\nexport {MergeAll} from './MergeAll'\nexport {Modify} from './Modify'\nexport {NonNullable} from './NonNullable'\nexport {NonNullableKeys} from './NonNullableKeys'\nexport {Nullable} from './Nullable'\nexport {NullableKeys} from './NullableKeys'\nexport {ObjectOf} from './ObjectOf'\nexport {Omit} from './Omit'\nexport {Optional} from './Optional'\nexport {OptionalKeys} from './OptionalKeys'\nexport {Overwrite} from './Overwrite'\nexport {Partial} from './Partial'\nexport {Patch} from './Patch'\nexport {PatchAll} from './PatchAll'\nexport {Path} from './Path'\nexport {Paths} from './Paths'\nexport {Pick} from './Pick'\nexport {Pop} from './Pop'\nexport {Prepend} from './Prepend'\nexport {Readonly} from './Readonly'\nexport {ReadonlyKeys} from './ReadonlyKeys'\nexport {Remove} from './Remove'\nexport {Repeat} from './Repeat'\nexport {Replace} from './Replace'\nexport {Required} from './Required'\nexport {RequiredKeys} from './RequiredKeys'\nexport {Reverse} from './Reverse'\nexport {Select} from './Select'\nexport {SelectKeys} from './SelectKeys'\nexport {Shortest} from './Shortest'\nexport {Tail} from './Tail'\nexport {Take} from './Take'\nexport {Undefinable} from './Undefinable'\nexport {UndefinableKeys} from './UndefinableKeys'\nexport {Unionize} from './Unionize'\nexport {UnionOf} from './UnionOf'\nexport {UnNest} from './UnNest'\nexport {Update} from './Update'\nexport {Writable} from './Writable'\nexport {WritableKeys} from './WritableKeys'\nexport {Zip} from './Zip'\nexport {ZipObj} from './ZipObj'\n"
  },
  {
    "path": "sources/Misc/BuiltIn.ts",
    "content": "/*\n * type Errors =\n * | Error\n * | EvalError\n * | RangeError\n * | ReferenceError\n * | SyntaxError\n * | TypeError\n * | URIError\n */\n\n/*\n * type Numeric =\n * | Number\n * | BigInt // not needed\n * | Math\n * | Date\n */\n\n/*\n * type Textual =\n * | String\n * | RegExp\n */\n\n/*\n * type Arrays =\n * | Array<unknown>\n * | ReadonlyArray<unknown>\n * | Int8Array\n * | Uint8Array\n * | Uint8ClampedArray\n * | Int16Array\n * | Uint16Array\n * | Int32Array\n * | Uint32Array\n * | Float32Array\n * | Float64Array\n * | BigInt64Array\n * | BigUint64Array\n */\n\n/*\n * type Maps =\n * | Map<unknown, unknown>\n * | Set<unknown>\n * | ReadonlyMap<unknown, unknown>\n * | ReadonlySet<unknown>\n * | WeakMap<object, unknown>\n * | WeakSet<object>\n */\n\n/*\n * type Structures =\n * | ArrayBuffer\n * | SharedArrayBuffer\n * | Atomics\n * | DataView\n * | JSON\n */\n\n/*\n * type Abstractions =\n * | Function\n * | Promise<unknown>\n * | Generator\n * | GeneratorFunction\n */\n\n\n/**\n * @hidden\n */\n// type WebAssembly = never\n\nexport type BuiltIn =\n    | Function\n    | Error\n    | Date\n    | {readonly [Symbol.toStringTag]: string}\n    | RegExp\n    | Generator\n"
  },
  {
    "path": "sources/Misc/JSON/Array.ts",
    "content": "import {Value} from './Value'\n\n/**\n * A list of JSON [[Value]]s\n */\nexport interface List extends Array<Value> {}\n"
  },
  {
    "path": "sources/Misc/JSON/Object.ts",
    "content": "import {Value} from './Value'\n\n/**\n * An object of JSON [[Value]]s\n */\nexport interface Object {\n\t[k: string]: Value;\n}\n"
  },
  {
    "path": "sources/Misc/JSON/Primitive.ts",
    "content": "/**\n * Basic JSON Value\n */\nexport type Primitive = string | number | boolean | null;\n"
  },
  {
    "path": "sources/Misc/JSON/Value.ts",
    "content": "import {Primitive} from './Primitive'\nimport {List} from './Array'\nimport {Object} from './Object'\n\n/**\n * Any JSON data/value\n */\nexport type Value = Primitive | Object | List\n"
  },
  {
    "path": "sources/Misc/JSON/_api.ts",
    "content": "/** @ignore *//** */\n\nexport {List as Array} from './Array'\nexport {Object} from './Object'\nexport {Primitive} from './Primitive'\nexport {Value} from './Value'\n"
  },
  {
    "path": "sources/Misc/Primitive.ts",
    "content": "/**\n * All primitive types\n */\nexport type Primitive =\n    | boolean\n    | string\n    | number\n    | bigint\n    | symbol\n    | undefined\n    | null\n"
  },
  {
    "path": "sources/Misc/_api.ts",
    "content": "/** @ignore *//** */\n\nimport * as JSON from './JSON/_api'\n\nexport {JSON}\nexport {BuiltIn} from './BuiltIn'\nexport {Primitive} from './Primitive'\n"
  },
  {
    "path": "sources/Number/Absolute.ts",
    "content": "import {_Negate} from './Negate'\nimport {_IsNegative} from './IsNegative'\nimport {IterationOf} from '../Iteration/IterationOf'\nimport {Iteration} from '../Iteration/Iteration'\n\n/**\n * @hidden\n */\nexport type _Absolute<N extends Iteration> = {\n    0: N\n    1: _Negate<N>\n}[_IsNegative<N>]\n\n/**\n * Get the absolute value of a [[Number]]\n * @param N to absolute\n * @returns `string | number | boolean`\n * @example\n * ```ts\n * import {N} from 'ts-toolbelt'\n *\n * type test0 = N.Absolute<'-20'>      // '20'\n *\n * type test1 = N.Absolute<'-20', 's'> // '20'\n * type test2 = N.Absolute<'-20', 'n'> //  20\n * ```\n */\nexport type Absolute<N extends number> =\n    N extends unknown\n    ? _Absolute<IterationOf<N>>[0]\n    : never\n"
  },
  {
    "path": "sources/Number/Add.ts",
    "content": "import {IterationOf} from '../Iteration/IterationOf'\nimport {Iteration} from '../Iteration/Iteration'\nimport {Pos} from '../Iteration/Pos'\nimport {Prev} from '../Iteration/Prev'\nimport {Next} from '../Iteration/Next'\nimport {_IsNegative} from './IsNegative'\nimport {Cast} from '../Any/Cast'\n\n/**\n * @hidden\n */\ntype _AddPositive<N1 extends Iteration, N2 extends Iteration> = {\n    0: _AddPositive<Next<N1>, Prev<N2>> // N1 = -/+, N2 = +\n    1: N1\n    2: IterationOf<number>\n}[\n    Pos<N2> extends 0        // If successful\n    ? 1\n    : number extends Pos<N2> // If un-success\n      ? 2\n      : 0                    // Or continue\n]\n\n/**\n * @hidden\n */\ntype AddPositive<N1 extends Iteration, N2 extends Iteration> =\n    _AddPositive<N1, N2> extends infer X\n    ? Cast<X, Iteration>\n    : never\n\n/**\n * @hidden\n */\ntype _AddNegative<N1 extends Iteration, N2 extends Iteration> = {\n    0: _AddNegative<Prev<N1>, Next<N2>> // N1 = -/+, N2 = -\n    1: N1\n    2: number\n}[\n    Pos<N2> extends 0        // If successful\n    ? 1\n    : number extends Pos<N2> // If un-success\n      ? 2\n      : 0                    // Or continue\n]\n\n/**\n * @hidden\n */\ntype AddNegative<N1 extends Iteration, N2 extends Iteration> =\n    _AddNegative<N1, N2> extends infer X\n    ? Cast<X, Iteration>\n    : never\n\n/**\n * @hidden\n */\nexport type _Add<N1 extends Iteration, N2 extends Iteration> = {\n    0: AddPositive<N1, N2>\n    1: AddNegative<N1, N2>\n}[_IsNegative<N2>]\n\n/**\n * Add a [[Number]] to another one\n * @param N1 Left-hand side\n * @param N2 Right-hand side\n * @returns `string | number | boolean`\n * @example\n * ```ts\n * import {N} from 'ts-toolbelt'\n *\n * type test0 = N.Add<'2', '10'>        // '12'\n * type test1 = N.Add<'0', '40'>        // '40'\n * type test2 = N.Add<'0', '40', 's'>   // '40'\n * type test3 = N.Add<'0', '40', 'n'>   //  40\n * type test4 = N.Add<'-20', '40', 's'> // '20'\n * type test5 = N.Add<'-20', '40', 'n'> //  20\n * ```\n */\nexport type Add<N1 extends number, N2 extends number> =\n    N1 extends unknown\n    ? N2 extends unknown\n      ? _Add<IterationOf<N1>, IterationOf<N2>>[0]\n      : never\n    : never\n"
  },
  {
    "path": "sources/Number/Greater.ts",
    "content": "import {_Sub} from './Sub'\nimport {_IsPositive} from './IsPositive'\nimport {IterationOf} from '../Iteration/IterationOf'\nimport {Iteration} from '../Iteration/Iteration'\n\n/**\n * @hidden\n */\nexport type _Greater<N1 extends Iteration, N2 extends Iteration> =\n    _IsPositive<_Sub<N1, N2>>\n\n/**\n * Check if a [[Number]] is bigger than another one\n * @param N1 to compare\n * @param N2 to compare to\n * @returns [[Boolean]]\n * @example\n * ```ts\n * import {N} from 'ts-toolbelt'\n *\n * type test0 = N.Greater<'7', '5'> // True\n * type test1 = N.Greater<'5', '5'> // False\n * type test2 = N.Greater<'5', '7'> // False\n * ```\n */\nexport type Greater<N1 extends number, N2 extends number> =\n    N1 extends unknown\n    ? N2 extends unknown\n      ? _Greater<IterationOf<N1>, IterationOf<N2>>\n      : never\n    : never\n"
  },
  {
    "path": "sources/Number/GreaterEq.ts",
    "content": "import {Equals} from '../Any/Equals'\nimport {_Greater} from './Greater'\nimport {IterationOf} from '../Iteration/IterationOf'\nimport {Iteration} from '../Iteration/Iteration'\nimport {Or} from '../Boolean/Or'\n\n/**\n * @hidden\n */\nexport type _GreaterEq<N1 extends Iteration, N2 extends Iteration> =\n    Or<Equals<N1, N2>, _Greater<N1, N2>>\n\n/**\n * Check if a [[Number]] is greater or equal to another one\n * @param N1 to compare\n * @param N2 to compare to\n * @returns [[Boolean]]\n * @example\n * ```ts\n * import {N} from 'ts-toolbelt'\n *\n * type test0 = N.GreaterEq<'7', '5'> // True\n * type test1 = N.GreaterEq<'5', '5'> // True\n * type test2 = N.GreaterEq<'5', '7'> // False\n * ```\n */\nexport type GreaterEq<N1 extends number, N2 extends number> =\n    N1 extends unknown\n    ? N2 extends unknown\n      ? _GreaterEq<IterationOf<N1>, IterationOf<N2>>\n      : never\n    : never\n"
  },
  {
    "path": "sources/Number/IsNegative.ts",
    "content": "import {IterationOf} from '../Iteration/IterationOf'\nimport {Iteration} from '../Iteration/Iteration'\n\n/**\n * @hidden\n */\nexport type _IsNegative<N extends Iteration> = {\n    '-': 1\n    '+': 0\n    '0': 0\n}[N[1]]\n\n/**\n * Check whether a [[Number]] is negative or not\n * @param N to check\n * @returns [[Boolean]]\n * @example\n * ```ts\n * import {N} from 'ts-toolbelt'\n *\n * type test0 = N.IsNegative<'0'>  // False\n * type test1 = N.IsNegative<'-7'> // True\n * type test2 = N.IsNegative<'7'>  // False\n * ```\n */\nexport type IsNegative<N extends number> =\n    _IsNegative<IterationOf<N>>\n"
  },
  {
    "path": "sources/Number/IsPositive.ts",
    "content": "import {_IsNegative} from './IsNegative'\nimport {IterationOf} from '../Iteration/IterationOf'\nimport {Iteration} from '../Iteration/Iteration'\n\n/**\n * @hidden\n */\nexport type _IsPositive<N extends Iteration> = {\n    '-': 0\n    '+': 1\n    '0': 0\n}[N[1]]\n\n/**\n * Check whether a [[Number]] is positive or not\n * @param N to check\n * @returns [[Boolean]]\n * @example\n * ```ts\n * import {N} from 'ts-toolbelt'\n *\n * type test0 = N.IsPositive<'0'>  // False\n * type test1 = N.IsPositive<'-7'> // False\n * type test2 = N.IsPositive<'7'>  // True\n * ```\n */\nexport type IsPositive<N extends number> =\n    _IsPositive<IterationOf<N>>\n"
  },
  {
    "path": "sources/Number/IsZero.ts",
    "content": "import {IterationOf} from '../Iteration/IterationOf'\nimport {Iteration} from '../Iteration/Iteration'\n\n/**\n * @hidden\n */\nexport type _IsZero<N extends Iteration> = {\n    '-': 0\n    '+': 0\n    '0': 1\n}[N[1]]\n\n/**\n * Check whether a [[Number]] is null or not\n * @param N to check\n * @returns [[Boolean]]\n * @example\n * ```ts\n * import {N} from 'ts-toolbelt'\n *\n * type test0 = N.IsZero<'0'>  // True\n * type test1 = N.IsZero<'-7'> // False\n * type test2 = N.IsZero<'7'>  // False\n * ```\n */\nexport type IsZero<N extends number> =\n    _IsZero<IterationOf<N>>\n"
  },
  {
    "path": "sources/Number/Lower.ts",
    "content": "import {_Greater} from './Greater'\nimport {IterationOf} from '../Iteration/IterationOf'\nimport {Iteration} from '../Iteration/Iteration'\n\n/**\n * @hidden\n */\nexport type _Lower<N1 extends Iteration, N2 extends Iteration> =\n    _Greater<N2, N1>\n\n/**\n * Check if a [[Number]] is lower than another one\n * @param N1 to compare\n * @param N2 to compare to\n * @returns [[Boolean]]\n * @example\n * ```ts\n * import {N} from 'ts-toolbelt'\n *\n * type test0 = N.Lower<'7', '5'> // False\n * type test1 = N.Lower<'5', '5'> // False\n * type test2 = N.Lower<'5', '7'> // True\n * ```\n */\nexport type Lower<N1 extends number, N2 extends number> =\n    N1 extends unknown\n    ? N2 extends unknown\n      ? _Lower<IterationOf<N1>, IterationOf<N2>>\n      : never\n    : never\n"
  },
  {
    "path": "sources/Number/LowerEq.ts",
    "content": "import {GreaterEq} from './GreaterEq'\n\n/**\n * Check if a [[Number]] is lower or equal to another one\n * @param N1 to compare\n * @param N2 to compare to\n * @returns [[Boolean]]\n * @example\n * ```ts\n * import {N} from 'ts-toolbelt'\n *\n * type test0 = N.LowerEq<'7', '5'> // False\n * type test1 = N.LowerEq<'5', '5'> // True\n * type test2 = N.LowerEq<'5', '7'> // True\n * ```\n */\nexport type LowerEq<N1 extends number, N2 extends number> =\n    GreaterEq<N2, N1>\n"
  },
  {
    "path": "sources/Number/Negate.ts",
    "content": "import {_Sub} from './Sub'\nimport {IterationOf} from '../Iteration/IterationOf'\nimport {Iteration, IterationMap} from '../Iteration/Iteration'\n\n/**\n * @hidden\n */\nexport type _Negate<N extends Iteration> =\n    IterationMap[N[4]]\n\n/**\n * Negate a [[Number]]\n * @param N to negate\n * @returns `string | number | boolean`\n * @example\n * ```ts\n * import {N} from 'ts-toolbelt'\n *\n * type test0 = N.Negate<'-10'>     //  '10'\n * type test1 = N.Negate<'10'>      // '-10'\n * type test2 = N.Negate<'10', 's'> // '-10'\n * type test3 = N.Negate<'10', 'n'> //  -10\n * type test4 = N.Negate<'-100'>    // string\n * ```\n */\nexport type Negate<N extends number> =\n    N extends unknown\n    ? _Negate<IterationOf<N>>[0]\n    : never\n"
  },
  {
    "path": "sources/Number/Range.ts",
    "content": "import {IterationOf} from '../Iteration/IterationOf'\nimport {Iteration} from '../Iteration/Iteration'\nimport {Prepend} from '../List/Prepend'\nimport {Prev} from '../Iteration/Prev'\nimport {Next} from '../Iteration/Next'\nimport {Cast} from '../Any/Cast'\nimport {Way} from '../Iteration/_Internal'\nimport {List} from '../List/List'\nimport {Extends} from '../Any/Extends'\nimport {Pos} from '../Iteration/Pos'\n\n/**\n * @hidden\n */\ntype RangeForth<From extends Iteration, To extends Iteration, L extends List = []> = {\n    0: RangeForth<Prev<From>, To, Prepend<L, Pos<From>>>\n    1: L\n}[Extends<From, To>]\n\n/**\n * @hidden\n */\ntype RangeBack<From extends Iteration, To extends Iteration, L extends List = []> = {\n    0: RangeBack<Next<From>, To, Prepend<L, Pos<From>>>\n    1: L\n}[Extends<From, To>]\n\n/**\n * @hidden\n */\ntype __Range<From extends Iteration, To extends Iteration, way extends Way> = {\n    '->': RangeForth<To, Prev<From>> // Reverse logic to work naturally #`Prepend`\n    '<-': RangeBack<From, Next<To>>  // Works in reverse mode (default) #`Prepend`\n}[way]\n\n/**\n * @hidden\n */\nexport type _Range<From extends number, To extends number, way extends Way> =\n    __Range<IterationOf<From>, IterationOf<To>, way> extends infer X\n    ? Cast<X, (string | number)[]>\n    : never\n\n/**\n * Create a range of * *number**s\n * @param From to start with\n * @param To to end with\n * @param way (?=`'->'`) to reverse it\n * @returns `string[] | number[] | boolean[]`\n * @example\n * ```ts\n * import {N} from 'ts-toolbelt'\n *\n * type test0 = N.Range<'-2', '1'>            // ['-2', '-1', '0', '1']\n * type test1 = N.Range<'-2', '1', '->'>      // ['-2', '-1', '0', '1']\n * type test2 = N.Range<'-2', '1', '<-'>      // ['1', '0', '-1', '-2']\n * ```\n */\nexport type Range<From extends number, To extends number, way extends Way = '->'> =\n    From extends unknown\n    ? To extends unknown\n      ? _Range<From, To, way>\n      : never\n    : never\n"
  },
  {
    "path": "sources/Number/Sub.ts",
    "content": "import {IterationOf} from '../Iteration/IterationOf'\nimport {Iteration} from '../Iteration/Iteration'\nimport {Pos} from '../Iteration/Pos'\nimport {Prev} from '../Iteration/Prev'\nimport {Next} from '../Iteration/Next'\nimport {_IsNegative} from './IsNegative'\nimport {Cast} from '../Any/Cast'\n\n/**\n * @hidden\n */\ntype _SubPositive<N1 extends Iteration, N2 extends Iteration> = {\n    0: _SubPositive<Prev<N1>, Prev<N2>> // N1 = -/+, N2 = +\n    1: N1\n    2: number\n}[\n    Pos<N2> extends 0        // If successful\n    ? 1\n    : number extends Pos<N2> // If un-success\n      ? 2\n      : 0                    // Or continue\n]\n\n/**\n * @hidden\n */\ntype SubPositive<N1 extends Iteration, N2 extends Iteration> =\n    _SubPositive<N1, N2> extends infer X\n    ? Cast<X, Iteration>\n    : never\n\n/**\n * @hidden\n */\ntype _SubNegative<N1 extends Iteration, N2 extends Iteration> = {\n    0: _SubNegative<Next<N1>, Next<N2>> // N1 = -/+, N2 = -\n    1: N1\n    2: number\n}[\n    Pos<N2> extends 0        // If successful\n    ? 1\n    : number extends Pos<N2> // If un-success\n      ? 2\n      : 0                    // Or continue\n]\n\n/**\n * @hidden\n */\ntype SubNegative<N1 extends Iteration, N2 extends Iteration> =\n    _SubNegative<N1, N2> extends infer X\n    ? Cast<X, Iteration>\n    : never\n\n/**\n * @hidden\n */\nexport type _Sub<N1 extends Iteration, N2 extends Iteration> = {\n    0: SubPositive<N1, N2>\n    1: SubNegative<N1, N2>\n}[_IsNegative<N2>]\n\n/**\n * Subtract a [[Number]] from another one\n * @param N1 Left-hand side\n * @param N2 Right-hand side\n * @returns `string | number | boolean`\n * @example\n * ```ts\n * import {N} from 'ts-toolbelt'\n *\n * type test0 = N.Sub<'2', '10'>        // '-8'\n * type test1 = N.Sub<'0', '40'>        // '-40'\n * type test2 = N.Sub<'0', '40', 's'>   // '-40'\n * type test3 = N.Sub<'0', '40', 'n'>   //  -40\n * type test4 = N.Sub<'-20', '40', 's'> // string\n * type test5 = N.Sub<'-20', '40', 'n'> // number\n * ```\n */\nexport type Sub<N1 extends number, N2 extends number> =\n    N1 extends unknown\n    ? N2 extends unknown\n      ? _Sub<IterationOf<N1>, IterationOf<N2>>[0]\n      : never\n    : never\n"
  },
  {
    "path": "sources/Number/_api.ts",
    "content": "/** @ignore *//** */\n\nexport {Absolute} from './Absolute'\nexport {Add} from './Add'\nexport {Greater} from './Greater'\nexport {GreaterEq} from './GreaterEq'\nexport {IsNegative} from './IsNegative'\nexport {IsPositive} from './IsPositive'\nexport {IsZero} from './IsZero'\nexport {Lower} from './Lower'\nexport {LowerEq} from './LowerEq'\nexport {Negate} from './Negate'\nexport {Range} from './Range'\nexport {Sub} from './Sub'\n"
  },
  {
    "path": "sources/Object/Assign.ts",
    "content": "import {Iteration} from '../Iteration/Iteration'\nimport {IterationOf} from '../Iteration/IterationOf'\nimport {Merge} from './Merge'\nimport {Pos} from '../Iteration/Pos'\nimport {Next} from '../Iteration/Next'\nimport {Length} from '../List/Length'\nimport {Cast} from '../Any/Cast'\nimport {List} from '../List/List'\nimport {Extends} from '../Any/Extends'\nimport {Depth} from './_Internal'\nimport {BuiltIn} from '../Misc/BuiltIn'\n\n/**\n * @hidden\n */\ntype __Assign<O extends object, Os extends List<object>, depth extends Depth, ignore extends object, fill extends any, I extends Iteration = IterationOf<0>> = {\n    0: __Assign<Merge<Os[Pos<I>], O, depth, ignore, fill>, Os, depth, ignore, fill, Next<I>>\n    1: O\n}[Extends<Pos<I>, Length<Os>>]\n\n/**\n * @hidden\n */\nexport type _Assign<O extends object, Os extends List<object>, depth extends Depth, ignore extends object, fill extends any> =\n    __Assign<O, Os, depth, ignore, fill> extends infer X\n    ? Cast<X, object>\n    : never\n\n/**\n * Assign a list of [[Object]] into `O` with [[Merge]]. Merges from right to\n * left, first items get overridden by the next ones (last-in overrides).\n * @param O to assign to\n * @param Os to assign\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @param ignore (?=`BuiltIn`) types not to merge\n * @param fill (?=`undefined`) types of `O` to be replaced with ones of `O1`\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Assign<O extends object, Os extends List<object>, depth extends Depth = 'flat', ignore extends object = BuiltIn, fill extends any = undefined> =\n    O extends unknown\n    ? Os extends unknown\n      ? _Assign<O, Os, depth, ignore, fill>\n      : never\n    : never\n"
  },
  {
    "path": "sources/Object/AtLeast.ts",
    "content": "import {_Omit} from './Omit'\nimport {_Pick} from './Pick'\nimport {Key} from '../Any/Key'\nimport {Keys} from '../Any/Keys'\nimport {RequiredFlat} from './Required'\nimport {Extends} from '../Any/Extends'\nimport {ComputeRaw} from '../Any/Compute'\nimport {OptionalFlat} from './Optional'\n\n/**\n * @hidden\n */\ntype RequiredIfKeys<O extends object, K extends Key> =\n    Extends<keyof O & K, K> extends 1\n    ? RequiredFlat<O>\n    : O\n\n/**\n * @hidden\n */\ntype __AtLeast<O extends object, K extends Key> =\n    K extends keyof O               // if we can operate on it\n    ? _Pick<O, K> & OptionalFlat<O> // take entry & make rest optional\n    : O\n\n/**\n * @hidden\n */\ntype _AtLeast<O extends object, K extends Key> =\n    ComputeRaw<__AtLeast<RequiredIfKeys<O, K>, K>>\n\n/**\n * Make that at least one of the keys `K` are required in `O` at a time.\n * @param O to make required\n * @param K (?=`keyof O`) to choose fields\n * @returns [[Object]] [[Union]]\n * @example\n * ```ts\n * ```\n */\nexport type AtLeast<O extends object, K extends Key = Keys<O>> =\n    O extends unknown\n    ? _AtLeast<O, K>\n    : never\n"
  },
  {
    "path": "sources/Object/Compulsory.ts",
    "content": "import {_Pick} from './Pick'\nimport {Depth} from './_Internal'\nimport {Key} from '../Any/Key'\nimport {NonNullable} from '../Union/NonNullable'\nimport {PatchFlat} from './Patch'\nimport {BuiltIn} from '../Misc/BuiltIn'\n\n/**\n * @hidden\n */\nexport type CompulsoryFlat<O> = {\n    [K in keyof O]-?: NonNullable<O[K]>\n} & {}\n\n/**\n * @hidden\n */\nexport type CompulsoryDeep<O> = {\n    [K in keyof O]-?: O[K] extends BuiltIn\n                      ? O[K]\n                      : CompulsoryDeep<NonNullable<O[K]>>\n}\n\n/**\n * @hidden\n */\nexport type CompulsoryPart<O extends object, depth extends Depth> = {\n    'flat': CompulsoryFlat<O>,\n    'deep': CompulsoryDeep<O>,\n}[depth]\n\n/**\n * @hidden\n */\nexport type _Compulsory<O extends object, K extends Key, depth extends Depth> =\n    PatchFlat<CompulsoryPart<_Pick<O, K>, depth>, O>\n\n/**\n * Make that `O`'s fields cannot be [[Nullable]] or [[Optional]] (it's like\n * [[Required]] & [[NonNullable]] at once).\n * @param O to make compulsory\n * @param K (?=`Key`) to choose fields\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Compulsory<O extends object, K extends Key = Key, depth extends Depth = 'flat'> =\n    O extends unknown\n    ? _Compulsory<O, K, depth>\n    : never\n"
  },
  {
    "path": "sources/Object/CompulsoryKeys.ts",
    "content": "/**\n * @hidden\n */\nexport type _CompulsoryKeys<O extends object> = {\n    [K in keyof O]-?: [O[K] & (undefined | null)] extends [never]\n                      ? K\n                      : never\n}[keyof O]\n\n/**\n * Get the keys of `O` that are [[Compulsory]]\n *\n * (⚠️ needs `--strictNullChecks` enabled)\n * @param O\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type CompulsoryKeys<O extends object> =\n    O extends unknown\n    ? _CompulsoryKeys<O>\n    : never\n"
  },
  {
    "path": "sources/Object/Diff.ts",
    "content": "import {Exclude} from './Exclude'\nimport {Match} from '../Any/_Internal'\nimport {PatchFlat} from './Patch'\n\n/**\n * Get an [[Object]] that is the difference between `O` & `O1`\n * (`O`'s differences have priority over `O1`'s if fields overlap)\n * (If `match = 'default'`, no type checks are done)\n * @param O to check differences with\n * @param O1 to check differences against\n * @param match (?=`'default'`) to change precision\n * @returns [[Object]]\n * @example\n * ```ts\n * import {O} from 'ts-toolbelt'\n *\n * type Person0 = {\n *  name: string\n *  age: string\n * }\n *\n * type Person1 = {\n *  name: string\n *  age: number | string\n *  nick: string\n * }\n *\n * type test0 = O.Diff<Person0, Person1, 'default'>   // {nick: string}\n * type test1 = O.Diff<Person0, Person1, 'extends->'> // {nick: string; age: string | number}\n * type test2 = O.Diff<Person0, Person1, '<-extends'> // {nick: string; age: string}\n * type test3 = O.Diff<Person0, Person1, 'equals'>    // {nick: string; age: string}\n * ```\n */\nexport type Diff<O extends object, O1 extends object, match extends Match = 'default'> =\n    PatchFlat<Exclude<O, O1, match>, Exclude<O1, O, match>>\n"
  },
  {
    "path": "sources/Object/Either.ts",
    "content": "import {_Omit} from './Omit'\nimport {_Pick} from './Pick'\nimport {Key} from '../Any/Key'\nimport {Strict} from '../Union/Strict'\nimport {Boolean} from '../Boolean/_Internal'\nimport {ComputeRaw} from '../Any/Compute'\n\n/**\n * @hidden\n */\ntype __Either<O extends object, K extends Key> =\n    _Omit<O, K> & ({           // Merge all but K\n        [P in K]: _Pick<O, P> // With K possibilities\n    }[K])\n\n/**\n * @hidden\n */\ntype EitherStrict<O extends object, K extends Key> =\n    Strict<__Either<O, K>>\n\n/**\n * @hidden\n */\ntype EitherLoose<O extends object, K extends Key> =\n    ComputeRaw<__Either<O, K>>\n\n/**\n * @hidden\n */\nexport type _Either<O extends object, K extends Key, strict extends Boolean> = {\n    1: EitherStrict<O, K>\n    0: EitherLoose<O, K>\n}[strict]\n\n/**\n * Split `O` into a [[Union]] with `K` keys in such a way that none of\n * the keys are ever present with one another within the different unions.\n * @param O to split\n * @param K to split with\n * @param strict (?=`1`) to force excess property checks https://github.com/microsoft/TypeScript/issues/20863\n * @returns [[Object]] [[Union]]\n * @example\n * ```ts\n * ```\n */\nexport type Either<O extends object, K extends Key, strict extends Boolean = 1> =\n    O extends unknown\n    ? _Either<O, K, strict>\n    : never\n"
  },
  {
    "path": "sources/Object/Exclude.ts",
    "content": "import {ExcludeKeys} from './ExcludeKeys'\nimport {Match} from '../Any/_Internal'\nimport {Pick} from './Pick'\n\n/**\n * Exclude the fields of `O1` out of `O`\n * (If `match = 'default'`, no type checks are done)\n * @param O to remove from\n * @param O1 to remove out\n * @param match (?=`'default'`) to change precision\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Exclude<O extends object, O1 extends object, match extends Match = 'default'> =\n    Pick<O, ExcludeKeys<O, O1, match>>\n"
  },
  {
    "path": "sources/Object/ExcludeKeys.ts",
    "content": "import {Exclude} from '../Union/Exclude'\nimport {Match} from '../Any/_Internal'\nimport {Is} from '../Any/Is'\nimport {At} from '../Any/At'\nimport {Keys} from '../Any/Keys'\n\n/**\n * @hidden\n */\nexport type _ExcludeMatch<O extends object, O1 extends object, match extends Match> = {\n    [K in keyof O]-?: {\n        1: never\n        0: K\n    }[Is<O[K], At<O1, K>, match>]\n}[keyof O]\n\n/**\n * @hidden\n */\ntype ExcludeMatch<O extends object, O1 extends object, match extends Match> =\n    O extends unknown\n    ? _ExcludeMatch<O, O1, match>\n    : never\n\n/**\n * Exclude the keys of `O1` out of the keys of `O`\n * (If `match = 'default'`, no type checks are done)\n * @param O to remove the keys from\n * @param O1 to remove the keys out\n * @param match (?=`'default'`) to change precision\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type ExcludeKeys<O extends object, O1 extends object, match extends Match = 'default'> = {\n    'default'     : Exclude<Keys<O>, Keys<O1>>\n    'contains->'  : ExcludeMatch<O,  O1, 'contains->'>\n    'extends->'   : ExcludeMatch<O,  O1, 'extends->'>\n    '<-contains'  : ExcludeMatch<O,  O1, '<-contains'>\n    '<-extends'   : ExcludeMatch<O,  O1, '<-extends'>\n    'equals'      : ExcludeMatch<O,  O1, 'equals'>\n}[match]\n"
  },
  {
    "path": "sources/Object/Filter.ts",
    "content": "import {FilterKeys} from './FilterKeys'\nimport {Match} from '../Any/_Internal'\nimport {Pick} from './Pick'\n\n/**\n * Filter out of `O` the fields that match `M`\n * @param O to remove from\n * @param M to select fields\n * @param match (?=`'default'`) to change precision\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Filter<O extends object, M extends any, match extends Match = 'default'> =\n    Pick<O, FilterKeys<O, M, match>>\n\n"
  },
  {
    "path": "sources/Object/FilterKeys.ts",
    "content": "import {Match} from '../Any/_Internal'\nimport {Is} from '../Any/Is'\n\n/**\n * @hidden\n */\nexport type _FilterKeys<O extends object, M extends any, match extends Match> = {\n    [K in keyof O]-?: {\n        1: never\n        0: K\n    }[Is<O[K], M, match>]\n}[keyof O]\n\n/**\n * Filter out the keys of `O` which fields match `M`\n * @param O to remove from\n * @param M to select fields\n * @param match (?=`'default'`) to change precision\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type FilterKeys<O extends object, M extends any, match extends Match = 'default'> =\n    O extends unknown\n    ? _FilterKeys<O, M, match>\n    : never\n"
  },
  {
    "path": "sources/Object/Has.ts",
    "content": "import {Match} from '../Any/_Internal'\nimport {Is} from '../Any/Is'\nimport {At} from '../Any/At'\nimport {Key} from '../Any/Key'\n\n/**\n * Check whether `O` has a field of key `K` that matches `M`\n * @param O to be inspected\n * @param K to choose field\n * @param M (?=`any`) to check field type\n * @param match (?=`'default'`) to change precision\n * @returns [[Boolean]]\n * @example\n * ```ts\n * ```\n */\nexport type Has<O extends object, K extends Key, M extends any = any, match extends Match = 'default'> =\n    Is<At<O, K>, M, match>\n"
  },
  {
    "path": "sources/Object/HasPath.ts",
    "content": "import {Match} from '../Any/_Internal'\nimport {Path as OPath} from './Path'\nimport {Is} from '../Any/Is'\nimport {Key} from '../Any/Key'\nimport {List} from '../List/List'\n\n/**\n * Check whether `O` has nested properties that match `M`\n * @param O to be inspected\n * @param Path to be followed\n * @param M (?=`any`) to check field type\n * @param match (?=`'default'`) to change precision\n * @returns [[Boolean]]\n * @example\n * ```ts\n * ```\n */\nexport type HasPath<O extends object, Path extends List<Key>, M extends any = any, match extends Match = 'default'> =\n    Is<OPath<O, Path>, M, match>\n"
  },
  {
    "path": "sources/Object/Includes.ts",
    "content": "import {SelectKeys} from './SelectKeys'\nimport {Match} from '../Any/_Internal'\n\n/**\n * Check whether `O` has fields that match `M`\n * @param O to be inspected\n * @param M to check field type\n * @param match (?=`'default'`) to change precision\n * @returns [[Boolean]]\n * @example\n * ```ts\n * ```\n */\nexport type Includes<O extends object, M extends any, match extends Match = 'default'> =\n    [SelectKeys<O, M, match>] extends [never]\n    ? 0\n    : 1\n"
  },
  {
    "path": "sources/Object/Intersect.ts",
    "content": "import {IntersectKeys} from './IntersectKeys'\nimport {Match} from '../Any/_Internal'\nimport {Pick} from './Pick'\n\n/**\n * Get the intersecting fields of `O` & `O1`\n * (If `match = 'default'`, no type checks are done)\n * @param O to check similarities with\n * @param O1 to check similarities against\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Intersect<O extends object, O1 extends object, match extends Match = 'default'> =\n    Pick<O, IntersectKeys<O, O1, match>>\n"
  },
  {
    "path": "sources/Object/IntersectKeys.ts",
    "content": "import {Match} from '../Any/_Internal'\nimport {Is} from '../Any/Is'\nimport {At} from '../Any/At'\nimport {Keys} from '../Any/Keys'\n\n/**\n * @hidden\n */\nexport type _IntersectMatch<O extends object, O1 extends object, match extends Match> = {\n    [K in keyof O]-?: {\n        1: K\n        0: never\n    }[Is<O[K], At<O1, K>, match>]\n}[keyof O]\n\n/**\n * @hidden\n */\ntype IntersectMatch<O extends object, O1 extends object, match extends Match> =\n    O extends unknown\n    ? _IntersectMatch<O, O1, match>\n    : never\n\n/**\n * Get the intersecting keys of `O` & `O1`\n * (If `match = 'default'`, no type checks are done)\n * @param O to check similarities with\n * @param O1 to check similarities against\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type IntersectKeys<O extends object, O1 extends object, match extends Match = 'default'> = {\n    'default'     : Keys<O> & Keys<O1>\n    'contains->'  : IntersectMatch<O,  O1, 'contains->'>\n    'extends->'   : IntersectMatch<O,  O1, 'extends->'>\n    '<-contains'  : IntersectMatch<O,  O1, '<-contains'>\n    '<-extends'   : IntersectMatch<O,  O1, '<-extends'>\n    'equals'      : IntersectMatch<O,  O1, 'equals'>\n}[match]\n"
  },
  {
    "path": "sources/Object/Invert.ts",
    "content": "import {Record} from './Record'\nimport {Key} from '../Any/Key'\nimport {IntersectOf} from '../Union/IntersectOf'\nimport {ComputeRaw} from '../Any/Compute'\n\n/**\n * @hidden\n */\nexport type _Invert<O extends Record<Key, Key>> =\n  ComputeRaw<IntersectOf<\n    { // swaps the key and the value\n      [K in keyof O]: Record<O[K], K>\n    }[keyof O]\n  >>\n\n/**\n * Swaps the keys and values of an [[Object]] (if applicable)\n * @param O\n * @returns [[Object]]\n * @example\n * ```ts\n * import {O} from 'ts-toolbelt'\n *\n * enum E {\n *  A = 'Av',\n *  B = 'Bv',\n *  C = 'Cv',\n *  D = 'Dv',\n *  X = 1\n * }\n *\n * type O = {\n *  A: 'Av'\n *  B: 'Bv'\n *  C: 'Cv'\n *  D: 'Dv'\n *  X: 1\n * }\n *\n * type test0 = O.Invert<typeof E>\n * type test1 = O.Invert<O>\n * ```\n */\nexport type Invert<O extends Record<keyof O, Key>> =\n    O extends unknown\n    ? _Invert<O>\n    : never\n"
  },
  {
    "path": "sources/Object/ListOf.ts",
    "content": "import {Cast} from '../Any/Cast'\nimport {List} from '../List/List'\nimport {Extends} from '../Any/Extends'\nimport {Select} from '../Union/Select'\nimport {Exclude} from '../Union/Exclude'\nimport {Iteration} from '../Iteration/Iteration'\nimport {IterationOf} from '../Iteration/IterationOf'\nimport {Pos} from '../Iteration/Pos'\nimport {Key} from '../Iteration/Key'\nimport {Append} from '../List/Append'\nimport {Next} from '../Iteration/Next'\n\n/**\n * @hidden\n */\ntype AppendExists<O extends object, LN extends List, I extends Iteration> =\n    Key<I> extends keyof O ? Append<LN, O[Key<I>]> :\n    Pos<I> extends keyof O ? Append<LN, O[Pos<I>]> :\n    LN\n\n/**\n * @hidden\n */\ntype ___ListOf<O extends object, K, LN extends List = [], I extends Iteration = IterationOf<0>> = {\n    0: ___ListOf<O, Exclude<K, Key<I>>, AppendExists<O, LN, I>, Next<I>>\n    1: LN\n}[Extends<[K], [never]>]\n\n/**\n * @hidden\n */\ntype __ListOf<O extends object> =\n    number extends keyof O ? O[number][] :\n    string extends keyof O ? O[string][] :\n    symbol extends keyof O ? O[symbol][] :\n    ___ListOf<O, Select<keyof O, number | `${number}`>>\n\n/**\n * @hidden\n */\nexport type _ListOf<O extends object> =\n    __ListOf<O> extends infer X\n    ? Cast<X, List>\n    : never\n\n/**\n * Transform an [[Object]] into a [[List]]\n * (It will only pick numeric literal indexes)\n * @param O to transform\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type ListOf<O extends object> =\n    O extends unknown\n    ? _ListOf<O>\n    : never\n"
  },
  {
    "path": "sources/Object/Merge.ts",
    "content": "import {At} from '../Any/At'\nimport {_OptionalKeys} from './OptionalKeys'\nimport {Key} from '../Any/Key'\nimport {List} from '../List/List'\nimport {Depth, Anyfy} from './_Internal'\nimport {BuiltIn} from '../Misc/BuiltIn'\nimport {Length} from '../List/Length'\nimport {RequiredKeys} from '../List/RequiredKeys'\nimport {Exclude} from '../Union/Exclude'\nimport {Has} from '../Union/Has'\n\n/**\n * @hidden\n */\ntype Longer<L extends List, L1 extends List> =\n  L extends unknown ? L1 extends unknown ?\n  {0: 0, 1: 1}[Has<RequiredKeys<L>, RequiredKeys<L1>>]\n  : never : never\n\n/**\n * @hidden\n */\ntype MergeProp<OK, O1K, fill, OOKeys extends Key, K extends Key> =\n  K extends OOKeys                // if prop of `O` is optional\n  ? Exclude<OK, undefined> | O1K  // merge it with prop of `O1`\n  : [OK] extends [never] ? O1K :  // complete with prop of `O1`\n    OK extends fill ? O1K : OK    // fill/replace if required\n\n/**\n * @hidden\n */\ntype MergeFlatObject<O extends object, O1 extends object, fill, OOKeys extends Key = _OptionalKeys<O>> = {\n  [K in keyof (Anyfy<O> & O1)]: MergeProp<At<O, K>, At<O1, K>, fill, OOKeys, K>\n} & {}\n\n/**\n * @hidden\n */\ntype MergeFlatList<L extends List, L1 extends List, ignore extends object, fill, LOK extends Key = _OptionalKeys<L>> =\n  number extends Length<L | L1>\n  ? MergeFlatChoice<L[number], L1[number], ignore, fill>[]\n  : Longer<L, L1> extends 1\n    ? {[K in keyof L]: MergeProp<L[K], At<L1, K>, fill, LOK, K>}\n    : {[K in keyof L1]: MergeProp<At<L, K>, L1[K], fill, LOK, K>}\n\n/**\n * @hidden\n */\nexport type MergeFlatChoice<O extends object, O1 extends object, ignore extends object, fill> =\n  O extends ignore ? O :\n  O1 extends ignore ? O :\n  O extends List\n  ? O1 extends List\n    ? MergeFlatList<O, O1, ignore, fill>\n    : MergeFlatObject<O, O1, fill>\n  : MergeFlatObject<O, O1, fill>\n\n/**\n * @hidden\n */\nexport type MergeFlat<O extends object, O1 extends object, ignore extends object = BuiltIn, fill = undefined> =\n  O extends unknown ? O1 extends unknown ?\n  MergeFlatChoice<O, O1, ignore, fill>\n  : never : never\n\n/**\n * @hidden\n */\ntype MergeDeepList<L extends List, L1 extends List, ignore extends object, fill> =\n  number extends Length<L | L1>\n  ? MergeDeepChoice<L[number], L1[number], ignore, fill, never, any>[]\n  : Longer<L, L1> extends 1\n    ? {[K in keyof L]: MergeDeepChoice<L[K], At<L1, K>, ignore, fill, _OptionalKeys<L>, K>}\n    : {[K in keyof L1]: MergeDeepChoice<At<L, K>, L1[K], ignore, fill, _OptionalKeys<L>, K>}\n\n/**\n * @hidden\n */\ntype MergeDeepObject<O extends object, O1 extends object, ignore extends object, fill, OOKeys extends Key = _OptionalKeys<O>> = {\n  [K in keyof (Anyfy<O> & O1)]: MergeDeepChoice<At<O, K>, At<O1, K>, ignore, fill, OOKeys, K>\n}\n\n/**\n * @hidden\n */\ntype MergeDeepChoice<OK, O1K, ignore extends object, fill, OOKeys extends Key, K extends Key> =\n  [OK] extends [never] ? MergeProp<OK, O1K, fill, OOKeys, K> :\n  [O1K] extends [never] ? MergeProp<OK, O1K, fill, OOKeys, K> :\n  OK extends ignore ? MergeProp<OK, O1K, fill, OOKeys, K> :\n  O1K extends ignore ? MergeProp<OK, O1K, fill, OOKeys, K> :\n  OK extends List\n  ? O1K extends List\n    ? MergeDeepList<OK, O1K, ignore, fill>\n    : MergeProp<OK, O1K, fill, OOKeys, K>\n  : OK extends object\n    ? O1K extends object\n      ? MergeDeepObject<OK, O1K, ignore, fill>\n      : MergeProp<OK, O1K, fill, OOKeys, K>\n    : MergeProp<OK, O1K, fill, OOKeys, K>\n\n/**\n * @hidden\n */\nexport type MergeDeep<O extends object, O1 extends object, ignore extends object, fill> =\n  O extends unknown ? O1 extends unknown ?\n  MergeDeepChoice<O, O1, ignore, fill, 'x', 'y'>\n  : never : never\n\n/**\n * Accurately merge the fields of `O` with the ones of `O1`. It is\n * equivalent to the spread operator in JavaScript. [[Union]]s and [[Optional]]\n * fields will be handled gracefully.\n *\n * (⚠️ needs `--strictNullChecks` enabled)\n * @param O to complete\n * @param O1 to copy from\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @param ignore (?=`BuiltIn`) types not to merge\n * @param fill (?=`undefined`) types of `O` to be replaced with ones of `O1`\n * @returns [[Object]]\n * @example\n * ```ts\n * import {O} from 'ts-toolbelt'\n *\n * type O = {\n *  name?: string\n *  age? : number\n *  zip? : string\n *  pay  : {\n *      cvv?: number\n *  }\n * }\n *\n * type O1 = {\n *  age : number\n *  zip?: number\n *  city: string\n *  pay : {\n *      cvv : number\n *      ccn?: string\n *  }\n * }\n *\n * type test = O.Merge<O, O1, 'deep'>\n * // {\n * //     name?: string;\n * //     age: number;\n * //     zip?: string | number;\n * //     pay: {\n * //         cvv: number;\n * //         ccn?: string;\n * //     };\n * //     city: string;\n * // }\n * ```\n */\nexport type Merge<O extends object, O1 extends object, depth extends Depth = 'flat', ignore extends object = BuiltIn, fill extends any = undefined> = {\n  'flat': MergeFlat<O, O1, ignore, fill>\n  'deep': MergeDeep<O, O1, ignore, fill>\n}[depth]\n"
  },
  {
    "path": "sources/Object/MergeAll.ts",
    "content": "import {Iteration} from '../Iteration/Iteration'\nimport {IterationOf} from '../Iteration/IterationOf'\nimport {Merge} from './Merge'\nimport {Pos} from '../Iteration/Pos'\nimport {Next} from '../Iteration/Next'\nimport {Length} from '../List/Length'\nimport {Cast} from '../Any/Cast'\nimport {List} from '../List/List'\nimport {Extends} from '../Any/Extends'\nimport {Depth} from './_Internal'\nimport {BuiltIn} from '../Misc/BuiltIn'\n\n/**\n * @hidden\n */\ntype __MergeAll<O extends object, Os extends List<object>, depth extends Depth, ignore extends object, fill extends any, I extends Iteration = IterationOf<0>> = {\n    0: __MergeAll<Merge<O, Os[Pos<I>], depth, ignore, fill>, Os, depth, ignore, fill, Next<I>>\n    1: O\n}[Extends<Pos<I>, Length<Os>>]\n\n/**\n * @hidden\n */\nexport type _MergeAll<O extends object, Os extends List<object>, depth extends Depth, ignore extends object, fill extends any> =\n    __MergeAll<O, Os, depth, ignore, fill> extends infer X\n    ? Cast<X, object>\n    : never\n\n/**\n * [[Merge]] a list of [[Object]]s into `O`. Merges from left to right, first\n * items get completed by the next ones (last-in completes).\n * @param O to start with\n * @param Os to merge\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @param ignore (?=`BuiltIn`) types not to merge\n * @param fill (?=`undefined`) types of `O` to be replaced with ones of `O1`\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type MergeAll<O extends object, Os extends List<object>, depth extends Depth = 'flat', ignore extends object = BuiltIn, fill extends any = undefined> =\n    O extends unknown\n    ? Os extends unknown\n      ? _MergeAll<O, Os, depth, ignore, fill>\n      : never\n    : never\n"
  },
  {
    "path": "sources/Object/Modify.ts",
    "content": "import {At} from '../Any/At'\nimport {Replace} from '../Union/Replace'\nimport {x} from '../Any/x'\nimport {Exclude} from '../Union/Exclude'\n\n/**\n * Modify `O` with `OMod` & the [[x]] placeholder\n * @param O to copy from\n * @param OMod to copy to\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Modify<O extends object, OMod extends object> = {\n    [K in keyof OMod]: Replace<OMod[K], x, Exclude<At<O, K>, undefined>>\n} & {}\n"
  },
  {
    "path": "sources/Object/NonNullable.ts",
    "content": "import {NonNullable as UNonNullable} from '../Union/NonNullable'\nimport {Depth} from './_Internal'\nimport {_Pick} from './Pick'\nimport {Key} from '../Any/Key'\nimport {PatchFlat} from './Patch'\nimport {BuiltIn} from '../Misc/BuiltIn'\n\n/**\n * @hidden\n */\nexport type NonNullableFlat<O> = {\n    [K in keyof O]: UNonNullable<O[K]>\n} & {}\n\n/**\n * @hidden\n */\nexport type NonNullableDeep<O> = {\n    [K in keyof O]: O[K] extends BuiltIn\n                    ? O[K]\n                    : NonNullableDeep<UNonNullable<O[K]>>\n}\n\n/**\n * @hidden\n */\nexport type NonNullablePart<O extends object, depth extends Depth> = {\n    'flat': NonNullableFlat<O>,\n    'deep': NonNullableDeep<O>,\n}[depth]\n\n/**\n * @hidden\n */\nexport type _NonNullable<O extends object, K extends Key, depth extends Depth> =\n    PatchFlat<NonNullablePart<_Pick<O, K>, depth>, O>\n\n/**\n * Make some fields of `O` not nullable (deeply or not)\n * (Optional fields will be left untouched & `undefined`)\n * @param O to make non nullable\n * @param K (?=`Key`) to choose fields\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type NonNullable<O extends object, K extends Key = Key, depth extends Depth = 'flat'> =\n    O extends unknown\n    ? _NonNullable<O, K, depth>\n    : never\n"
  },
  {
    "path": "sources/Object/NonNullableKeys.ts",
    "content": "/**\n * @hidden\n */\nexport type _NonNullableKeys<O extends object> = {\n    [K in keyof O]-?: [O[K] & (undefined | null)] extends [never]\n                      ? K\n                      : never\n}[keyof O]\n\n/**\n * Get the keys of `O` that are non-nullable\n *\n * (⚠️ needs `--strictNullChecks` enabled)\n * @param O\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type NonNullableKeys<O extends object> =\n    O extends unknown\n    ? _NonNullableKeys<O>\n    : never\n"
  },
  {
    "path": "sources/Object/Nullable.ts",
    "content": "import {Nullable as UNullable} from '../Union/Nullable'\nimport {Depth} from './_Internal'\nimport {_Pick} from './Pick'\nimport {Key} from '../Any/Key'\nimport {PatchFlat} from './Patch'\n\n/**\n * @hidden\n */\nexport type NullableFlat<O> = {\n    [K in keyof O]: UNullable<O[K]>\n} & {}\n\n/**\n * @hidden\n */\nexport type NullableDeep<O> = {\n    [K in keyof O]: NullableDeep<UNullable<O[K]>>\n}\n\n/**\n * @hidden\n */\ntype NullablePart<O extends object, depth extends Depth> = {\n    'flat': NullableFlat<O>,\n    'deep': NullableDeep<O>,\n}[depth]\n\n/**\n * @hidden\n */\nexport type _Nullable<O extends object, K extends Key, depth extends Depth> =\n    PatchFlat<NullablePart<_Pick<O, K>, depth>, O>\n\n/**\n * Make some fields of `O` nullable (deeply or not)\n * @param O to make nullable\n * @param K (?=`Key`) to choose fields\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Nullable<O extends object, K extends Key = Key, depth extends Depth = 'flat'> =\n    O extends unknown\n    ? _Nullable<O, K, depth>\n    : never\n\n"
  },
  {
    "path": "sources/Object/NullableKeys.ts",
    "content": "/**\n * @hidden\n */\nexport type _NullableKeys<O extends object> = {\n    [K in keyof O]-?: [O[K] & (undefined | null)] extends [never]\n                      ? never\n                      : K\n}[keyof O]\n\n/**\n * Get the keys of `O` that are nullable\n *\n * (⚠️ needs `--strictNullChecks` enabled)\n * @param O\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type NullableKeys<O extends object> =\n    O extends unknown\n    ? _NullableKeys<O>\n    : never\n"
  },
  {
    "path": "sources/Object/Object.ts",
    "content": "import {Key} from '../Any/Key'\nimport {Record} from './Record'\n\n/**\n * An [[Object]]\n * @example\n * ```ts\n * type object0 = {a: \"hello\"}\n * type string1 = {b: \"world\"}\n * ```\n */\nexport type Object =\n    Record<Key, any>\n"
  },
  {
    "path": "sources/Object/Omit.ts",
    "content": "import {_Pick} from './Pick'\nimport {Exclude} from '../Union/Exclude'\nimport {Key} from '../Any/Key'\n\n/**\n * @hidden\n */\nexport type _Omit<O extends object, K extends Key> =\n    _Pick<O, Exclude<keyof O, K>>\n\n/**\n * Remove out of `O` the fields of key `K`\n * @param O to remove from\n * @param K to chose fields\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Omit<O extends object, K extends Key> =\n    O extends unknown\n    ? _Omit<O, K>\n    : never\n"
  },
  {
    "path": "sources/Object/Optional.ts",
    "content": "import {Pick} from './Pick'\nimport {Depth} from './_Internal'\nimport {Key} from '../Any/Key'\nimport {PatchFlat} from './Patch'\nimport {Equals} from '../Any/Equals'\n\n/**\n * @hidden\n */\nexport type OptionalFlat<O> = {\n    [K in keyof O]?: O[K]\n} & {}\n\n/**\n * @hidden\n */\nexport type OptionalDeep<O> = {\n    [K in keyof O]?: OptionalDeep<O[K]>\n}\n\n/**\n * @hidden\n */\nexport type OptionalPart<O extends object, depth extends Depth> = {\n    'flat': OptionalFlat<O>,\n    'deep': OptionalDeep<O>,\n}[depth]\n\n/**\n * Make some fields of `O` optional (deeply or not)\n * @param O to make optional\n * @param K (?=`Key`) to choose fields\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Optional<O extends object, K extends Key = Key, depth extends Depth = 'flat'> = {\n    1: OptionalPart<O, depth>\n    0: PatchFlat<OptionalPart<Pick<O, K>, depth>, O>\n}[Equals<Key, K>]\n"
  },
  {
    "path": "sources/Object/OptionalKeys.ts",
    "content": "/**\n * @hidden\n */\nexport type _OptionalKeys<O extends object> = {\n    [K in keyof O]-?: {} extends Pick<O, K>\n                      ? K\n                      : never\n}[keyof O]\n\n/**\n * Get the keys of `O` that are optional\n * @param O\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type OptionalKeys<O extends object> =\n    O extends unknown\n    ? _OptionalKeys<O>\n    : never\n"
  },
  {
    "path": "sources/Object/Overwrite.ts",
    "content": "/**\n * Update the fields of `O` with the ones of `O1`\n * (only the existing fields will be updated)\n * @param O to update\n * @param O1 to update with\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Overwrite<O extends object, O1 extends object> = {\n    [K in keyof O]: K extends keyof O1\n                    ? O1[K]\n                    : O[K]\n} & {}\n"
  },
  {
    "path": "sources/Object/P/Merge.ts",
    "content": "import {Key} from '../../Any/Key'\nimport {Merge as OMerge} from '../Merge'\nimport {List} from '../../List/List'\nimport {BuiltIn} from '../../Misc/BuiltIn'\nimport {_ListOf} from '../ListOf'\nimport {Tail} from '../../List/Tail'\nimport {Depth} from '../_Internal'\n\n/**\n * @hidden\n */\ntype MergeAt<O, Path extends List<Key>, O1, depth extends Depth> =\n  O extends BuiltIn ? O :\n  Path extends []\n  ? O extends List   ? OMerge<O, O1 & {}, depth> :\n    O extends object ? OMerge<O, O1 & {}, depth> :\n    O\n  : {\n      [K in keyof O]: K extends Path[0]\n      ? MergeAt<O[K], Tail<Path>, O1, depth>\n      : O[K]\n    }\n\n/**\n * Complete the fields of `O` at `Path` with the ones of `O1`\n * @param O to complete\n * @param Path to be followed\n * @param O1 to copy from\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Merge<O extends object, Path extends List<Key>, O1 extends object, depth extends Depth = 'flat'> =\n  Path extends unknown\n  ? MergeAt<O, Path, O1, depth>\n  : never\n\n// TODO: swap path & o1\n"
  },
  {
    "path": "sources/Object/P/Omit.ts",
    "content": "import {Key} from '../../Any/Key'\nimport {_Omit as _OOmit} from '../Omit'\nimport {_Omit as _LOmit} from '../../List/Omit'\nimport {List} from '../../List/List'\nimport {BuiltIn} from '../../Misc/BuiltIn'\nimport {_ListOf} from '../ListOf'\nimport {Tail} from '../../List/Tail'\n\n/**\n * @hidden\n */\ntype OmitAt<O, Path extends List<Key>> =\n  O extends BuiltIn ? O :\n  Path extends [Key]\n  ? O extends List   ? _LOmit<O, Path[0]> :\n    O extends object ? _OOmit<O, Path[0]> :\n    O\n  : {\n      [K in keyof O]: K extends Path[0]\n      ? OmitAt<O[K], Tail<Path>>\n      : O[K]\n    }\n\n/**\n * Remove out of `O` the fields at `Path`\n * @param O to remove from\n * @param Path to be followed\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Omit<O extends object, Path extends List<Key>> =\n  Path extends unknown\n  ? OmitAt<O, Path>\n  : never\n"
  },
  {
    "path": "sources/Object/P/Pick.ts",
    "content": "import {Key} from '../../Any/Key'\nimport {_Pick as _OPick} from '../Pick'\nimport {_Pick as _LPick} from '../../List/Pick'\nimport {List} from '../../List/List'\nimport {Tail} from '../../List/Tail'\nimport {BuiltIn} from '../../Misc/BuiltIn'\nimport {_ListOf} from '../ListOf'\n\n/**\n * @hidden\n */\ntype PickAt<O, Path extends List<Key>> =\n    [] extends Path ? O :\n    O extends BuiltIn ? O :\n    O extends List ? _ListOf<{\n      [K in keyof _OPick<O, Path[0]>]:\n      PickAt<O[K], Tail<Path>>\n    }> :\n    O extends object ? {\n      [K in keyof _OPick<O, Path[0]>]:\n      PickAt<O[K], Tail<Path>>\n    } : O\n\n/**\n * Extract out of `O` the fields at `Path`\n * @param O to extract from\n * @param Path to be followed\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Pick<O extends object, Path extends List<Key>> =\n  Path extends unknown\n  ? PickAt<O, Path>\n  : never\n\n"
  },
  {
    "path": "sources/Object/P/Readonly.ts",
    "content": "import {Key} from '../../Any/Key'\nimport {Readonly as OReadonly} from '../Readonly'\nimport {List} from '../../List/List'\nimport {BuiltIn} from '../../Misc/BuiltIn'\nimport {_ListOf} from '../ListOf'\nimport {Tail} from '../../List/Tail'\nimport {Depth} from '../_Internal'\n\n/**\n * @hidden\n */\ntype ReadonlyAt<O, Path extends List<Key>, depth extends Depth> =\n  O extends BuiltIn ? O :\n  Path extends [Key]\n  ? O extends List   ? OReadonly<O, Path[0], depth> :\n    O extends object ? OReadonly<O, Path[0], depth> :\n    O\n  : {\n      [K in keyof O]: K extends Path[0]\n      ? ReadonlyAt<O[K], Tail<Path>, depth>\n      : O[K]\n    }\n\n/**\n * Make some fields of `O` readonly at `Path` (deeply or not)\n * @param O to make readonly\n * @param Path to be followed\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Readonly<O extends object, Path extends List<Key>, depth extends Depth = 'flat'> =\n    Path extends unknown\n    ? ReadonlyAt<O, Path, depth>\n    : never\n"
  },
  {
    "path": "sources/Object/P/Record.ts",
    "content": "import {Modx} from '../_Internal'\nimport {IterationOf} from '../../Iteration/IterationOf'\nimport {Iteration} from '../../Iteration/Iteration'\nimport {Pos} from '../../Iteration/Pos'\nimport {Next} from '../../Iteration/Next'\nimport {Key} from '../../Any/Key'\nimport {LastKey} from '../../List/LastKey'\nimport {List} from '../../List/List'\n\n/**\n * @hidden\n */\ntype Record_RR<Path extends List<Key>, A, I extends Iteration = IterationOf<0>> = {\n    readonly [Key in Path[Pos<I>]]: Pos<I> extends LastKey<Path>\n                                    ? A\n                                    : Record_RR<Path, A, Next<I>>\n} & {}\n\n/**\n * @hidden\n */\nexport type Record_RW<Path extends List<Key>, A, I extends Iteration = IterationOf<0>> = {\n    [Key in Path[Pos<I>]]: Pos<I> extends LastKey<Path>\n                           ? A\n                           : Record_RW<Path, A, Next<I>>\n} & {}\n\n/**\n * @hidden\n */\ntype Record_OR<Path extends List<Key>, A, I extends Iteration = IterationOf<0>> = {\n    readonly [Key in Path[Pos<I>]]?: Pos<I> extends LastKey<Path>\n                                     ? A\n                                     : Record_OR<Path, A, Next<I>>\n} & {}\n\n/**\n * @hidden\n */\ntype Record_OW<Path extends List<Key>, A, I extends Iteration = IterationOf<0>> = {\n    [Key in Path[Pos<I>]]?: Pos<I> extends LastKey<Path>\n                            ? A\n                            : Record_OW<Path, A, Next<I>>\n} & {}\n\n/**\n * Create an object filled with `A` for the fields at the end of `Path`\n * @param Path to choose fields\n * @param A to fill fields with\n * @param modx (?=`['!', 'W']`) to set modifiers\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Record<Path extends List<Key>, A, modx extends Modx = ['!', 'W']> = {\n  '!': {\n      'R': Record_RR<Path, A>\n      'W': Record_RW<Path, A>\n  },\n  '?': {\n      'R': Record_OR<Path, A>\n      'W': Record_OW<Path, A>\n  }\n}[modx[0]][modx[1]]\n"
  },
  {
    "path": "sources/Object/P/Update.ts",
    "content": "import {Key} from '../../Any/Key'\nimport {Update as OUpdate} from '../Update'\nimport {Update as LUpdate} from '../../List/Update'\nimport {List} from '../../List/List'\nimport {BuiltIn} from '../../Misc/BuiltIn'\nimport {_ListOf} from '../ListOf'\nimport {Tail} from '../../List/Tail'\nimport {Record} from '../Record'\n\n/**\n * @hidden\n */\ntype UpdateAt<O, Path extends List<Key>, A> =\n  O extends BuiltIn ? O :\n  Path extends [Key]\n  ? O extends List   ? LUpdate<O, Path[0], A> :\n    O extends object ? OUpdate<O, Path[0], A> :\n    O\n  : {\n      [K in keyof O]: K extends Path[0]\n      ? UpdateAt<O[K], Tail<Path>, A>\n      : O[K]\n    }\n\n/**\n * Update in `O` the fields at `Path` with `A`\n * @param O to update\n * @param Path to be followed\n * @param A to update with\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Update<O extends object, Path extends List<Key>, A extends any> =\n    Path extends unknown\n    ? UpdateAt<O, Path, A>\n    : never\n"
  },
  {
    "path": "sources/Object/P/_Internal.ts",
    "content": "/** @ignore *//** */\n\n/**\n * to reach a  property we use `Pos<I> extends LastIndex<Path>`\n * to reach an object   we use `Pos<I> extends Length<Path>`\n */\n"
  },
  {
    "path": "sources/Object/P/_api.ts",
    "content": "/** @ignore *//** */\n\nexport {Merge} from './Merge'\nexport {Omit} from './Omit'\nexport {Pick} from './Pick'\nexport {Readonly} from './Readonly'\nexport {Update} from './Update'\nexport {Record} from './Record'\n"
  },
  {
    "path": "sources/Object/Partial.ts",
    "content": "import {OptionalPart} from './Optional'\nimport {Depth} from './_Internal'\n\n/**\n * Make all fields of `O` optional (deeply or not)\n * @param O to make optional\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @returns [[Object]]\n * @example\n * ```ts\n * import {O} from 'ts-toolbelt'\n *\n * type L = {a: {b: {c: 2}}, b: 1}\n *\n * type test0 = O.Partial<L>\n * type test1 = O.Partial<L, 'deep'>\n * ```\n */\nexport type Partial<O extends object, depth extends Depth = 'flat'> =\n    OptionalPart<O, depth>\n"
  },
  {
    "path": "sources/Object/Patch.ts",
    "content": "import {At} from '../Any/At'\nimport {Key} from '../Any/Key'\nimport {_ListOf} from './ListOf'\nimport {List} from '../List/List'\nimport {Depth} from './_Internal'\nimport {BuiltIn} from '../Misc/BuiltIn'\nimport {_Omit} from './Omit'\nimport {Length} from '../List/Length'\nimport {Has} from '../Union/Has'\n\n/**\n * @hidden\n */\ntype Longer<L extends List, L1 extends List> =\n  L extends unknown ? L1 extends unknown ?\n  {0: 0, 1: 1}[Has<keyof L, keyof L1>]\n  : never : never\n\n/**\n * @hidden\n */\ntype PatchProp<OK, O1K, fill, OKeys extends Key, K extends Key> =\n  K extends OKeys\n  ? OK extends fill ? O1K : OK\n  : O1K\n\n/**\n * @hidden\n */\ntype PatchFlatObject<O extends object, O1 extends object, fill, OKeys extends Key = keyof O> = {\n  [K in keyof (O & _Omit<O1, OKeys>)]: PatchProp<At<O, K>, At<O1, K>, fill, OKeys, K>\n} & {}\n\n/**\n * @hidden\n */\ntype PatchFlatList<L extends List, L1 extends List, ignore extends object, fill> =\n  number extends Length<L | L1>\n  ? PatchFlatChoice<L[number], L1[number], ignore, fill>[]\n  : Longer<L, L1> extends 1\n    ? {[K in keyof L]: PatchProp<L[K], At<L1, K>, fill, keyof L, K>}\n    : {[K in keyof L1]: PatchProp<At<L, K>, L1[K], fill, keyof L, K>}\n\n/**\n * @hidden\n */\nexport type PatchFlatChoice<O extends object, O1 extends object, ignore extends object, fill> =\n  O extends ignore ? O :\n  O1 extends ignore ? O :\n  O extends List\n  ? O1 extends List\n    ? PatchFlatList<O, O1, ignore, fill>\n    : PatchFlatObject<O, O1, fill>\n  : PatchFlatObject<O, O1, fill>\n\n/**\n * @hidden\n */\nexport type PatchFlat<O extends object, O1 extends object, ignore extends object = BuiltIn, fill = never> =\n  O extends unknown ? O1 extends unknown ?\n  PatchFlatChoice<O, O1, ignore, fill>\n  : never : never\n\n/**\n * @hidden\n */\ntype PatchDeepList<L extends List, L1 extends List, ignore extends object, fill> =\n  number extends Length<L | L1>\n  ? PatchDeepChoice<L[number], L1[number], ignore, fill, never, any>[]\n  : Longer<L, L1> extends 1\n    ? {[K in keyof L]: PatchDeepChoice<L[K], At<L1, K>, ignore, fill, keyof L, K>}\n    : {[K in keyof L1]: PatchDeepChoice<At<L, K>, L1[K], ignore, fill, keyof L, K>}\n\n/**\n * @hidden\n */\ntype PatchDeepObject<O extends object, O1 extends object, ignore extends object, fill, OKeys extends Key = keyof O> = {\n    [K in keyof (O & _Omit<O1, OKeys>)]: PatchDeepChoice<At<O, K>, At<O1, K>, ignore, fill, OKeys, K>\n}\n\n/**\n * @hidden\n */\ntype PatchDeepChoice<OK, O1K, ignore extends object, fill, OKeys extends Key, K extends Key> =\n  [OK] extends [never] ? PatchProp<OK, O1K, fill, OKeys, K> :\n  [O1K] extends [never] ? PatchProp<OK, O1K, fill, OKeys, K> :\n  OK extends ignore ? PatchProp<OK, O1K, fill, OKeys, K> :\n  O1K extends ignore ? PatchProp<OK, O1K, fill, OKeys, K> :\n  OK extends List\n  ? O1K extends List\n    ? PatchDeepList<OK, O1K, ignore, fill>\n    : PatchProp<OK, O1K, fill, OKeys, K>\n  : OK extends object\n    ? O1K extends object\n      ? PatchDeepObject<OK, O1K, ignore, fill>\n      : PatchProp<OK, O1K, fill, OKeys, K>\n    : PatchProp<OK, O1K, fill, OKeys, K>\n\n/**\n * @hidden\n */\nexport type PatchDeep<O extends object, O1 extends object, ignore extends object, fill> =\n  O extends unknown ? O1 extends unknown ?\n  PatchDeepChoice<O, O1, ignore, fill, 'x', 'y'> // dummy x, y\n  : never : never\n\n/**\n * Complete the fields of `O` with the ones of `O1`. This is a version of\n * [[Merge]] that does NOT handle optional fields, it only completes fields of\n * `O` with the ones of `O1`.\n * @param O to complete\n * @param O1 to copy from\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @param ignore (?=`BuiltIn`) types not to merge\n * @param fill (?=`never`) types of `O` to be replaced with ones of `O1`\n * @returns [[Object]]\n * @example\n * ```ts\n * import {O} from 'ts-toolbelt'\n *\n * type O = {\n *  name?: string\n *  age? : number\n *  zip? : string\n *  pay  : {\n *      cvv?: number\n *  }\n * }\n *\n * type O1 = {\n *  age : number\n *  zip?: number\n *  city: string\n *  pay : {\n *      cvv : number\n *      ccn?: string\n *  }\n * }\n *\n * type test = O.Patch<O, O1, 'deep'>\n * // {\n * //     name?: string;\n * //     age?: number;\n * //     zip?: string | number;\n * //     pay: {\n * //         cvv?: number;\n * //         ccn?: string;\n * //     };\n * //     city: string;\n * // }\n * ```\n */\nexport type Patch<O extends object, O1 extends object, depth extends Depth = 'flat', ignore extends object = BuiltIn, fill extends any = never> = {\n  'flat': PatchFlat<O, O1, ignore, fill>\n  'deep': PatchDeep<O, O1, ignore, fill>\n}[depth]\n"
  },
  {
    "path": "sources/Object/PatchAll.ts",
    "content": "import {Iteration} from '../Iteration/Iteration'\nimport {IterationOf} from '../Iteration/IterationOf'\nimport {Pos} from '../Iteration/Pos'\nimport {Next} from '../Iteration/Next'\nimport {Length} from '../List/Length'\nimport {Cast} from '../Any/Cast'\nimport {List} from '../List/List'\nimport {Extends} from '../Any/Extends'\nimport {Depth} from './_Internal'\nimport {Patch} from './Patch'\nimport {BuiltIn} from '../Misc/BuiltIn'\n\n/**\n * @hidden\n */\ntype __PatchAll<O extends object, Os extends List<object>, depth extends Depth, ignore extends object, fill extends any, I extends Iteration = IterationOf<0>> = {\n    0: __PatchAll<Patch<O, Os[Pos<I>], depth, ignore, fill>, Os, depth, ignore, fill, Next<I>>\n    1: O\n}[Extends<Pos<I>, Length<Os>>]\n\n/**\n * @hidden\n */\nexport type _PatchAll<O extends object, Os extends List<object>, depth extends Depth, ignore extends object, fill extends any> =\n    __PatchAll<O, Os, depth, ignore, fill> extends infer X\n    ? Cast<X, object>\n    : never\n\n/**\n * [[Patch]] a list of [[Object]]s into `O`. Patches from left to right, first\n * items get completed by the next ones (last-in completes).\n * @param O to start with\n * @param Os to patch\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @param ignore (?=`BuiltIn`) types not to merge\n * @param fill (?=`never`) types of `O` to be replaced with ones of `O1`\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type PatchAll<O extends object, Os extends List<object>, depth extends Depth = 'flat', ignore extends object = BuiltIn, fill extends any = never> =\n    O extends unknown\n    ? Os extends unknown\n      ? _PatchAll<O, Os, depth, ignore, fill>\n      : never\n    : never\n"
  },
  {
    "path": "sources/Object/Path.ts",
    "content": "import {Key} from '../Any/Key'\nimport {Cast} from '../Any/Cast'\nimport {Extends} from '../Any/Extends'\nimport {Iteration} from '../Iteration/Iteration'\nimport {IterationOf} from '../Iteration/IterationOf'\nimport {Next} from '../Iteration/Next'\nimport {Pos} from '../Iteration/Pos'\nimport {List} from '../List/List'\nimport {Length} from '../List/Length'\nimport {At} from '../Any/At'\n\n/**\n * @ignore\n */\ntype _Path<O, P extends List<Key>,  I extends Iteration = IterationOf<0>> = {\n    0: _Path<At<O, P[Pos<I>]>, P, Next<I>>\n    1: O\n}[Extends<Pos<I>, Length<P>>]\n\n/**\n * Get in `O` the type of nested properties\n * @param O to be inspected\n * @param Path to be followed\n * @returns [[Any]]\n * @example\n * ```ts\n * ```\n */\nexport type Path<O extends any, P extends List<Key>> =\n    _Path<O & {}, P> extends infer X\n    ? Cast<X, any>\n    : never\n"
  },
  {
    "path": "sources/Object/Paths.ts",
    "content": "import {Key} from '../Any/Key'\nimport {NonNullableFlat} from '../Object/NonNullable'\nimport {Cast} from '../Any/Cast'\nimport {List} from '../List/List'\nimport {BuiltIn} from '../Misc/BuiltIn'\nimport {Primitive} from '../Misc/Primitive'\nimport {Length} from '../List/Length'\nimport {Keys} from '../Any/Keys'\n\n/**\n * @hidden\n */\ntype UnionOf<A> =\n    A extends List\n    ? A[number]\n    : A[keyof A]\n\n/**\n * @hidden\n */\ntype _Paths<O, P extends List = []> = UnionOf<{\n    [K in keyof O]:\n    O[K] extends BuiltIn | Primitive ? NonNullableFlat<[...P, K?]> :\n    [Keys<O[K]>] extends [never] ? NonNullableFlat<[...P, K?]> :\n    12 extends Length<P> ? NonNullableFlat<[...P, K?]> :\n    _Paths<O[K], [...P, K?]>\n}>\n\n/**\n * Get all the possible paths of `O`\n * (⚠️ this won't work with circular-refs)\n * @param O to be inspected\n * @returns [[String]][]\n * @example\n * ```ts\n * ```\n */\nexport type Paths<O, P extends List = []> =\n    _Paths<O, P> extends infer X\n    ? Cast<X, List<Key>>\n    : never\n"
  },
  {
    "path": "sources/Object/Pick.ts",
    "content": "import {Key} from '../Any/Key'\n\n/**\n * @hidden\n */\ntype __Pick<O extends object, K extends keyof O> = {\n    [P in K]: O[P]\n} & {}\n\n/**\n * @hidden\n */\nexport type _Pick<O extends object, K extends Key> =\n    __Pick<O, keyof O & K>\n\n/**\n * Extract out of `O` the fields of key `K`\n * @param O to extract from\n * @param K to chose fields\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Pick<O extends object, K extends Key> =\n    O extends unknown\n    ? _Pick<O, K>\n    : never\n"
  },
  {
    "path": "sources/Object/Readonly.ts",
    "content": "import {_Pick} from './Pick'\nimport {Depth} from './_Internal'\nimport {Key} from '../Any/Key'\nimport {PatchFlat} from './Patch'\nimport {BuiltIn} from '../Misc/BuiltIn'\n\n/**\n * @hidden\n */\nexport type ReadonlyFlat<O> = {\n    +readonly [K in keyof O]: O[K]\n} & {}\n\n/**\n * @hidden\n */\nexport type ReadonlyDeep<O> = {\n    +readonly [K in keyof O]: O[K] extends BuiltIn\n                              ? O[K]\n                              : ReadonlyDeep<O[K]>\n}\n\n/**\n * @hidden\n */\nexport type ReadonlyPart<O extends object, depth extends Depth> = {\n    'flat': ReadonlyFlat<O>,\n    'deep': ReadonlyDeep<O>,\n}[depth]\n\n/**\n * @hidden\n */\nexport type _Readonly<O extends object, K extends Key, depth extends Depth> =\n    PatchFlat<ReadonlyPart<_Pick<O, K>, depth>, O>\n\n/**\n * Make some fields of `O` readonly (deeply or not)\n * @param O to make readonly\n * @param K (?=`Key`) to choose fields\n * @param depth (?=`'default'`) to do it deeply\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Readonly<O extends object, K extends Key = Key, depth extends Depth = 'flat'> =\n    O extends unknown\n    ? _Readonly<O, K, depth>\n    : never\n"
  },
  {
    "path": "sources/Object/ReadonlyKeys.ts",
    "content": "import {Equals} from '../Any/Equals'\n\n// Credit https://stackoverflow.com/a/52473108/3570903\n\n/**\n * @hidden\n */\nexport type _ReadonlyKeys<O extends object> = {\n    [K in keyof O]-?: {\n        1: never\n        0: K\n    }[Equals<{-readonly [Q in K]: O[K]}, {[Q in K]: O[K]}>]\n    // for each key, pick only K and compare to see if it is\n}[keyof O]\n\n/**\n * Get the keys of `O` that are readonly\n * @param O\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type ReadonlyKeys<O extends object> =\n    O extends unknown\n    ? _ReadonlyKeys<O>\n    : never\n"
  },
  {
    "path": "sources/Object/Record.ts",
    "content": "import {Modx} from './_Internal'\nimport {Key} from '../Any/Key'\n\n/**\n * Create an object filled with `A` for the fields `K`\n * @param K to choose fields\n * @param A (?=`unknown`) to fill fields with\n * @param modx (?=`['!', 'W']`) to set modifiers\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Record<K extends Key, A extends any = unknown, modx extends Modx = ['!', 'W']> = {\n    '!': {\n        'R': {readonly [P in K]: A}\n        'W': {         [P in K]: A}\n    },\n    '?': {\n        'R': {readonly [P in K]?: A}\n        'W': {         [P in K]?: A}\n    }\n}[modx[0]][modx[1]]\n"
  },
  {
    "path": "sources/Object/Replace.ts",
    "content": "import {Match} from '../Any/_Internal'\nimport {Is} from '../Any/Is'\n\n/**\n * @hidden\n */\nexport type _Replace<O extends object, M extends any, A extends any, match extends Match> = {\n    [K in keyof O]: {\n        1: A\n        0: O[K]\n    }[Is<M, O[K], match>]\n} & {}\n\n/**\n * Update with `A` the fields of `O` that match `M`\n * @param O to update\n * @param M to select fields\n * @param A to update with\n * @param match (?=`'default'`) to change precision\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Replace<O extends object, M extends any, A extends any, match extends Match = 'default'> =\n    O extends unknown\n    ? _Replace<O, M, A, match>\n    : never\n"
  },
  {
    "path": "sources/Object/Required.ts",
    "content": "import {_Pick} from './Pick'\nimport {Depth} from './_Internal'\nimport {Key} from '../Any/Key'\nimport {PatchFlat} from './Patch'\nimport {BuiltIn} from '../Misc/BuiltIn'\n\n/**\n * @hidden\n */\nexport type RequiredFlat<O> = {\n    [K in keyof O]-?: O[K]\n} & {}\n\n/**\n * @hidden\n */\nexport type RequiredDeep<O> = {\n    [K in keyof O]-?: O[K] extends BuiltIn\n                      ? O[K]\n                      : RequiredDeep<O[K]>\n}\n\n/**\n * @hidden\n */\nexport type RequiredPart<O extends object, depth extends Depth> = {\n    'flat': RequiredFlat<O>,\n    'deep': RequiredDeep<O>,\n}[depth]\n\n/**\n * @hidden\n */\nexport type _Required<O extends object, K extends Key, depth extends Depth> =\n    PatchFlat<RequiredPart<_Pick<O, K>, depth>, O>\n\n/**\n * Make some fields of `O` required (deeply or not)\n * @param O to make required\n * @param K (?=`Key`) to choose fields\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Required<O extends object, K extends Key = Key, depth extends Depth = 'flat'> =\n    O extends unknown\n    ? _Required<O, K, depth>\n    : never\n"
  },
  {
    "path": "sources/Object/RequiredKeys.ts",
    "content": "/**\n * @hidden\n */\nexport type _RequiredKeys<O extends object> = {\n    [K in keyof O]-?: {} extends Pick<O, K> ? never : K\n}[keyof O]\n\n/**\n * Get the keys of `O` that are required\n * @param O\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type RequiredKeys<O extends object> =\n    O extends unknown\n    ? _RequiredKeys<O>\n    : never\n"
  },
  {
    "path": "sources/Object/Select.ts",
    "content": "import {SelectKeys} from './SelectKeys'\nimport {Match} from '../Any/_Internal'\nimport {Pick} from './Pick'\n\n/**\n * Extract the fields of `O` that match `M`\n * @param O to extract from\n * @param M to select fields\n * @param match (?=`'default'`) to change precision\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Select<O extends object, M extends any, match extends Match = 'default'> =\n    Pick<O, SelectKeys<O, M, match>>\n"
  },
  {
    "path": "sources/Object/SelectKeys.ts",
    "content": "import {Match} from '../Any/_Internal'\nimport {Is} from '../Any/Is'\n\n/**\n * @hidden\n */\nexport type _SelectKeys<O extends object, M extends any, match extends Match> = {\n    [K in keyof O]-?: {\n        1: K\n        0: never\n    }[Is<O[K], M, match>]\n}[keyof O]\n\n/**\n * Get the keys of `O` which fields match `M`\n * @param O to extract from\n * @param M to select fields\n * @param match (?=`'default'`) to change precision\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type SelectKeys<O extends object, M extends any, match extends Match = 'default'> =\n    O extends unknown\n    ? _SelectKeys<O, M, match>\n    : never\n"
  },
  {
    "path": "sources/Object/Undefinable.ts",
    "content": "import {Depth} from './_Internal'\nimport {_Pick} from './Pick'\nimport {Key} from '../Any/Key'\nimport {PatchFlat} from './Patch'\nimport {BuiltIn} from '../Misc/BuiltIn'\n\n/**\n * @hidden\n */\nexport type UndefinableFlat<O> = {\n    [K in keyof O]: O[K] | undefined\n} & {}\n\n/**\n * @hidden\n */\nexport type UndefinableDeep<O> = {\n    [K in keyof O]: O[K] extends BuiltIn\n                    ? O[K]\n                    : UndefinableDeep<O[K] | undefined>\n}\n\n/**\n * @hidden\n */\ntype UndefinablePart<O extends object, depth extends Depth> = {\n    'flat': UndefinableFlat<O>,\n    'deep': UndefinableDeep<O>,\n}[depth]\n\n/**\n * @hidden\n */\nexport type _Undefinable<O extends object, K extends Key, depth extends Depth> =\n    PatchFlat<UndefinablePart<_Pick<O, K>, depth>, O>\n\n/**\n * Make some fields of `O` `undefined` (deeply or not)\n * @param O to make undefinable\n * @param K (?=`Key`) to choose fields\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Undefinable<O extends object, K extends Key = Key, depth extends Depth = 'flat'> =\n    O extends unknown\n    ? _Undefinable<O, K, depth>\n    : never\n"
  },
  {
    "path": "sources/Object/UndefinableKeys.ts",
    "content": "/**\n * @hidden\n */\nexport type _UndefinableKeys<O extends object> = {\n    [K in keyof O]-?: [O[K] & (undefined)] extends [never]\n                      ? never\n                      : K\n}[keyof O]\n\n/**\n * Get the keys of `O` that are `undefined`\n * (⚠️ needs `--strictNullChecks` enabled)\n * @param O\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type UndefinableKeys<O extends object> =\n    O extends unknown\n    ? _UndefinableKeys<O>\n    : never\n"
  },
  {
    "path": "sources/Object/UnionOf.ts",
    "content": "/**\n * @hidden\n */\nexport type _UnionOf<O extends object> =\n    O[keyof O]\n\n/**\n * Transform an [[Object]] into an [[Union]]\n * @param O to transform\n * @returns [[Any]]\n * @example\n * ```ts\n * ```\n */\nexport type UnionOf<O extends object> =\n    O extends unknown\n    ? _UnionOf<O>\n    : never\n"
  },
  {
    "path": "sources/Object/Unionize.ts",
    "content": "import {At} from '../Any/At'\nimport {Key} from '../Any/Key'\n\n/**\n * Make the fields of `O` union the ones of `O1`\n * @param O to union from\n * @param O1 to union with\n * @param K (?=`Key`) to chose fields\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Unionize<O extends object, O1 extends object, K extends Key = Key> = {\n    [P in keyof O]: P extends K\n                    ? O[P] | At<O1, P>\n                    : O[P]\n} & {}\n"
  },
  {
    "path": "sources/Object/Update.ts",
    "content": "import {Key} from '../Any/Key'\nimport {x} from '../Any/x'\nimport {Replace} from '../Union/Replace'\n\n/**\n * Update in `O` the fields of key `K` with `A`.\n * Use the [[x]] placeholder to get the current field type.\n * @param O to update\n * @param K to chose fields\n * @param A to update with\n * @returns [[Object]]\n * @example\n * ```ts\n * import {A, O} from 'ts-toolbelt'\n *\n * type User = {\n *  info: {\n *      name: string\n *      age: number\n *      payment: {}\n *  }\n *  id: number\n * }\n *\n * type test0 = Update<User, 'id' | 'info', A.x | null>\n * // {\n * //     info: {\n * //         name: string;\n * //         age: number;\n * //         payment: {};\n * //     } | null;\n * //     id: number | null;\n * // }\n * ```\n */\nexport type Update<O extends object, K extends Key, A extends any> = {\n    [P in keyof O]: P extends K\n                    ? Replace<A, x, O[P]>\n                    : O[P]\n} & {}\n"
  },
  {
    "path": "sources/Object/Writable.ts",
    "content": "import {_Pick} from './Pick'\nimport {Depth} from './_Internal'\nimport {Key} from '../Any/Key'\nimport {PatchFlat} from './Patch'\nimport {BuiltIn} from '../Misc/BuiltIn'\n\n/**\n * @hidden\n */\nexport type WritableFlat<O> = {\n    -readonly [K in keyof O]: O[K]\n} & {}\n\n/**\n * @hidden\n */\nexport type WritableDeep<O> = {\n    -readonly [K in keyof O]: O[K] extends BuiltIn\n                              ? O[K]\n                              : WritableDeep<O[K]>\n}\n\n/**\n * @hidden\n */\nexport type WritablePart<O extends object, depth extends Depth> = {\n    'flat': WritableFlat<O>,\n    'deep': WritableDeep<O>,\n}[depth]\n\n/**\n * @hidden\n */\nexport type _Writable<O extends object, K extends Key, depth extends Depth> =\n    PatchFlat<WritablePart<_Pick<O, K>, depth>, O>\n\n/**\n * Make some fields of `O` writable (deeply or not)\n * @param O to make writable\n * @param K (?=`Key`) to choose fields\n * @param depth (?=`'flat'`) 'deep' to do it deeply\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Writable<O extends object, K extends Key = Key, depth extends Depth = 'flat'> =\n    O extends unknown\n    ? _Writable<O, K, depth>\n    : never\n"
  },
  {
    "path": "sources/Object/WritableKeys.ts",
    "content": "import {Equals} from '../Any/Equals'\n\n// Credit https://stackoverflow.com/a/52473108/3570903\n\n/**\n * @hidden\n */\nexport type _WritableKeys<O extends object> = {\n    [K in keyof O]-?: {\n        1: K\n        0: never\n    }[Equals<{-readonly [Q in K]: O[K]}, {[Q in K]: O[K]}>]\n}[keyof O]\n\n/**\n * Get the keys of `O` that are writable\n * @param O\n * @returns [[Key]]\n * @example\n * ```ts\n * ```\n */\nexport type WritableKeys<O extends object> =\n    O extends unknown\n    ? _WritableKeys<O>\n    : never\n"
  },
  {
    "path": "sources/Object/_Internal.ts",
    "content": "/**\n * Describes the permissions/modifiers fields can have\n * `R`: readonly\n * `W`: writable\n * `!`: required\n * `?`: optional\n */\nexport type Modx = ['?' | '!', 'W' | 'R']\n\n/**\n * Describes the depth strategy when modifying types\n */\nexport type Depth = 'flat' | 'deep'\n\n/**\n * Describes the merging strategy\n * `0`: lodash style. Preserves lists, and completes when undefined types\n * `1`: ramda style. Destroys lists, does not complete if undefined types\n * `2`: lodash style. Lists are narrowed down, tuples are not preserved\n * `3`: ramda style. Assumes that we are only working with lists\n */\nexport type MergeStyle = 0 | 1 | 2\n\n/**\n * Make an object properties (all) `never`. We use this to intersect `object`s and\n * preserve the combine modifiers like `+readonly` and `?optional`.\n */\nexport type Anyfy<O extends object> = {\n    [K in keyof O]: any\n}\n"
  },
  {
    "path": "sources/Object/_api.ts",
    "content": "/** @ignore *//** */\n\nimport * as P from './P/_api'\n\nexport {P}\nexport {Assign} from './Assign'\nexport {AtLeast} from './AtLeast'\nexport {Compulsory} from './Compulsory'\nexport {CompulsoryKeys} from './CompulsoryKeys'\nexport {Diff} from './Diff'\nexport {Either} from './Either'\nexport {Exclude} from './Exclude'\nexport {ExcludeKeys} from './ExcludeKeys'\nexport {Filter} from './Filter'\nexport {FilterKeys} from './FilterKeys'\nexport {Has} from './Has'\nexport {HasPath} from './HasPath'\nexport {Includes} from './Includes'\nexport {Intersect} from './Intersect'\nexport {IntersectKeys} from './IntersectKeys'\nexport {Invert} from './Invert'\nexport {ListOf} from './ListOf'\nexport {Merge} from './Merge'\nexport {MergeAll} from './MergeAll'\nexport {Modify} from './Modify'\nexport {NonNullable} from './NonNullable'\nexport {NonNullableKeys} from './NonNullableKeys'\nexport {Nullable} from './Nullable'\nexport {NullableKeys} from './NullableKeys'\nexport {Object} from './Object'\nexport {Omit} from './Omit'\nexport {Optional} from './Optional'\nexport {OptionalKeys} from './OptionalKeys'\nexport {Overwrite} from './Overwrite'\nexport {Partial} from './Partial'\nexport {Patch} from './Patch'\nexport {PatchAll} from './PatchAll'\nexport {Path} from './Path'\nexport {Paths} from './Paths'\nexport {Pick} from './Pick'\nexport {Readonly} from './Readonly'\nexport {ReadonlyKeys} from './ReadonlyKeys'\nexport {Record} from './Record'\nexport {Replace} from './Replace'\nexport {Required} from './Required'\nexport {RequiredKeys} from './RequiredKeys'\nexport {Select} from './Select'\nexport {SelectKeys} from './SelectKeys'\nexport {Undefinable} from './Undefinable'\nexport {UndefinableKeys} from './UndefinableKeys'\nexport {Unionize} from './Unionize'\nexport {UnionOf} from './UnionOf'\nexport {Update} from './Update'\nexport {Writable} from './Writable'\nexport {WritableKeys} from './WritableKeys'\n"
  },
  {
    "path": "sources/String/At.ts",
    "content": "import {Split} from './Split'\n\nimport {At as AAt} from '../Any/At'\n\n/**\n * Get the character at position `K`\n * @param S\n * @param K\n */\nexport type At<S extends string, K extends number> =\n    AAt<Split<S, ''>, K>\n"
  },
  {
    "path": "sources/String/Join.ts",
    "content": "import {List} from '../List/List'\nimport {Literal} from './_Internal'\nimport {Cast} from '../Any/Cast'\n\n/**\n * @hidden\n */\ntype _Join<T extends List, D extends string> =\n    T extends [] ? '' :\n    T extends [Literal] ? `${T[0]}` :\n    T extends [Literal, ...infer R] ? `${T[0]}${D}${_Join<R, D>}` :\n    string\n\n/**\n * Concat many literals together\n * @param T to concat\n * @param D to delimit\n */\nexport type Join<T extends List<Literal>, D extends string = ''> =\n    _Join<T, D> extends infer X\n    ? Cast<X, string>\n    : never\n"
  },
  {
    "path": "sources/String/Length.ts",
    "content": "import {Split} from './Split'\nimport {Length as LLength} from '../List/Length'\n\n/**\n * Get the length of a `string`\n * @param S\n */\nexport type Length<S extends string> =\n    LLength<Split<S, ''>>\n"
  },
  {
    "path": "sources/String/Replace.ts",
    "content": "import {Cast} from '../Any/Cast'\nimport {Literal} from './_Internal'\n\n/**\n * @hidden\n */\ntype _Replace<S extends string, R extends Literal, W extends Literal> =\n    S extends `${infer BS}${R}${infer AS}`\n    ? Replace<`${BS}${W}${AS}`, R, W>\n    : S\n\n/**\n * Replace `R` with `W` in `S`\n * @param S\n * @param R\n * @param W\n */\nexport type Replace<S extends string, R extends Literal, W extends Literal> =\n    _Replace<S, R, W> extends infer X\n    ? Cast<X, string>\n    : never\n"
  },
  {
    "path": "sources/String/Split.ts",
    "content": "import {Cast} from '../Any/Cast'\nimport {Pop} from '../List/Pop'\n\n/**\n * @ignore\n */\ntype __Split<S extends string, D extends string, T extends string[] = []> =\n    S extends `${infer BS}${D}${infer AS}`\n    ? __Split<AS, D, [...T, BS]>\n    : [...T, S]\n\n/**\n * @hidden\n */\ntype _Split<S extends string, D extends string = ''> =\n    D extends '' ? Pop<__Split<S, D>> : __Split<S, D>\n\n/**\n * Split `S` by `D` into a [[List]]\n * @param S to split up\n * @param D to split at\n */\nexport type Split<S extends string, D extends string = ''> =\n    _Split<S, D> extends infer X\n    ? Cast<X, string[]>\n    : never\n"
  },
  {
    "path": "sources/String/_Internal.ts",
    "content": "export type Literal = string | number | bigint | boolean\n"
  },
  {
    "path": "sources/String/_api.ts",
    "content": "/** @ignore *//** */\n\nexport {At} from './At'\nexport {Join} from './Join'\nexport {Length} from './Length'\nexport {Replace} from './Replace'\nexport {Split} from './Split'\n"
  },
  {
    "path": "sources/Test.ts",
    "content": "import {Equals} from './Any/Equals'\nimport {Boolean} from './Boolean/_Internal'\n\n/**\n * Test should pass\n */\nexport type Pass = 1\n\n/**\n * Test should fail\n */\nexport type Fail = 0\n\n/**\n * Check or test the validity of a type\n * @param debug to debug with parameter hints (`ctrl+p`, `ctrl+shift+space`)\n * @example\n * ```ts\n * // see in `tst` folder\n * ```\n */\nexport declare function check<Type, Expect, Outcome extends Boolean>(\n    debug?: Type\n): Equals<Equals<Type, Expect>, Outcome>\n\n/**\n * Validates a batch of [[check]]\n * @param checks a batch of [[check]]\n * @example\n * ```ts\n * // see in `tst` folder\n * ```\n */\nexport declare function checks(checks: 1[]): void;\n"
  },
  {
    "path": "sources/Union/Diff.ts",
    "content": "import {Exclude} from './Exclude'\n\n/**\n * Get an [[Union]] that is the difference between `U1` & `U2`\n * @param U1 to check differences with\n * @param U2 to check differences against\n * @returns [[Union]]\n * @example\n * ```ts\n * ```\n */\nexport type Diff<U1 extends any, U2 extends any> =\n    Exclude<U1, U2> | Exclude<U2, U1>\n"
  },
  {
    "path": "sources/Union/Exclude.ts",
    "content": "/**\n * Remove `M` out of `U`\n * @param U to remove from\n * @param M to remove out\n * @returns [[Union]]\n * @example\n * ```ts\n * ```\n */\nexport type Exclude<U extends any, M extends any> =\n    U extends M\n    ? never\n    : U\n"
  },
  {
    "path": "sources/Union/Filter.ts",
    "content": "import {Match} from '../Any/_Internal'\nimport {Is} from '../Any/Is'\n\n/**\n * Remove `M` out of `U`\n * @param U to remove from\n * @param M to remove out\n * @returns [[Union]]\n * @example\n * ```ts\n * ```\n */\nexport type Filter<U extends any, M extends any, match extends Match = 'default'> =\n    U extends unknown\n    ? {1: never, 0: U & M}[Is<U, M, match>]\n    : never\n"
  },
  {
    "path": "sources/Union/Has.ts",
    "content": "/**\n * Check whether `U` contains `U1`\n * @param U to be inspected\n * @param U1 to check within\n * @returns [[Boolean]]\n * @example\n * ```ts\n * ```\n */\nexport type Has<U extends any, U1 extends any> =\n    [U1] extends [U]\n    ? 1\n    : 0\n"
  },
  {
    "path": "sources/Union/Intersect.ts",
    "content": "import {Equals} from '../Any/_api'\nimport type {Select} from './Select'\n\n/**\n * Get the overlapping members of `U1` and `U2`\n * @param U1\n * @param U2\n * @returns [[Union]]\n * @example\n * ```ts\n * ```\n */\nexport type Intersect<U1 extends any, U2 extends any> =\n    U1 extends unknown\n    ? U2 extends unknown\n      ? {1: U1, 0: never}[Equals<U1, U2>]\n      : never\n    : never\n"
  },
  {
    "path": "sources/Union/IntersectOf.ts",
    "content": "// Credit https://stackoverflow.com/a/50375286/3570903\n\n/**\n * Transform a [[Union]] to an * *intersection**\n * @param U to transform\n * @returns `&`\n * @example\n * ```ts\n * ```\n */\nexport type IntersectOf<U extends any> =\n    (U extends unknown ? (k: U) => void : never) extends ((k: infer I) => void)\n    ? I\n    : never\n"
  },
  {
    "path": "sources/Union/Last.ts",
    "content": "import {IntersectOf} from './IntersectOf'\n\n/**\n * Get the last item within an [[Union]]\n * (⚠️ it might not preserve order)\n * @param U\n * @returns [[Any]]\n * @example\n * ```ts\n * ```\n */\nexport type Last<U extends any> =\n    IntersectOf<\n        U extends unknown   // Distribute U\n        ? (x: U) => void\n        : never             // To intersect\n    > extends (x: infer P) => void\n      ? P                   // Extract merged\n      : never               // ^^^ Last parameter\n\n/*\n * The above does this (i.e.)\n * Parameters<((a: 1) => void) & ((a: 2) => void)> // => [2]\n */\n"
  },
  {
    "path": "sources/Union/ListOf.ts",
    "content": "import {Last} from './Last'\nimport {Prepend} from '../List/Prepend'\nimport {Exclude} from './Exclude'\nimport {List} from '../List/List'\nimport {Cast} from '../Any/Cast'\nimport {Extends} from '../Any/Extends'\n\n/**\n * @hidden\n */\ntype _ListOf<U, LN extends List = [], LastU = Last<U>> = {\n    0: _ListOf<Exclude<U, LastU>, Prepend<LN, LastU>>\n    1: LN\n}[Extends<[U], [never]>]\n\n/**\n * Transform a [[Union]] into a [[List]]\n * (⚠️ it might not preserve order)\n * @param U to transform\n * @returns [[List]]\n * @example\n * ```ts\n * ```\n */\nexport type ListOf<U extends any> =\n    _ListOf<U> extends infer X\n    ? Cast<X, List>\n    : never\n\n// ! must not be distributed\n"
  },
  {
    "path": "sources/Union/Merge.ts",
    "content": "import {At} from '../Any/At'\nimport {Overwrite} from '../Object/Overwrite'\nimport {ComputeRaw} from '../Any/Compute'\nimport {IntersectOf} from './IntersectOf'\nimport {Strict} from './Strict'\n\n/**\n * @hidden\n */\ntype _Merge<U extends object> = IntersectOf<Overwrite<U, {\n    [K in keyof U]-?: At<U, K>\n}>>\n\n/**\n * Merge a [[Union]] of [[Object]]s into a single one\n * @param U to merge\n * @returns [[Object]]\n * @example\n * ```ts\n * ```\n */\nexport type Merge<U extends object> =\n    ComputeRaw<_Merge<Strict<U>>>\n"
  },
  {
    "path": "sources/Union/NonNullable.ts",
    "content": "import {Exclude} from './Exclude'\n\n\n/**\n * Remove `undefined` & `null` out of `U`\n * @param U to make non-nullable\n * @returns [[Union]]\n * @example\n * ```ts\n * ```\n */\nexport type NonNullable<U extends any> =\n    Exclude<U, undefined | null>\n"
  },
  {
    "path": "sources/Union/Nullable.ts",
    "content": "/**\n * Add `undefined | null` to `U`\n * @param U to make nullable\n * @returns [[Union]]\n * @example\n * ```ts\n * ```\n */\nexport type Nullable<U extends any> =\n    U | undefined | null\n"
  },
  {
    "path": "sources/Union/Pop.ts",
    "content": "import {Exclude} from './Exclude'\nimport {Last} from './Last'\n\n/**\n * Remove an item out of `U`\n * (⚠️ it might not preserve order)\n * @param U to remove from\n * @returns [[Union]]\n * @example\n * ```ts\n * ```\n */\nexport type Pop<U extends any> =\n    Exclude<U, Last<U>>\n"
  },
  {
    "path": "sources/Union/Replace.ts",
    "content": "import {Is} from '../Any/Is'\nimport {Match} from '../Any/_Internal'\n\n/**\n * Replace `M` with `A` in `U`\n * @param U to update\n * @param M to select\n * @param A to update with\n * @returns [[Union]]\n * @example\n * ```ts\n * ```\n */\nexport type Replace<U extends any, M extends any, A extends any, match extends Match = 'default'> =\n    U extends unknown\n    ? {1: A, 0: U}[Is<U, M, match>]\n    : never\n"
  },
  {
    "path": "sources/Union/Select.ts",
    "content": "import {Is} from '../Any/Is'\nimport {Match} from '../Any/_Internal'\n\n/**\n * Extract the part of `U` that matches `M`\n * @param U to extract from\n * @param M to select with\n * @returns [[Union]]\n * @example\n * ```ts\n * ```\n */\nexport type Select<U extends any, M extends any, match extends Match = 'default'> =\n    U extends unknown\n    ? {1: U & M, 0: never}[Is<U, M, match>]\n    : never\n"
  },
  {
    "path": "sources/Union/Strict.ts",
    "content": "import {ComputeRaw} from '../Any/Compute'\nimport {Keys} from '../Any/Keys'\nimport {OptionalFlat} from '../Object/Optional'\nimport {Record} from '../Object/Record'\n\n/**\n * @hidden\n */\ntype _Strict<U, _U = U> =\n    U extends unknown\n    ? U & OptionalFlat<Record<Exclude<Keys<_U>, keyof U>, never>>\n    : never\n\n/**\n * Make a [[Union]] not allow excess properties (https://github.com/Microsoft/TypeScript/issues/20863)\n * @param U to make strict\n * @returns [[Union]]\n * @example\n * ```ts\n * ```\n */\nexport type Strict<U extends object> =\n    ComputeRaw<_Strict<U>>\n"
  },
  {
    "path": "sources/Union/_api.ts",
    "content": "/** @ignore *//** */\n\nexport {Diff} from './Diff'\nexport {Exclude} from './Exclude'\nexport {Filter} from './Filter'\nexport {Has} from './Has'\nexport {Intersect} from './Intersect'\nexport {IntersectOf} from './IntersectOf'\nexport {Last} from './Last'\nexport {Merge} from './Merge'\nexport {NonNullable} from './NonNullable'\nexport {Nullable} from './Nullable'\nexport {Pop} from './Pop'\nexport {Replace} from './Replace'\nexport {Select} from './Select'\nexport {Strict} from './Strict'\nexport {ListOf} from './ListOf'\n"
  },
  {
    "path": "sources/index.ts",
    "content": "/** @ignore *//** */\n\nimport * as Test from './Test'\nimport * as A from './Any/_api'\nimport * as B from './Boolean/_api'\nimport * as C from './Class/_api'\nimport * as Community from './Community/_api'\nimport * as F from './Function/_api'\nimport * as I from './Iteration/_api'\nimport * as M from './Misc/_api'\nimport * as N from './Number/_api'\nimport * as O from './Object/_api'\nimport * as S from './String/_api'\nimport * as T from './List/_api'\nimport * as L from './List/_api'\nimport * as U from './Union/_api'\nimport * as Any from './Any/_api'\nimport * as Boolean from './Boolean/_api'\nimport * as Class from './Class/_api'\nimport * as Function from './Function/_api'\nimport * as Iteration from './Iteration/_api'\nimport * as Misc from './Misc/_api'\nimport * as Number from './Number/_api'\nimport * as Object from './Object/_api'\nimport * as String from './String/_api'\nimport * as Tuple from './List/_api'\nimport * as List from './List/_api'\nimport * as Union from './Union/_api'\n\nexport {\n    Test,\n    A,\n    Any,\n    B,\n    Boolean,\n    C,\n    Class,\n    Community,\n    F,\n    Function,\n    I,\n    Iteration,\n    L,\n    List,\n    M,\n    Misc,\n    N,\n    Number,\n    O,\n    Object,\n    S,\n    String,\n    T,\n    Tuple,\n    U,\n    Union,\n}\n\n// ///////////////////////////////////////////////////////////////////////////////////////\n// NOTES /////////////////////////////////////////////////////////////////////////////////\n\n// ///////////////////////////////////////////////////////////////////////////////////////\n// RULES /////////////////////////////////////////////////////////////////////////////////\n\n// I regularly check that the project is respecting the following rules\n\n// ---------------------------------------------------------------------------------------\n// 1. Better computations\n//\n// search for `= \\{\\n?[ ]*?\\[(.*?\\n)*?\\}` and add `& {}` for better computation\n// ! we can only do this if the mapped type is not intended to go deep (recurse)\n// ! because `& {}` forces computation, if we do it deeply => resolves to `any`\n// ! this happens only when a type is nested within itself => infinite recursion\n// This technique also lowers the memory consumption and the RAM that is needed\n\n// ---------------------------------------------------------------------------------------\n// 2. Avoid fall-through `never`\n//\n// do not forget to NOT do `X extends never` => do `[X] extends [never]`\n// if the goal is to explicitly match `never` & not distribute the type\n\n// ---------------------------------------------------------------------------------------\n// 3. Ensure type distribution\n//\n// There are three families of types that do not distribute well (at all)\n// - types that make use of `keyof`. `keyof` is a distribution breaker. search for `(?<! in )keyof(?! any)`\n// - recursive iteration types, the ones that are of the `Concat` form. search for `(?<!\\?)\\n.*?extends infer X`\n//   (this happens because this is an unsupported feature, it's neither `extends` nor a mapped type)\n//   (it has the effect of not distributing/aggregate unions with `At`/`[]`, we must do it manually)\n// - types that are used to compute keys that match certain conditions. search for `}[Keys<` | `}[keyof`\n// - anything that's indexed has a chance of not distributing properly. search for `}[`\n//\n// => In those cases, we do the distributution manually by inserting `<type> extends unknown ? ... : never`\n// -> `keyof` statements are ok and can be used if they're distributed. search for `extends unknown ?`\n// -> Remember that simple mapped types distribute well over unions and preserve them (no problem)\n//\n// => For recursive types that re-use each other, we MUST NOT use the distributed version since they all do it\n//    We must import the version of the type that is named `type _<name>`. This is the non-distributed version\n//    (otherwise, we would distribute over something that is already distributed (pointless, it uses resources))\n\n// ---------------------------------------------------------------------------------------\n// 4. Naming\n//\n// => If you wonder what the `type _<name>` means, it's a \"step\" in the implementation (a bare implementation)\n//    (Usually, the first step `_` takes care of parameters. But you can also find 2 steps `__` (eg. recursive))\n// => !\\ Perf: Always check if a type has an EXPORTED `_` version, decide if needed\n// -> Remember:\n//              - ALL EXPORTED `_` types are/must be NON-distributed types\n//              - ALL `_` types are parameter processors, they handle params\n//              - ALL `_` types are the first step in a type's implementation\n//              - ALL `_` types are useful to save processing/performance cost\n//              - NOT ALL `_` types serve the same purpose\n\n// ---------------------------------------------------------------------------------------\n// 4. Performance\n//\n// => Types must always be written to be as lightweight as possible\n// -> Sometimes it involves losing the comfort of using other types\n//\n// => Distributed types MUST USE NON-distributed types as much as possible\n// -> This will avoid `<type> extends unknown`-hell loops (and re-looping)\n//\n// => Avoiding unnecessary intersections on large unions will compute time\n// => This is also valid for `extends`, for distributing over large unions\n\n// ---------------------------------------------------------------------------------------\n// 5. Keys & Tuples\n//\n// => It is very common that we use `ObjectOf` to make a tuple an `object`\n// -> We do this so that we can use tuples with the `Object` type utilities\n// -> Using `Object` utilities directly with a tuple is known to cause bugs\n//\n// => One of the features of this lib is to be able to pass `Key`s to utils\n// -> But on tuples that get manipulated (eg. with `ObjectOf`) we just can't\n// -> In fact, tuple utilities were not always able to handle `number` keys\n// -> This is a side effect of altering/transforming the original tuple type\n// -> Altered tuples can only be interacted with if we pass `string` keys\n//    (In essence, this would fail `Pick<ObjectOf<[1]>, 0>`)\n// => So what we do is to check for all utilities located in folder `src/List`\n// -> We look for ones that have any kind of `Key` parameter `K extends Key`\n// -> We use `NumberOf` on those `K`s to make them `Number`s (ie. `string`s)\n//    (Yes, `NumberOf` yields a `string` bcs numbers are handled as strings)\n\n// ---------------------------------------------------------------------------------------\n// 6. Distribution\n//\n// => An easy way to test if distribution is happening correctly is to test the\n// type with `never`, then it should yield `never`. However, this might differ\n// or not be true for a few utilities.\n//\n// => Perf: Always check if a type has an EXPORTED `_` version, decide if needed\n//\n// => !\\ Excessive type distribution is known to cause type metadata loss\n//    TypeScript's inference stops following if too much distribution is done\n//    ALWAYS build a type version with `_` utilities, then distribute the type\n\n// ///////////////////////////////////////////////////////////////////////////////////////\n// TODO //////////////////////////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "tests/Any.ts",
    "content": "import {Test, A} from '../sources'\n\nconst {checks, check} = Test\n\n// ///////////////////////////////////////////////////////////////////////////////////////\n// ANY ///////////////////////////////////////////////////////////////////////////////////\n\ntype O = {\n    a: string,\n    b: number;\n    c: {a: 'a'} & {b: 'b'};\n    d?: 'string0';\n    readonly e?: 'string1';\n    readonly f: 0;\n    g: O;\n    h?: 1;\n    j: 'a' | undefined;\n    k: {a: {b: string}};\n    x: () => 1;\n};\n\ntype T = [\n    1,\n    2,\n    '3' | undefined,\n    'xxxx',\n    {a: 'a'} & {b: 'b'},\n    string | number,\n    number,\n    object,\n    readonly [0, 1, 2?],\n    'xxxx'?\n];\n\n// ---------------------------------------------------------------------------------------\n// AT\n\nchecks([\n    check<A.At<O, 'a'>, string, Test.Pass>(),\n    check<A.At<O, 'c'>, {a: 'a'} & {b: 'b'}, Test.Pass>(),\n    check<A.At<O, 'g'>, O, Test.Pass>(),\n    check<A.At<T, '1'>, 2, Test.Pass>(),\n    check<A.At<T, '3'>, 'xxxx', Test.Pass>(),\n    check<A.At<{a: 1} | {b: 2}, 'a'>, 1 | undefined, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// CAST\n\nchecks([\n    check<A.Cast<[0, 1, 2], any>, [0, 1, 2], Test.Pass>(),\n    check<A.Cast<{a: string}, {}>, {a: string}, Test.Pass>(),\n    check<A.Cast<string, object>, object, Test.Pass>(),\n    check<A.Cast<any, string>, any, Test.Pass>(),\n    check<A.Cast<0, 42>, 42, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// COMPUTE\n\n// Cannot be tested\n\n// ---------------------------------------------------------------------------------------\n// CONTAINS\n\nchecks([\n    check<A.Contains<any, any>, 1, Test.Pass>(),\n    check<A.Contains<[0, 1], any>, 1, Test.Pass>(),\n    check<A.Contains<any, [0, 1]>, 0, Test.Pass>(),\n    check<A.Contains<any, [0, 1]>, 0, Test.Pass>(),\n    check<A.Contains<0, 0>, 1, Test.Pass>(),\n    check<A.Contains<0, 1>, 0, Test.Pass>(),\n    check<A.Contains<0, number>, 1, Test.Pass>(),\n    check<A.Contains<any, string>, 0, Test.Pass>(),\n    check<A.Contains<string, any>, 1, Test.Pass>(),\n    check<A.Contains<{}, object>, 1, Test.Pass>(),\n    check<A.Contains<{a: any}, object>, 1, Test.Pass>(),\n    check<A.Contains<object, {a: any}>, 0, Test.Pass>(),\n    check<A.Contains<any[], Array<any>>, 1, Test.Pass>(),\n    check<A.Contains<'a' | 'b', 'b' | 'a'>, 1, Test.Pass>(),\n    check<A.Contains<'b', 'b' | 'a'>, 1, Test.Pass>(),\n    check<A.Contains<'b' | 'a', 'b'>, 0, Test.Pass>(),\n    check<A.Contains<'a', 'a'>, 1, Test.Pass>(),\n    check<A.Contains<never, never>, 0, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// EQUALS\n\nchecks([\n    check<A.Equals<{}, {} | null>, 0, Test.Pass>(),\n    check<A.Equals<[0, 1], any>, 0, Test.Pass>(),\n    check<A.Equals<any, [0, 1]>, 0, Test.Pass>(),\n    check<A.Equals<any, [0, 1]>, 0, Test.Pass>(),\n    check<A.Equals<0, 0>, 1, Test.Pass>(),\n    check<A.Equals<0, 1>, 0, Test.Pass>(),\n    check<A.Equals<0, number>, 0, Test.Pass>(),\n    check<A.Equals<any, string>, 0, Test.Pass>(),\n    check<A.Equals<string, any>, 0, Test.Pass>(),\n    check<A.Equals<{}, object>, 0, Test.Pass>(),\n    check<A.Equals<{a: any}, object>, 0, Test.Pass>(),\n    check<A.Equals<object, {a: any}>, 0, Test.Pass>(),\n    check<A.Equals<any[], Array<any>>, 1, Test.Pass>(),\n    check<A.Equals<'a' | 'b', 'b' | 'a'>, 1, Test.Pass>(),\n    check<A.Equals<'a', 'a'>, 1, Test.Pass>(),\n    check<A.Equals<1 | 0, 0 | 1>, 1, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// EXTENDS\n\nchecks([\n    check<A.Extends<any, any>, 1, Test.Pass>(),\n    check<A.Extends<[0, 1], any>, 1, Test.Pass>(),\n    check<A.Extends<any, [0, 1]>, 0, Test.Fail>(),\n    check<A.Extends<any, [0, 1]>, 0 | 1, Test.Pass>(),\n    check<A.Extends<0, 0>, 1, Test.Pass>(),\n    check<A.Extends<0, 1>, 0, Test.Pass>(),\n    check<A.Extends<0, number>, 1, Test.Pass>(),\n    check<A.Extends<any, string>, 0 | 1, Test.Pass>(),\n    check<A.Extends<string, any>, 1, Test.Pass>(),\n    check<A.Extends<{}, object>, 1, Test.Pass>(),\n    check<A.Extends<{a: any}, object>, 1, Test.Pass>(),\n    check<A.Extends<object, {a: any}>, 0, Test.Pass>(),\n    check<A.Extends<any[], Array<any>>, 1, Test.Pass>(),\n    check<A.Extends<'a' | 'b', 'b' | 'a'>, 1, Test.Pass>(),\n    check<A.Extends<'b', 'b' | 'a'>, 1, Test.Pass>(),\n    check<A.Extends<'b' | 'a', 'b'>, 0 | 1, Test.Pass>(),\n    check<A.Extends<'a', 'a'>, 1, Test.Pass>(),\n    check<A.Extends<never, never>, 0, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// KEY\n\n// Cannot be tested\n\n// ---------------------------------------------------------------------------------------\n// KEYS\n\nchecks([\n    check<A.Keys<O>, keyof O, Test.Pass>(),\n    check<A.Keys<{a: 0} | {b: 0}>, 'a' | 'b', Test.Pass>(),\n    check<(keyof ({a: 0} | {b: 0})), 'a' & 'b', Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// KNOWNKEYS\n\nchecks([\n    check<A.KnownKeys<T>, Exclude<A.Keys<T>, number>, Test.Pass>(),\n    check<A.KnownKeys<string[]>, never, Test.Pass>(),\n    check<A.KnownKeys<O>, keyof O, Test.Pass>(),\n    check<A.KnownKeys<string[]>, never, Test.Pass>(),\n    check<A.KnownKeys<{[k: string]: any} & {a: any}>, 'a', Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// IS\n\nchecks([\n    check<A.Is<'xxxx', string, 'extends->'>, 1, Test.Pass>(),\n    check<A.Is<string, 'xxxx', 'extends->'>, 0, Test.Pass>(),\n\n    check<A.Is<'xxxx', string, '<-extends'>, 0, Test.Pass>(),\n    check<A.Is<string, 'xxxx', '<-extends'>, 1, Test.Pass>(),\n\n    check<A.Is<string, string | number, 'extends->'>, 1, Test.Pass>(),\n    check<A.Is<string | number, string, 'extends->'>, 0 | 1, Test.Pass>(),\n\n    check<A.Is<string, string | number, '<-extends'>, 0 | 1, Test.Pass>(),\n    check<A.Is<string | number, string, '<-extends'>, 1, Test.Pass>(),\n\n    check<A.Is<string, string | number, '<-contains'>, 0, Test.Pass>(),\n    check<A.Is<string | number, string, '<-contains'>, 1, Test.Pass>(),\n\n    check<A.Is<string, string | number, 'contains->'>, 1, Test.Pass>(),\n    check<A.Is<string | number, string, 'contains->'>, 0, Test.Pass>(),\n\n    check<A.Is<'xxxx', string, 'equals'>, 0, Test.Pass>(),\n    check<A.Is<string, 'xxxx', 'equals'>, 0, Test.Pass>(),\n\n    check<A.Is<string, string | number, 'equals'>, 0, Test.Pass>(),\n    check<A.Is<string | number, string, 'equals'>, 0, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// PROMISE\n\nchecks([\n    check<A.Promise<Promise<1>>, A.Promise<1>, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// AWAIT\n\nchecks([\n    check<A.Await<Promise<1>>, 1, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// TRY\n\nchecks([\n    check<A.Try<[0, 1, 2], any>, [0, 1, 2], Test.Pass>(),\n    check<A.Try<{a: string}, {}>, {a: string}, Test.Pass>(),\n    check<A.Try<string, object>, never, Test.Pass>(),\n    check<A.Try<any, string>, any, Test.Pass>(),\n    check<A.Try<0, 42, 'xxxx'>, 'xxxx', Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// TYPE\n\nchecks([\n    check<A.Type<string, 'name'>, any, Test.Fail>(),\n    check<A.Type<string, 'name'>, A.Type<string, 'other'>, Test.Fail>(),\n    check<A.Type<string, 'name'>, A.Type<string, 'name'>, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// X\n\n// Cannot be tested // todo\n"
  },
  {
    "path": "tests/Boolean.ts",
    "content": "import {Test, B} from '../sources'\n\nconst {checks, check} = Test\n\n// ///////////////////////////////////////////////////////////////////////////////////////\n// BOOLEAN ///////////////////////////////////////////////////////////////////////////////\n\n// ---------------------------------------------------------------------------------------\n// AND\n\nchecks([\n    check<B.And<1, 1>, 1, Test.Pass>(),\n    check<B.And<1, 0>, 0, Test.Pass>(),\n    check<B.And<0, 1>, 0, Test.Pass>(),\n    check<B.And<0, 0>, 0, Test.Pass>(),\n    check<B.And<0 | 1, 0>, 0, Test.Pass>(),\n    check<B.And<0, 0 | 1>, 0, Test.Pass>(),\n    check<B.And<0 | 1, 1>, 0 | 1, Test.Pass>(),\n    check<B.And<1, 0 | 1>, 0 | 1, Test.Pass>(),\n    check<B.And<0 | 1, 0 | 1>, 0 | 1, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// NOT\n\nchecks([\n    check<B.Not<1>, 0, Test.Pass>(),\n    check<B.Not<0>, 1, Test.Pass>(),\n    check<B.Not<1 | 0>, 1 | 0, Test.Pass>(),\n    check<B.Not<1 | 0>, 0 | 1, Test.Pass>(),\n    check<B.Not<0 | 1>, 0 | 1, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// OR\n\nchecks([\n    check<B.Or<1, 1>, 1, Test.Pass>(),\n    check<B.Or<1, 0>, 1, Test.Pass>(),\n    check<B.Or<0, 1>, 1, Test.Pass>(),\n    check<B.Or<0, 0>, 0, Test.Pass>(),\n    check<B.Or<0 | 1, 1>, 1, Test.Pass>(),\n    check<B.Or<1, 0 | 1>, 1, Test.Pass>(),\n    check<B.Or<0 | 1, 0>, 0 | 1, Test.Pass>(),\n    check<B.Or<0, 0 | 1>, 0 | 1, Test.Pass>(),\n    check<B.Or<0 | 1, 0 | 1>, 0 | 1, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// XOR\n\nchecks([\n    check<B.Xor<1, 1>, 0, Test.Pass>(),\n    check<B.Xor<1, 0>, 1, Test.Pass>(),\n    check<B.Xor<0, 1>, 1, Test.Pass>(),\n    check<B.Xor<0, 0>, 0, Test.Pass>(),\n    check<B.Xor<0 | 1, 1>, 0 | 1, Test.Pass>(),\n    check<B.Xor<1, 0 | 1>, 0 | 1, Test.Pass>(),\n    check<B.Xor<0 | 1, 0>, 0 | 1, Test.Pass>(),\n    check<B.Xor<0, 0 | 1>, 0 | 1, Test.Pass>(),\n    check<B.Xor<0 | 1, 0 | 1>, 0 | 1, Test.Pass>(),\n])\n"
  },
  {
    "path": "tests/Class.ts",
    "content": "import {Test, C} from '../sources'\n\nconst {checks, check} = Test\n\n// ///////////////////////////////////////////////////////////////////////////////////////\n// CLASS /////////////////////////////////////////////////////////////////////////////////\n\nclass TestClass {\n    // @ts-ignore\n    constructor(a: string, b: number) {}\n}\n\n// ---------------------------------------------------------------------------------------\n// CLASS\n\n// Cannot be tested\n\n// ---------------------------------------------------------------------------------------\n// INSTANCEOF\n\nchecks([\n    check<C.Instance<typeof TestClass>, TestClass, Test.Pass>(TestClass),\n])\n\n// ---------------------------------------------------------------------------------------\n// PARAMETERS\n\nchecks([\n    check<C.Parameters<typeof TestClass>, [string, number], Test.Pass>(),\n])\n"
  },
  {
    "path": "tests/Community.ts",
    "content": "import {Test, Community} from '../sources'\n\nconst {checks, check} = Test\n\n// ///////////////////////////////////////////////////////////////////////////////////////\n// COMMUNITY /////////////////////////////////////////////////////////////////////////////\n\ntype O = {\n    a: string,\n    b: number;\n    c: {a: 'a'} & {b: 'b'};\n    d?: 'string0';\n    readonly e?: 'string1';\n    readonly f: 0;\n    g: O; // recursion\n    h?: 1;\n    j: 'a' | undefined;\n    k: {a: {b: string}};\n};\n\ntype O1 = {\n    a: string | number;\n    b: object;\n    c: {a: 'a'} & {b: 'b'};\n    d?: never;\n    readonly e?: 'string1';\n    readonly f: 0;\n    g: O1; // recursion\n    h: never;\n    i: {a: string};\n    j: 'a' | undefined;\n    k: {a: {b: string, c: 0}};\n}\n\n// ---------------------------------------------------------------------------------------\n// INCLUDESDEEP\n\ntype O_INCLUDESDEEP = {\n    a: {\n        b: {\n            x: number;\n       };\n   };\n}\n\nchecks([\n    check<Community.IncludesDeep<O_INCLUDESDEEP, number, 'default', 3>, 1, Test.Pass>(),\n    check<Community.IncludesDeep<O_INCLUDESDEEP, number, 'default', 0>, 0, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// ISLITERAL\n\nchecks([\n    check<Community.IsLiteral<1 | 2>, 1, Test.Pass>(),\n    check<Community.IsLiteral<1 | '2'>, 0 | 1, Test.Pass>(),\n    check<Community.IsLiteral<'x', string>, 1, Test.Pass>(),\n    check<Community.IsLiteral<1 | 'x', number>, 0 | 1, Test.Pass>(),\n    check<Community.IsLiteral<number, number>, 0, Test.Pass>(),\n    check<Community.IsLiteral<string, string>, 0, Test.Pass>(),\n])\n"
  },
  {
    "path": "tests/Function.ts",
    "content": "import {Test, F, A} from '../sources'\nimport {Narrow} from '../sources/Function/Narrow'\n\nconst {checks, check} = Test\n\n//////////////////////////////////////////////////////////////////////////////////////////\n// FUNCTION //////////////////////////////////////////////////////////////////////////////\n\n// @ts-ignore\nconst fn = (a: string, b: number, c: object) => true\n\n// ---------------------------------------------------------------------------------------\n// ARROW\n\nchecks([\n    check<F.Function<[string, number, object], boolean>, typeof fn, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// COMPOSE\n\n// sync ----------------------------------------------------------------------------------\n\ndeclare const composeSync: F.Compose<'sync'>\n\nconst composedSync = composeSync(\n    // @ts-ignore\n    (message: string) => false, // receive previous return\n    (info: {name: string, age: number}) => `Welcome, ${info.name}`, // receive previous return\n    <T>(generic: T) => generic, // receive previous return\n    (name: string, age: number) => ({name, age}), // receive parameters\n)\n\ncomposeSync(\n    (c1: string[]) => [c1],\n    (b1: string) => [b1],\n    curry((a1: number, d2:  number) => `${a1 + d2}`),\n)(23, 42)\n\nchecks([\n    check<(typeof composedSync), (name: string, age: number) => boolean, Test.Pass>(),\n])\n\n// async ---------------------------------------------------------------------------------\n\ndeclare const composeAsync: F.Compose<'async'>\n\nconst composedAsync = composeAsync(\n    // @ts-ignore\n    (message: string) => false, // receive previous return\n    // @ts-ignore\n    async (info: {name: string, age: number}) => `Welcome, ${info.name}`, // receive previous return\n    async <T>(generic: T) => generic, // receive previous return\n    async (name: string, age: number) => ({name, age}), // receive parameters\n)\n\ncomposeAsync(\n    (c1: string[]) => [c1],\n    (b1: string) => [b1],\n    curry((a1: number, d2:  number) => `${a1 + d2}`),\n)(23, 42)\n\nchecks([\n    check<(typeof composedAsync), (name: string, age: number) => Promise<boolean>, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// CURRY\n\ndeclare function curry<Fn extends F.Function>(f: Fn): F.Curry<Fn>;\n\nconst __ = {} as A.x\n\n// @ts-ignore\nconst toCurry = (name: string, age: number, single: boolean, nicknames?: string) => true\nconst curried = curry(toCurry)\n\nconst test00: boolean = curried(__, 26)(__, true, 'JJ')(__)(__)('Jane') // boolean\nconst test01: boolean = curried(__, 26)(__, true)('Jane') // boolean\nconst test02: boolean = curried(__, 26)(__, true, __)('Jane', 'JJ') // boolean\nconst test03: boolean = curried('Jane', 26, true) // boolean\nconst test04: boolean = curried('Jane', 26, true, 'JJ') // boolean\n\n// ---------------------------------------------------------------------------------------\n// EXACT\n\ndeclare function exactObject<A>(x: F.Exact<A, {a: number, b: 2}>): A;\n\nconst test07 = exactObject({} as {a: 1, b: 2})\n// @ts-expect-error\nconst test08 = exactObject({} as {a: 1})\n\nchecks([\n    check<typeof test07, {a: 1, b: 2}, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// PARAMETERS\n\nchecks([\n    check<F.Parameters<typeof fn>, [string, number, object], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// AUTOPATH\n\ntype O_AUTOPATH = {\n    a: {\n        a: 1;\n    };\n    b: {\n        a: {\n            a: 2;\n        };\n        b: O_AUTOPATH[];\n    };\n};\n\nchecks([\n    check<F.AutoPath<O_AUTOPATH, 'b/b/0/a', '/'>, 'b/b/0/a' | 'b/b/0/a/a', Test.Pass>(),\n    check<F.AutoPath<O_AUTOPATH, 'a'>, 'a' | 'a.a', Test.Pass>(),\n    check<F.AutoPath<O_AUTOPATH, 'a.'>, 'a.a', Test.Pass>(),\n    check<F.AutoPath<O_AUTOPATH, 'b.'>, 'b.b' | 'b.a', Test.Pass>(),\n    check<F.AutoPath<O_AUTOPATH, 'b.b.0'>, 'b.b.0' | 'b.b.0.b' | 'b.b.0.a', Test.Pass>(),\n    check<F.AutoPath<O_AUTOPATH, 'b.b.0.a'>, 'b.b.0.a' | 'b.b.0.a.a', Test.Pass>(),\n    check<F.AutoPath<O_AUTOPATH, 'b.b.0.a'>, 'b.b.0.a' | 'b.b.x.a.a', Test.Fail>(),\n    check<F.AutoPath<O_AUTOPATH, 'b.b.0.a'>, 'b.b.0.a' | 'b.b.a.a', Test.Fail>(),\n    check<F.AutoPath<GlobalEventHandlersEventMap, 'cancel.isTrusted.'>, never, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// VALIDPATH\n\ntype O_VALIDPATH = {\n    a: {\n        a: {};\n    };\n    b: {\n        a: {\n            a: {};\n        };\n        b: string[];\n    };\n};\n\nchecks([\n    check<F.ValidPath<any, ['a', 'a']>, ['a', 'a'], Test.Pass>(),\n    check<F.ValidPath<O_VALIDPATH, ['a', 'a']>, ['a', 'a'], Test.Pass>(),\n    check<F.ValidPath<O_VALIDPATH, ['a', 'x']>, ['a', 'x'], Test.Pass>(),\n    check<F.ValidPath<O_VALIDPATH, ['b', 'a', 'a']>, ['b', 'a', 'a'], Test.Pass>(),\n    check<F.ValidPath<O_VALIDPATH, ['b', 'b', 0]>, ['b', 'b', 0], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// LENGTH\n\nchecks([\n    check<F.Length<typeof fn>, 3, Test.Pass>(),\n    check<F.Length<(a1: any, a2?: any) => any>, 1 | 2, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// NARROW\n\ndeclare function narrowList<A extends any[]>(x: F.Narrow<A>): A;\ndeclare function narrowObject<A extends object>(x: F.Narrow<A>): A;\n\nconst test05 = narrowList(['e', 2, true, {f: ['g', ['h']]}])\nconst test06 = narrowObject({a: 1, b: 'c', d: ['e', 2, true, {f: ['g']}]})\n\nchecks([\n    check<typeof test05, ['e', 2, true, {f: ['g', ['h']]}], Test.Pass>(),\n    check<typeof test06, {a: 1, b: 'c', d: ['e', 2, true, {f: ['g']}]}, Test.Pass>(),\n])\n\nconst narrow = <T>(thing: Narrow<T>) => thing\n\ninterface Foo {\n    bar: {hi: 'there'}\n}\n\nclass Bar implements Foo {\n    bar = narrow({hi: 'there'})\n}\n\ntype Co<V> = () => Narrow<V>;\nfunction covariance<U, T extends U>(t: Narrow<T>, u: Narrow<U>, coT: Co<T>, coU: Co<U>) {\n    u = t\n    // @ts-expect-error\n    t = u\n\n    coU = coT\n    // @ts-expect-error\n    coT = coU\n}\n\ntype Contra<V> = (v: Narrow<V>) => void;\nfunction contravariance<U, T extends U>(t: Narrow<T>, u: Narrow<U>, contraT: Contra<T>, contraU: Contra<U>) {\n    u = t\n    // @ts-expect-error\n    t = u\n\n    // @ts-expect-error\n    contraU = contraT\n    contraT = contraU\n}\n\ntype In<V> = (v: Narrow<V>) => Narrow<V>;\nfunction invariance<U, T extends U>(t: Narrow<T>, u: Narrow<U>, inT: In<T>, inU: In<U>) {\n    u = t\n    // @ts-expect-error\n    t = u\n\n    // @ts-expect-error\n    inU = inT\n    // @ts-expect-error\n    inT = inU\n}\n\ntype Bi<V> = { foo(v: Narrow<V>): void };\nfunction bivariance<U, T extends U>(t: Narrow<T>, u: Narrow<U>, biT: Bi<T>, biU: Bi<U>) {\n    u = t\n    // @ts-expect-error\n    t = u\n\n    biU = biT\n    biT = biU\n}\n\n// ---------------------------------------------------------------------------------------\n// PIPE\n\n// sync ----------------------------------------------------------------------------------\n\ndeclare const pipeSync: F.Pipe<'sync'>\n\nconst pipedSync = pipeSync(\n    (name: string, age: number) => ({name, age}), // receive parameters\n    <T>(generic: T) => generic, // receive previous return\n    (info: {name: string, age: number}) => `Welcome, ${info.name}`, // receive previous return\n    // @ts-ignore\n    (message: string) => false, // receive previous return\n)\n\npipeSync(\n    curry((a1: number, d2:  number) => `${a1 + d2}`),\n    (b1: string) => [b1],\n    (c1: string[]) => [c1],\n)(23, 42)\n\nchecks([\n    check<(typeof pipedSync), (name: string, age: number) => boolean, Test.Pass>(),\n])\n\n// async ---------------------------------------------------------------------------------\n\ndeclare const pipeAsync: F.Pipe<'async'>\n\nconst pipedAsync = pipeAsync(\n    (name: string, age: number) => ({name, age}), // receive parameters\n    async <T>(generic: T) => generic, // receive previous return\n    // @ts-ignore\n    async (info: {name: string, age: number}) => `Welcome, ${info.name}`, // receive previous return\n    // @ts-ignore\n    (message: string) => false, // receive previous return\n)\n\npipeAsync(\n    curry((a1: number, d2:  number) => `${a1 + d2}`),\n    (b1: string) => [b1],\n    (c1: string[]) => [c1],\n)(23, 42)\n\nchecks([\n    check<(typeof pipedAsync), (name: string, age: number) => Promise<boolean>, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// PROMISIFY\n\nchecks([\n    check<F.Promisify<(typeof fn)>, (a: string, b: number, c: object) => Promise<boolean>, Test.Pass>(),\n    check<F.Promisify<(a: string) => A.Promise<boolean>>, (a: string) => Promise<boolean>, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// RETURN\n\nchecks([\n    check<F.Return<typeof fn>, boolean, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// UNCURRY\n\nchecks([\n    check<F.UnCurry<typeof curried>, typeof toCurry, Test.Pass>(),\n])\n"
  },
  {
    "path": "tests/Iteration.ts",
    "content": "import {Test, I} from '../sources'\n\nconst {checks, check} = Test\n\n// ///////////////////////////////////////////////////////////////////////////////////////\n// ITERATION /////////////////////////////////////////////////////////////////////////////\n\n// ---------------------------------------------------------------------------------------\n// ITERATION\n\n// Cannot be tested\n\n// ---------------------------------------------------------------------------------------\n// ITERATIONOF\n\n// No test needed\n\n// ---------------------------------------------------------------------------------------\n// KEY\n\nchecks([\n    check<I.Key<I.IterationOf<3 | 4>>, '3' | '4', Test.Pass>(),\n    check<I.Key<I.IterationOf<3>>, '3', Test.Pass>(),\n    check<I.Key<I.IterationOf<-4>>, '-4', Test.Pass>(),\n    check<I.Key<I.IterationOf<-1000>>, `${number}`, Test.Pass>(),\n    check<I.Key<I.IterationOf<1000>>, `${number}`, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// NEXT\n\nchecks([\n    check<I.Pos<I.Next<I.IterationOf<3 | 4>>>, 4 | 5, Test.Pass>(),\n    check<I.Pos<I.Next<I.IterationOf<3>>>, 4, Test.Pass>(),\n    check<I.Pos<I.Next<I.IterationOf<-4>>>, -3, Test.Pass>(),\n    check<I.Pos<I.Next<I.IterationOf<-1000>>>, number, Test.Pass>(),\n    check<I.Pos<I.Next<I.IterationOf<1000>>>, number, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// POS\n\nchecks([\n    check<I.Pos<I.IterationOf<3 | 4>>, 3 | 4, Test.Pass>(),\n    check<I.Pos<I.IterationOf<3>>, 3, Test.Pass>(),\n    check<I.Pos<I.IterationOf<-4>>, -4, Test.Pass>(),\n    check<I.Pos<I.IterationOf<-1000>>, number, Test.Pass>(),\n    check<I.Pos<I.IterationOf<1000>>, number, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// PREV\n\nchecks([\n    check<I.Pos<I.Prev<I.IterationOf<3 | 4>>>, 2 | 3, Test.Pass>(),\n    check<I.Pos<I.Prev<I.IterationOf<3>>>, 2, Test.Pass>(),\n    check<I.Pos<I.Prev<I.IterationOf<-4>>>, -5, Test.Pass>(),\n    check<I.Pos<I.Prev<I.IterationOf<-1000>>>, number, Test.Pass>(),\n    check<I.Pos<I.Prev<I.IterationOf<1000>>>, number, Test.Pass>(),\n])\n"
  },
  {
    "path": "tests/List.ts",
    "content": "import {Test, T, A} from '../sources'\n\nconst {checks, check} = Test\n\n// ///////////////////////////////////////////////////////////////////////////////////////\n// LIST /////////////////////////////////////////////////////////////////////////////////\n\ntype T = [\n    1,\n    2,\n    '3' | undefined,\n    'xxxx',\n    {a: 'a'} & {b: 'b'},\n    string | number,\n    number,\n    object,\n    readonly [0, 1, 2?],\n    'xxxx'?\n];\n\ntype T1 = [\n    1,\n    2,\n    '3',\n    'xxxx',\n    string,\n    number,\n    number & {},\n    object,\n    readonly [0, 1, 2?, 3?],\n    {a: never},\n    'xxxx'?\n];\n\n// ---------------------------------------------------------------------------------------\n// APPEND\n\nchecks([\n    check<T.Append<[0, 1, 2, 3], 4>, [0, 1, 2, 3, 4], Test.Pass>(),\n    check<T.Append<[0, 1, 2, 3], [4, 5]>, [0, 1, 2, 3, [4, 5]], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// ASSIGN\n\nchecks([\n    check<T.Assign<[1], [[2, 1], [3, 2?]]>, [3, 2 | 1], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// ATLEAST\n\ntype T_ATLEAST = [\n    0,\n    1,\n    2\n] | [\n    3,\n    4,\n    5,\n    6\n];\n\ntype ATLEAST_T_013 =\n    | [0, 1, 2]\n    | [0, 1 | undefined, 2 | undefined]\n    | [0 | undefined, 1, 2 | undefined]\n    | [3, 4 | undefined, 5 | undefined, 6 | undefined]\n    | [3 | undefined, 4, 5 | undefined, 6 | undefined]\n    | [3 | undefined, 4 | undefined, 5 | undefined, 6];\n\nchecks([\n    check<T.AtLeast<T_ATLEAST, '0' | '1' | '3'>, ATLEAST_T_013, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// COMPULSORY\n\n// No test needed (same as O.Compulsory)\n\n// ---------------------------------------------------------------------------------------\n// COMPULSORYKEYS\n\n// No test needed (same as O.CompulsoryKeys)\n\n// ---------------------------------------------------------------------------------------\n// CONCAT\n\nchecks([\n    check<T.Concat<[1, 2, 3], [4, 5, 6]>, [1, 2, 3, 4, 5, 6], Test.Pass>(),\n    check<T.Concat<['1', '2', '3'], ['4']>, ['1', '2', '3', '4'], Test.Pass>(),\n    check<T.Concat<[1], number[]>, [1, ...number[]], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// DIFF\n\nchecks([\n    check<T.Diff<[1, 2, 3], [4, 5, 6], 'default'>, [], Test.Pass>(),\n    check<T.Diff<[1, 2, 3], [4, number, 6], 'extends->'>, [1, number, 3], Test.Pass>(),\n    check<T.Diff<[1, 2, 3], [4, 5, 6, 7], 'equals'>, [1, 2, 3, 7], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// DROP\n\nchecks([\n    check<T.Drop<[1, 2, 3, 4], 10, '->'>, [], Test.Pass>(),\n    check<T.Drop<[1, 2, 3, 4], 2, '->'>, [3, 4], Test.Pass>(),\n    check<T.Drop<[1, 2, 3, 4], 2, '<-'>, [1, 2], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// EITHER\n\ntype T_EITHER = [\n    0,\n    1,\n    2\n];\n\ntype EITHER_T_01 = [0, undefined, 2] | [undefined, 1, 2];\n\nchecks([\n    check<T.Either<T_EITHER, '0' | '1'>, EITHER_T_01, Test.Pass>(),\n])\n\n// -------------------------------------------------------------------------------------\n// EXCLUDE\n\nchecks([\n    check<T.Exclude<[1, 2, 3, 4], [0, 0, 0], 'default'>, [4], Test.Pass>(),\n    check<T.Exclude<[1, 2, 3, 4], [1, 0, 0], 'equals'>, [2, 3, 4], Test.Pass>(),\n    check<T.Exclude<[1, 2, 3, 4], [1, string, 3], 'extends->'>, [2, 4], Test.Pass>(),\n    check<T.Exclude<[1, number, 3, 4], [1, 2, 3], 'extends->'>, [number, 4], Test.Pass>(),\n])\n\n// -------------------------------------------------------------------------------------\n// EXCLUDEKEYS\n\nchecks([\n    check<T.ExcludeKeys<[1, 2, 3, 4], [0, 0, 0], 'default'>, '3', Test.Pass>(),\n    check<T.ExcludeKeys<[1, 2, 3, 4], [1, 0, 0], 'equals'>, '1' | '2' | '3', Test.Pass>(),\n    check<T.ExcludeKeys<[1, 2, 3, 4], [1, string, 3], 'extends->'>, '1' | '3', Test.Pass>(),\n    check<T.ExcludeKeys<[1, number, 3, 4], [1, 2, 3], 'extends->'>, '1' | '3', Test.Pass>(),\n])\n\n// -------------------------------------------------------------------------------------\n// EXTRACT\n\nchecks([\n    check<T.Extract<[1, 2, 3, 4, 5], 1, 3>, [2, 3, 4], Test.Pass>(),\n    check<T.Extract<[1, 2, 3, 4, 5], -1, 13>, [1, 2, 3, 4, 5], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// FILTER\n\ntype FILTER_T_NUMBER_EXTENDS = [\n    '3' | undefined,\n    'xxxx',\n    {a: 'a'} & {b: 'b'},\n    string | number,\n    object,\n    readonly [\n        0,\n        1,\n        2?,\n    ],\n    'xxxx' | undefined\n];\n\ntype FILTER_T_NUMBER_EQUALS = [\n    1,\n    2,\n    '3' | undefined,\n    'xxxx',\n    {a: 'a'} & {b: 'b'},\n    string | number,\n    object,\n    readonly [0, 1, 2?],\n    'xxxx' | undefined\n];\n\nchecks([\n    check<T.Filter<T, number, 'default'>, FILTER_T_NUMBER_EXTENDS, Test.Pass>(),\n    check<T.Filter<T, number, 'extends->'>, FILTER_T_NUMBER_EXTENDS, Test.Pass>(),\n    check<T.Filter<T, number, 'equals'>, FILTER_T_NUMBER_EQUALS, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// FILTERKEYS\n\n// No test needed (same as O.FilterKeys)\n\n// ---------------------------------------------------------------------------------------\n// FLATTEN\n\ntype T_FLATTEN = [1, 12, [2, [3, [4, [5, [6, [7, [8, [9, 92?]]]]]]]]];\ntype FLATTEN_T = [1, 12, 2, 3, 4, 5, 6, 7, 8, 9, 92] | [1, 12, 2, 3, 4, 5, 6, 7, 8, 9, undefined];\n\nchecks([\n    check<T.Flatten<any>, any[], Test.Pass>(),\n    check<T.Flatten<any[]>, any[], Test.Pass>(),\n    check<T.Flatten<T_FLATTEN>, FLATTEN_T, Test.Pass>(),\n    check<T.Flatten<[1, 2, 42]>, [1, 2, 42], Test.Pass>(),\n    check<T.Flatten<[1, 2?]>, [1, undefined] | [1, 2], Test.Pass>(),\n    check<T.Flatten<readonly [1, 2, 42]>, [1, 2, 42], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// GROUP\n\ntype T_GROUP = [1, 2, 3, 4, 5, 6, 7, 8];\n\ntype GROUP_T_1 = [[1], [2], [3], [4], [5], [6], [7], [8]];\ntype GROUP_T_2 = [[1, 2], [3, 4], [5, 6], [7, 8]];\ntype GROUP_T_3 = [[1, 2, 3], [4, 5, 6], [7, 8, undefined]];\n\nchecks([\n    check<T.Group<T_GROUP, 1>, GROUP_T_1, Test.Pass>(),\n    check<T.Group<T_GROUP, 2>, GROUP_T_2, Test.Pass>(),\n    check<T.Group<T_GROUP, 3>, GROUP_T_3, Test.Pass>(),\n    check<T.Group<[], 3>, [], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// HAS\n\n// No test needed (same as O.Has)\n\n// ---------------------------------------------------------------------------------------\n// HASPATH\n\n// No test needed (same as O.HasPath)\n\n// ---------------------------------------------------------------------------------------\n// HEAD\n\nchecks([\n    check<T.Head<T>, 1, Test.Pass>(),\n    // check<T.Head<any>, never, Test.Pass>(),\n    check<T.Head<never>, never, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// INCLUDES\n\n// No test needed (same as O.Includes)\n\n// ---------------------------------------------------------------------------------------\n// INTERSECT\n\ntype t = T.Intersect<T, T1, 'default'>\n\ntype INTERSECT_T_T1_NUMBER_DEFAULT = [\n    1,\n    2,\n    '3' | undefined,\n    'xxxx',\n    {a: 'a'} & {b: 'b'},\n    string | number,\n    number,\n    object,\n    readonly [0, 1, 2?],\n    'xxxx' | undefined\n];\n\ntype INTERSECT_T_T1_NUMBER_EXTENDS = [\n    1,\n    2,\n    '3' | undefined,\n    'xxxx',\n    number | string,\n    number,\n    object,\n    readonly [0, 1, 2?]\n];\n\ntype INTERSECT_T_T1_NUMBER_EQUALS = [\n    1,\n    2,\n    'xxxx',\n    object,\n];\n\nchecks([\n    check<T.Intersect<T, T1, 'default'>, INTERSECT_T_T1_NUMBER_DEFAULT, Test.Pass>(),\n    check<T.Intersect<T, T1, 'extends->'>, INTERSECT_T_T1_NUMBER_EXTENDS, Test.Pass>(),\n    check<T.Intersect<T, T1, 'equals'>, INTERSECT_T_T1_NUMBER_EQUALS, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// INTERSECTKEYS\n\n// No test needed (same as O.IntersectKeys)\n\n// ---------------------------------------------------------------------------------------\n// KEYSET\n\nchecks([\n    check<T.KeySet<1, 6>, 1 | 2 | 3 | 4 | 5 | 6, Test.Pass>(),\n    check<T.KeySet<-5, -2>, -5 | -4 | -3 | -2, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// LAST\n\nchecks([\n    check<T.Last<T>, 'xxxx' | readonly [0, 1, 2?] | undefined, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// LASTINDEX\n\nchecks([\n    check<T.LastKey<[0, 1, 2?]>, 1 | 2, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// LENGTH\n\nchecks([\n    check<T.Length<[0, 1, 2?]>, 2 | 3, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// LONGEST\n\nchecks([\n    check<T.Longest<T, T1>, T1, Test.Pass>(),\n    check<T.Longest<T1, T>, T1, Test.Pass>(),\n    check<T.Longest<[0], [1]>, [0], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// MERGE\n\nchecks([\n    // eslint-disable-next-line func-call-spacing\n    check<T.Merge<[0, 0, 0?], [1, 2, 3?]>, [0, 0, (0 | 3)?], Test.Pass>(),\n    check<T.Merge<[0, 0, 0?], [1, 2, 3]>, [0, 0, 0 | 3], Test.Pass>(),\n    check<T.Merge<[0?], [1, 2, 3]>, [0 | 1, 2, 3], Test.Pass>(),\n    check<T.Merge<[0?], [1, 2, 3]>, [2, 3?], Test.Fail>(),\n    check<T.Merge<[1, 2, 3?], [0, 0, 0]>, [1, 2, 3 | 0], Test.Pass>(),\n    check<T.Merge<[0, [1]], [1, [2, 3], 4], 'deep'>, [0, [1, 3], 4], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// MERGEALL\n\nchecks([\n    check<T.MergeAll<[0], [[1, 2, 3?]]>, [0, 2, 3?], Test.Pass>(),\n    check<T.MergeAll<[0], [[1, 2, 3]]>, [0, 2, 3], Test.Pass>(),\n    check<T.MergeAll<[0?], [[1, 2, 3]]>, [2, 3?], Test.Fail>(),\n    check<T.MergeAll<[1, 2, 3?], [[0, 0, 0]]>, [1, 2, 3 | 0], Test.Pass>(),\n    check<T.MergeAll<[0, [1]], [[1, [2, 3], 4]], 'deep'>, [0, [1, 3], 4], Test.Pass>(),\n])\n// ---------------------------------------------------------------------------------------\n// MERGEKEYS\n\n// No test needed (same as O.MergeKeys)\n\n// ---------------------------------------------------------------------------------------\n// MODIFY\n\nchecks([\n    check<T.Modify<[9, string], [9, A.x?]>, [9, string?], Test.Pass>(),\n    check<T.Modify<[], [9, A.x]>, [9, never], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// NONNULLABLE\n\nchecks([\n    check<T.NonNullable<[0 | undefined, 1, 2 | undefined]>, [0, 1, 2], Test.Pass>(),\n    check<T.NonNullable<[0 | undefined, 1, 2 | undefined], '2'>, [0 | undefined, 1, 2], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// NONNULLABLEKEYS\n\n// No test needed (same as O.NonNullableKeys)\n\n// ---------------------------------------------------------------------------------------\n// NULLABLE\n\nchecks([\n    check<T.Nullable<[0, 1, 2]>, [0 | undefined | null, 1 | undefined | null, 2 | undefined | null], Test.Pass>(),\n    check<T.Nullable<[0, 1, 2], '2'>, [0, 1, 2 | undefined | null], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// NULLABLEKEYS\n\n// No test needed (same as O.NonNullableKeys)\n\n// ---------------------------------------------------------------------------------------\n// OBJECTOF\n\nchecks([\n    check<T.ObjectOf<readonly [0]>, {readonly 0: 0}, Test.Pass>(),\n    check<T.ObjectOf<[0, 1, 2]>, {0: 0, 1: 1, 2: 2}, Test.Pass>(),\n    check<T.ObjectOf<[0, 1, 2?]>, {0: 0, 1: 1, 2?: 2}, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// OMIT\n\nchecks([\n    check<T.Omit<[0, 1, 2?], '0'>, [1, 2 | undefined], Test.Pass>(),\n    check<T.Omit<[0, 1, 2?], '1' | '2'>, [0], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// OPTIONAL\n\nchecks([\n    check<T.Optional<[0, 1, 2]>, [0?, 1?, 2?], Test.Pass>(),\n    check<T.Optional<[0, 1, 2?]>, [0?, 1?, 2?], Test.Pass>(),\n    check<T.Optional<never>, never, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// OPTIONALKEYS\n\n// No test needed (same as O.OptionalKeys)\n\n// ---------------------------------------------------------------------------------------\n// OVERWRITE\n\n// No test needed (same as O.Overwrite)\n\n// ---------------------------------------------------------------------------------------\n// OPTIONAL\n\nchecks([\n    check<T.Partial<[0, 1, 2]>, [0?, 1?, 2?], Test.Pass>(),\n    check<T.Partial<[0, 1, 2?]>, [0?, 1?, 2?], Test.Pass>(),\n    check<T.Partial<never>, never, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// PATCH\n\nchecks([\n    check<T.Patch<[0], [1, 2, 3?]>, [0, 2, 3?], Test.Pass>(),\n    check<T.Patch<[0], [1, 2, 3]>, [0, 2, 3], Test.Pass>(),\n    check<T.Patch<[0?], [1, 2, 3]>, [2, 3?], Test.Fail>(),\n    check<T.Patch<[1, 2, 3?], [0, 0, 0]>, [1, 2, 3?], Test.Pass>(),\n    check<T.Patch<[0, [1]], [1, [2, 3], 4], 'deep'>, [0, [1, 3], 4], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// PATCHALL\n\nchecks([\n    check<T.PatchAll<[0], [[1, 2, 3?]]>, [0, 2, 3?], Test.Pass>(),\n    check<T.PatchAll<[0], [[1, 2, 3]]>, [0, 2, 3], Test.Pass>(),\n    check<T.PatchAll<[0?], [[1, 2, 3]]>, [2, 3?], Test.Fail>(),\n    check<T.PatchAll<[1, 2, 3?], [[0, 0, 0]]>, [1, 2, 3?], Test.Pass>(),\n    check<T.PatchAll<[0, [1]], [[1, [2, 3], 4]], 'deep'>, [0, [1, 3], 4], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// PATH\n\n// No test needed (same as O.Path)\n\n// ---------------------------------------------------------------------------------------\n// PATHS\n\n// No test needed (same as O.Paths)\n\n// ---------------------------------------------------------------------------------------\n// PATHUP\n\n// No test needed (same as O.PathUp)\n\n// ---------------------------------------------------------------------------------------\n// PICK\n\nchecks([\n    check<T.Pick<[0, 1, 2], '0'>, [0], Test.Pass>(),\n    check<T.Pick<[0, 1, 2?], '1' | '2'>, [1, 2 | undefined], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// POP\n\nchecks([\n    check<T.Pop<[1, 2, 3]>, [1, 2], Test.Pass>(),\n    check<T.Pop<[1, 2?, 3?]>, [1, 2?], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// PREPEND\n\nchecks([\n    check<T.Prepend<[0, 1, 2, 3?], 4>, [4, 0, 1, 2, 3?], Test.Pass>(),\n    check<T.Prepend<[0, 1, 2, 3], [4, 5?]>, [[4, 5?], 0, 1, 2, 3], Test.Pass>(),\n    check<T.Prepend<never, [4, 5]>, never, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// READONLY\n\nchecks([\n    check<T.Readonly<[0, 1, 2]>, readonly [0, 1, 2], Test.Pass>(),\n    check<T.Readonly<[0, 1, 2?]>, readonly [0, 1, 2?], Test.Pass>(),\n    check<T.Readonly<never>, never, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// READONLYKEYS\n\n// No test needed (same as O.ReadonlyKeys)\n\n// ---------------------------------------------------------------------------------------\n// REMOVE\n\nchecks([\n    check<T.Remove<[0, 1, 2], 1, 1>, [0, 2], Test.Pass>(),\n    check<T.Remove<[0, 1, 2?], 1, 1>, [0, 2 | undefined], Test.Pass>(),\n    check<T.Remove<[0, 1, 2], 0, 2>, [], Test.Pass>(),\n    check<T.Remove<[0, 1, 2?], -1, 10>, [], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// REPEAT\n\nchecks([\n    check<T.Repeat<1, 3>, [1, 1, 1], Test.Pass>(),\n    check<T.Repeat<1, never>, never, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// REPLACE\n\n// No test needed (same as O.Replace)\n\n// ---------------------------------------------------------------------------------------\n// REQUIRED\n\nchecks([\n    check<T.Required<[0, 1, 2?]>, [0, 1, 2], Test.Pass>(),\n    check<T.Required<[0, 1?, 2?]>, [0, 1, 2], Test.Pass>(),\n    check<T.Required<[0, 1, 2]>, [0, 1, 2], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// REVERSE\n\nchecks([\n    check<T.Reverse<[1, 2, 3]>, [3, 2, 1], Test.Pass>(),\n    check<T.Reverse<[1, 2, 3?]>, [3 | undefined, 2, 1], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// SELECT\n\ntype SELECT_T_NUMBER_EXTENDS = [\n    1,\n    2,\n    string | number,\n    number\n];\n\ntype SELECT_T_NUMBER_EQUALS = [\n    number\n];\n\nchecks([\n    check<T.Select<T, number, 'default'>, SELECT_T_NUMBER_EXTENDS, Test.Pass>(),\n    check<T.Select<T, number, 'extends->'>, SELECT_T_NUMBER_EXTENDS, Test.Pass>(),\n    check<T.Select<T, number, 'equals'>, SELECT_T_NUMBER_EQUALS, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// SELECTKEYS\n\n// No test needed (same as O.SelectKeys)\n\n// ---------------------------------------------------------------------------------------\n// SHORTEST\n\nchecks([\n    check<T.Shortest<T, T1>, T, Test.Pass>(),\n    check<T.Shortest<T1, T>, T, Test.Pass>(),\n    check<T.Shortest<[0], [1]>, [0], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// TAIL\n\nchecks([\n    check<T.Tail<[1, 2, 3?, 4?]>, [2, 3?, 4?], Test.Pass>(),\n    check<T.Tail<[]>, [], Test.Pass>(),\n    check<T.Tail<never>, never, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// TAKE\n\nchecks([\n    check<T.Take<[1, 2, 3?, 4?], 2, '->'>, [1, 2], Test.Pass>(),\n    check<T.Take<[1, 2, 3?, 4?], 2, '<-'>, [3?, 4?], Test.Pass>(), // nothing happens\n    check<T.Take<[1, 2, 3, 4], 2, '<-'>, [3, 4], Test.Pass>(), // nothing happens\n])\n\n// ---------------------------------------------------------------------------------------\n// TUPLE\n\n// Cannot be tested\n\n// ---------------------------------------------------------------------------------------\n// UNDEFINABLE\n\nchecks([\n    check<T.Undefinable<[0, 1, 2]>, [0 | undefined, 1 | undefined, 2 | undefined], Test.Pass>(),\n    check<T.Undefinable<[0, 1, 2], '2'>, [0, 1, 2 | undefined], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// UNDEFINABLEKEYS\n\n// No test needed (same as O.UndefinableKeys)\n\n// ---------------------------------------------------------------------------------------\n// LIST\n\nchecks([\n    check<T.List<string>, readonly string[], Test.Pass>(),\n    check<T.List<never>, readonly never[], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// UNIONIZE\n\nchecks([\n    check<T.Unionize<[2], string[]>, [2 | string | undefined], Test.Pass>(),\n    check<T.Unionize<string[], [2]>, Array<string | 2>, Test.Pass>(),\n    check<T.Unionize<[1], [2, 3]>, [1 | 2], Test.Pass>(),\n])\n\n// --------------------------------------------------------------------------------?-------\n// UNIONOF\n\nchecks([\n    check<T.UnionOf<[1, 2, 3?]>, 1 | 2 | 3 | undefined, Test.Pass>(),\n    check<T.UnionOf<[]>, never, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// UNNEST\n\n\nchecks([\n    check<T.UnNest<[[1], [2], [3, [4]]]>, [1, 2, 3, [4]], Test.Pass>(),\n    check<T.UnNest<number[][][] | number[]>, number[][] | number[], Test.Pass>(),\n    check<T.UnNest<any>, any[], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// UPDATE\n\nchecks([\n    check<T.Update<string[], number, A.x | 2>, Array<(string | 2)>, Test.Pass>(),\n    check<T.Update<[1], 0, 2>, [2], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// WRITABLE\n\ntype WRITABLE_W_T_ARR = ['a', 'b'];\ntype WRITABLE_R_T_ARR = readonly ['a', 'b'];\n\nchecks([\n    check<T.Writable<WRITABLE_W_T_ARR>, WRITABLE_W_T_ARR, Test.Pass>(),\n    check<T.Writable<WRITABLE_R_T_ARR>, WRITABLE_W_T_ARR, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// WRITABLEKEYS\n\n// No test needed (same as O.WritableKeys)\n\n// ---------------------------------------------------------------------------------------\n// ZIP\n\nchecks([\n    check<T.Zip<['a', 'b', 'c'], [1, 2, 3, 4]>, [['a', 1], ['b', 2], ['c', 3]], Test.Pass>(),\n    check<T.Zip<['a', 'b'], []>, [['a', undefined], ['b', undefined]], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// ZIPOBJ\n\nchecks([\n    check<T.ZipObj<['a', 'b', 'c'], [1, 2, 3, 4]>, {a: 1, b: 2, c: 3}, Test.Pass>(),\n    check<T.ZipObj<['a', 'b'], []>, {a: undefined, b: undefined}, Test.Pass>(),\n])\n"
  },
  {
    "path": "tests/Misc.ts",
    "content": "import {Test, M} from '../sources'\n\nconst {checks, check} = Test\n\n// ///////////////////////////////////////////////////////////////////////////////////////\n// MISC //////////////////////////////////////////////////////////////////////////////////\n\n// ---------------------------------------------------------------------------------------\n// JSON\n\nchecks([\n    check<M.JSON.Value, M.JSON.Value, Test.Pass>({\n        a: 'hello',\n        b: [\n            1,\n            {\n                c: '42',\n                d: [\n                    true,\n                    null,\n                ],\n            },\n        ],\n    }),\n])\n\n// ---------------------------------------------------------------------------------------\n// BUILTINOBJECT\n\n// Cannot be tested\n\n// ---------------------------------------------------------------------------------------\n// PRIMITIVE\n\n// Cannot be tested\n"
  },
  {
    "path": "tests/Number.ts",
    "content": "import {Test, N} from '../sources'\n\nconst {checks, check} = Test\n\n// ///////////////////////////////////////////////////////////////////////////////////////\n// NUMBER ////////////////////////////////////////////////////////////////////////////////\n\n// ---------------------------------------------------------------------------------------\n// ABSOLUTE\n\nchecks([\n    check<N.Absolute<0 | -1>, 0 | 1, Test.Pass>(),\n    check<N.Absolute<0>, 0, Test.Pass>(),\n    check<N.Absolute<10>, 10, Test.Pass>(),\n    check<N.Absolute<-10>, 10, Test.Pass>(),\n    check<N.Absolute<1000>, number, Test.Pass>(),\n    check<N.Absolute<number>, number, Test.Pass>(),\n    check<N.Absolute<any>, number, Test.Pass>(),\n    check<N.Absolute<never>, never, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// ADD\n\nchecks([\n    check<N.Add<9 | 8, 10 | 9>, 17 | 18 | 19, Test.Pass>(),\n    check<N.Add<9, 10>, 19, Test.Pass>(),\n    check<N.Add<21, 10>, 31, Test.Pass>(),\n    check<N.Add<-10, 10>, 0, Test.Pass>(),\n    check<N.Add<10, -10>, 0, Test.Pass>(),\n    check<N.Add<100, 10>, number, Test.Pass>(),\n    check<N.Add<number, 10>, number, Test.Pass>(),\n    check<N.Add<any, 10>, number, Test.Pass>(),\n    check<N.Add<never, 10>, never, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// GREATER\n\nchecks([\n    check<N.Greater<0 | 1, 0>, 0 | 1, Test.Pass>(),\n    check<N.Greater<9, 10>, 0, Test.Pass>(),\n    check<N.Greater<21, 13>, 1, Test.Pass>(),\n    check<N.Greater<-10, 10>, 0, Test.Pass>(),\n    check<N.Greater<1000, 10>, 0 | 1, Test.Pass>(),\n    check<N.Greater<number, 10>, 0 | 1, Test.Pass>(),\n    check<N.Greater<any, 10>, 0 | 1, Test.Pass>(),\n    check<N.Greater<never, 10>, never, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// GREATEREQ\n\nchecks([\n    check<N.GreaterEq<-1 | 1, 0>, 0 | 1, Test.Pass>(),\n    check<N.GreaterEq<9, 10>, 0, Test.Pass>(),\n    check<N.GreaterEq<21, 10>, 1, Test.Pass>(),\n    check<N.GreaterEq<-10, 10>, 0, Test.Pass>(),\n    check<N.GreaterEq<1000, 1000>, 1, Test.Pass>(),\n    check<N.GreaterEq<number, 10>, 0 | 1, Test.Pass>(),\n    check<N.GreaterEq<any, 10>, 0 | 1, Test.Pass>(),\n    check<N.GreaterEq<never, 10>, never, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// ISNEGATIVE\n\nchecks([\n    check<N.IsNegative<0 | -1>, 0 | 1, Test.Pass>(),\n    check<N.IsNegative<0>, 0, Test.Pass>(),\n    check<N.IsNegative<10>, 0, Test.Pass>(),\n    check<N.IsNegative<-10>, 1, Test.Pass>(),\n    check<N.IsNegative<1000>, 0 | 1, Test.Pass>(),\n    check<N.IsNegative<number>, 0 | 1, Test.Pass>(),\n    check<N.IsNegative<any>, 0 | 1, Test.Pass>(),\n    check<N.IsNegative<never>, never, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// ISPOSITIVE\n\nchecks([\n    check<N.IsPositive<-1 | 1>, 0 | 1, Test.Pass>(),\n    check<N.IsPositive<0>, 0, Test.Pass>(),\n    check<N.IsPositive<10>, 1, Test.Pass>(),\n    check<N.IsPositive<-10>, 0, Test.Pass>(),\n    check<N.IsPositive<1000>, 0 | 1, Test.Pass>(),\n    check<N.IsPositive<number>, 0 | 1, Test.Pass>(),\n    check<N.IsPositive<any>, 0 | 1, Test.Pass>(),\n    check<N.IsPositive<never>, never, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// ISZERO\n\nchecks([\n    check<N.IsZero<0 | -1>, 0 | 1, Test.Pass>(),\n    check<N.IsZero<0>, 1, Test.Pass>(),\n    check<N.IsZero<10>, 0, Test.Pass>(),\n    check<N.IsZero<-10>, 0, Test.Pass>(),\n    check<N.IsZero<1000>, 0 | 1, Test.Pass>(),\n    check<N.IsZero<number>, 0 | 1, Test.Pass>(),\n    check<N.IsZero<any>, 0 | 1, Test.Pass>(),\n    check<N.IsZero<never>, never, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// LOWER\n\nchecks([\n    check<N.Lower<-1 | 1, 0>, 0 | 1, Test.Pass>(),\n    check<N.Lower<10, 11>, 1, Test.Pass>(),\n    check<N.Lower<21, 20>, 0, Test.Pass>(),\n    check<N.Lower<-10, 10>, 1, Test.Pass>(),\n    check<N.Lower<1000, 10>, 0 | 1, Test.Pass>(),\n    check<N.Lower<number, 10>, 0 | 1, Test.Pass>(),\n    check<N.Lower<any, 10>, 0 | 1, Test.Pass>(),\n    check<N.Lower<never, 10>, never, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// LOWEREQ\n\nchecks([\n    check<N.LowerEq<0 | 1, 0>, 0 | 1, Test.Pass>(),\n    check<N.LowerEq<9, 10>, 1, Test.Pass>(),\n    check<N.LowerEq<21, 10>, 0, Test.Pass>(),\n    check<N.LowerEq<-10, 10>, 1, Test.Pass>(),\n    check<N.LowerEq<1000, 1000>, 1, Test.Pass>(),\n    check<N.LowerEq<number, 10>, 0 | 1, Test.Pass>(),\n    check<N.LowerEq<any, 10>, 0 | 1, Test.Pass>(),\n    check<N.LowerEq<never, 10>, never, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// NEGATE\n\nchecks([\n    check<N.Negate<0 | 1>, 0 | -1, Test.Pass>(),\n    check<N.Negate<9>, -9, Test.Pass>(),\n    check<N.Negate<21>, -21, Test.Pass>(),\n    check<N.Negate<-10>, 10, Test.Pass>(),\n    check<N.Negate<1000>, number, Test.Pass>(),\n    check<N.Negate<number>, number, Test.Pass>(),\n    check<N.Negate<any>, number, Test.Pass>(),\n    check<N.Negate<never>, never, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// RANGE\n\nchecks([\n    check<N.Range<-3, 5, '->'>, [-3, -2, -1, 0, 1, 2, 3, 4, 5], Test.Pass>(),\n    check<N.Range<-3, 5, '<-'>, [5, 4, 3, 2, 1, 0, -1, -2, -3], Test.Pass>(),\n    check<N.Range<0, 0, '->'>, [0], Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// SUB\n\nchecks([\n    check<N.Sub<9 | 8, 10 | 9>, -1 | -2 | 0, Test.Pass>(),\n    check<N.Sub<9, 10>, -1, Test.Pass>(),\n    check<N.Sub<21, 10>, 11, Test.Pass>(),\n    check<N.Sub<-10, 10>, -20, Test.Pass>(),\n    check<N.Sub<10, -10>, 20, Test.Pass>(),\n    check<N.Sub<1000, 10>, number, Test.Pass>(),\n    check<N.Sub<number, 10>, number, Test.Pass>(),\n    check<N.Sub<any, 10>, number, Test.Pass>(),\n    check<N.Sub<never, 10>, never, Test.Pass>(),\n])\n"
  },
  {
    "path": "tests/Object.ts",
    "content": "import {Test, O, A, T, U, M, F, S} from '../sources'\nimport {Key} from '../sources/Any/Key'\nimport {OptionalDeep} from '../sources/Object/Optional'\n\nconst {checks, check} = Test\n\n// ///////////////////////////////////////////////////////////////////////////////////////\n// OBJECT ////////////////////////////////////////////////////////////////////////////////\n\ntype O = {\n    a: string,\n    b: number;\n    c: {a: 'a'} & {b: 'b'};\n    d?: 'string0';\n    readonly e?: 'string1';\n    readonly f: 0;\n    g: O;\n    h?: 1;\n    j: 'a' | undefined;\n    k: {a: {b: string}};\n    x: () => 1;\n};\n\ntype O1 = {\n    a: string | number;\n    b: object;\n    c: {a: 'a'} & {b: 'b'};\n    d?: never;\n    readonly e?: 'string1';\n    readonly f: 0;\n    g: {};\n    h: never;\n    i: {a: string};\n    j: 'a' | undefined;\n    k: {a: {b: string, c: 0}};\n    l: [1, 2, 3];\n};\n\n// ---------------------------------------------------------------------------------------\n// ASSIGN\n\ntype O_ASSIGN = {readonly a: 1, c: 2};\ntype Os_ASSIGN = [{a: 2, readonly b: 1}, {a: 3, c?: 1}];\n\ntype ASSIGN_O_Os = {readonly a: 3, readonly b: 1, c: 1 | 2};\n\nchecks([\n    check<O.Assign<O_ASSIGN, Os_ASSIGN>, ASSIGN_O_Os, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// ATLEAST\n\ntype O_ATLEAST = {\n    a?: 1;\n    b?: 2;\n    c?: 3;\n    d: 4;\n} | {\n    e: 5;\n    f: 6;\n} | {\n    g?: 7;\n    h?: 8;\n};\n\ntype ATLEAST_O_ABF = {\n    a: 1;\n    b: 2;\n    c: 3;\n    d: 4;\n} | {\n    a: 1;\n    b?: 2;\n    c?: 3;\n    d?: 4;\n} | {\n    a?: 1;\n    b: 2;\n    c?: 3;\n    d?: 4;\n} | {\n    e: 5;\n    f: 6;\n} | {\n    e?: 5;\n    f: 6;\n} | {\n    g?: 7;\n    h?: 8;\n};\n\nchecks([\n    check<O.AtLeast<O_ATLEAST, 'a' | 'b' | 'f'>, ATLEAST_O_ABF, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// COMPULSORY\n\ntype COMPULSORY_O = {\n    a: string,\n    b: number;\n    c: {a: 'a'} & {b: 'b'};\n    d: 'string0';\n    readonly e: 'string1';\n    readonly f: 0;\n    g: O; // recursion\n    h: 1;\n    j: 'a';\n    k: {a: {b: string}};\n    x: () => 1;\n};\n\nchecks([\n    check<O.Compulsory<O>, COMPULSORY_O, Test.Pass>(),\n])\n\nfunction COMPULSORY_GENERIC<O extends {n?: number}>(o: O) {\n    const v0 = o as O.Compulsory<O, Key, 'flat'>\n    const v1 = o as O.Compulsory<O, Key, 'deep'>\n    const p0: number = v0.n\n    const p1: number = v1.n\n}\n\n// ---------------------------------------------------------------------------------------\n// COMPULSORYKEYS\n\ntype COMPULSORYKEYS_O = 'a' | 'b' | 'c' | 'f' | 'g' | 'k' | 'x';\n\nchecks([\n    check<O.CompulsoryKeys<O>, COMPULSORYKEYS_O, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// DIFF\n\ntype DIFF_O_O1_DEFAULT = {\n    i: {a: string};\n    l: [1, 2, 3];\n    x: () => 1;\n};\n\ntype DIFF_O_O1_EQUALS = {\n    a: string;\n    b: number;\n    d?: 'string0';\n    g: O;\n    h?: 1;\n    i: {a: string};\n    k: {a: {b: string}};\n    l: [1, 2, 3];\n    x: () => 1;\n};\n\nchecks([\n    check<O.Diff<O, O1, 'default'>, DIFF_O_O1_DEFAULT, Test.Pass>(),\n    check<O.Diff<O, O1, 'equals'>, DIFF_O_O1_EQUALS, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n\ntype DIFF_O1_O_DEFAULT = {\n    i: {a: string};\n    l: [1, 2, 3];\n    x: () => 1;\n};\n\ntype DIFF_O1_O_EQUALS = {\n    a: string | number;\n    b: object;\n    d?: never;\n    g: {};\n    h: never;\n    i: {a: string};\n    k: {a: {b: string, c: 0}};\n    l: [1, 2, 3];\n    x: () => 1;\n};\n\nchecks([\n    check<O.Diff<O1, O, 'default'>, DIFF_O1_O_DEFAULT, Test.Pass>(),\n    check<O.Diff<O1, O, 'equals'>, DIFF_O1_O_EQUALS, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// EITHER\n\ntype O_EITHER = {\n    a: string;\n    b?: number;\n    readonly c?: object;\n} | {\n    a: 'a',\n    b: 'b';\n};\n\ntype EITHER_O_AB_TRUE = {\n    a: string;\n    b?: undefined;\n    readonly c?: object;\n} | {\n    a?: undefined;\n    b?: number;\n    readonly c?: object;\n} | {\n    a: 'a';\n    b?: undefined;\n} | {\n    b: 'b';\n    a?: undefined;\n};\n\ntype EITHER_O_AB_FALSE = {\n    a: string;\n    readonly c?: object;\n} | {\n    b?: number;\n    readonly c?: object;\n} | {\n    a: 'a';\n} | {\n    b: 'b';\n};\n\nchecks([\n    check<O.Either<O_EITHER, 'a' | 'b'>, EITHER_O_AB_TRUE, Test.Pass>(),\n    check<O.Either<O_EITHER, 'a' | 'b', 0>, EITHER_O_AB_FALSE, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// EXCLUDE\n\ntype EXCLUDE_O_O1_DEFAULT = {\n    x: () => 1;\n};\n\ntype EXCLUDE_O_O1_EQUALS = {\n    a: string;\n    b: number;\n    d?: 'string0';\n    g: O;\n    h?: 1;\n    k: {a: {b: string}};\n    x: () => 1;\n};\n\nchecks([\n    check<O.Exclude<O, O1, 'default'>, EXCLUDE_O_O1_DEFAULT, Test.Pass>(),\n    check<O.Exclude<O, O1, 'equals'>, EXCLUDE_O_O1_EQUALS, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n\ntype EXCLUDE_O1_O_DEFAULT = {\n    i: {a: string};\n    l: [1, 2, 3];\n};\n\ntype EXCLUDE_O1_O_EQUALS = {\n    a: string | number;\n    b: object;\n    d?: never;\n    g: {};\n    h: never;\n    i: {a: string};\n    k: {a: {b: string, c: 0}};\n    l: [1, 2, 3];\n};\n\nchecks([\n    check<O.Exclude<O1, O, 'default'>, EXCLUDE_O1_O_DEFAULT, Test.Pass>(),\n    check<O.Exclude<O1, O, 'equals'>, EXCLUDE_O1_O_EQUALS, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// EXCLUDEKEYS\n\ntype EXCLUDEKEYS_O_DEFAULT = 'x';\n\ntype EXCLUDEKEYS_O_EQUALS = 'a' | 'b' | 'd' | 'g' | 'h' | 'k' | 'x';\n\nchecks([\n    check<O.ExcludeKeys<O, O1, 'default'>, EXCLUDEKEYS_O_DEFAULT, Test.Pass>(),\n    check<O.ExcludeKeys<O, O1, 'equals'>, EXCLUDEKEYS_O_EQUALS, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n\ntype EXCLUDEKEYS_O1_DEFAULT = 'i' | 'l';\n\ntype EXCLUDEKEYS_O1_EQUALS = 'a' | 'b' | 'd' | 'g' | 'h' | 'i' | 'k' | 'l';\n\nchecks([\n    check<O.ExcludeKeys<O1, O, 'default'>, EXCLUDEKEYS_O1_DEFAULT, Test.Pass>(),\n    check<O.ExcludeKeys<O1, O, 'equals'>, EXCLUDEKEYS_O1_EQUALS, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// FILTER\n\ntype FILTER_O_DEFAULT = {\n    b: number;\n    c: {a: 'a'} & {b: 'b'};\n    d?: 'string0';\n    readonly e?: 'string1';\n    readonly f: 0;\n    g: O;\n    h?: 1;\n    j: 'a' | undefined;\n    k: {a: {b: string}};\n    x: () => 1;\n};\n\ntype FILTER_O_EQUALS = {\n    b: number;\n    c: {a: 'a'} & {b: 'b'};\n    d?: 'string0';\n    readonly e?: 'string1';\n    readonly f: 0;\n    g: O;\n    h?: 1;\n    j: 'a' | undefined;\n    k: {a: {b: string}};\n    x: () => 1;\n};\n\nchecks([\n    check<O.Filter<O, string, 'extends->'>, FILTER_O_DEFAULT, Test.Pass>(),\n    check<O.Filter<O, string, 'equals'>, FILTER_O_EQUALS, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// FILTERKEYS\n\ntype FILTERKEYS_O_DEFAULT = 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'j' | 'k' | 'x';\n\ntype FILTERKEYS_O_EQUALS = 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'j' | 'k' | 'x';\n\nchecks([\n    check<O.FilterKeys<O, string, 'extends->'>, FILTERKEYS_O_DEFAULT, Test.Pass>(),\n    check<O.FilterKeys<O, string, 'equals'>, FILTERKEYS_O_EQUALS, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// HAS\n\nchecks([\n    check<O.Has<O, 'X', string | number, 'extends->'>, 0, Test.Pass>(),\n\n    check<O.Has<O, 'c', string, 'extends->'>, 0, Test.Pass>(),\n    check<O.Has<O, 'c', {a: 'a'} & {b: 'b'}, 'equals'>, 1, Test.Pass>(),\n\n    check<O.Has<O, 'd', string | undefined, 'extends->'>, 1, Test.Pass>(),\n    check<O.Has<O, 'd', 'string0' | undefined, 'equals'>, 1, Test.Pass>(),\n\n    check<O.Has<O, 'd', string, 'extends->'>, 0 | 1, Test.Pass>(),\n    check<O.Has<O, 'd', 'string0', 'equals'>, 0, Test.Pass>(),\n\n    check<O.Has<O, 'd', undefined, 'extends->'>, 0 | 1, Test.Pass>(),\n    check<O.Has<O, 'd', 'string0', 'equals'>, 0, Test.Pass>(),\n    check<O.Has<O1, 'a', string, 'extends->'>, 0 | 1, Test.Pass>(),\n\n    check<O.Has<O, 'f', 0 | undefined | 'a', 'extends->'>, 1, Test.Pass>(),\n    check<O.Has<O, 'f', 0 | undefined | 'a', 'equals'>, 0, Test.Pass>(),\n\n    check<O.Has<O, 'a' | 'd', string, 'extends->'>, 0 | 1, Test.Pass>(),\n\n    check<O.Has<O, 'a' | 'd', string | undefined, 'extends->'>, 1, Test.Pass>(),\n    check<O.Has<O, 'xx' | 'd', string | undefined, 'extends->'>, 1, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// HASPATH\n\nchecks([\n    check<O.HasPath<O, ['g', 'g', 'g'], object, 'extends->'>, 1, Test.Pass>(),\n    check<O.HasPath<O, ['g', 'g', 'g'], O, 'equals'>, 1, Test.Pass>(),\n\n    check<O.HasPath<O, ['g', 'g', 'g', 'a'], string, 'extends->'>, 1, Test.Pass>(),\n    check<O.HasPath<O, ['g', 'x', 'g'], object, 'extends->'>, 0, Test.Pass>(),\n\n    check<O.HasPath<O, [], any, 'extends->'>, 1, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// INCLUDES\n\nchecks([\n    check<O.Includes<O, 'xxxx', 'extends->'>, 0, Test.Pass>(),\n    check<O.Includes<O, 'xxxx', 'equals'>, 0, Test.Pass>(),\n\n    check<O.Includes<O, string, 'extends->'>, 1, Test.Pass>(),\n    check<O.Includes<O, string, 'equals'>, 1, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// INTERSECT\n\ntype INTERSECT_O_O1_DEFAULT = O.Omit<O, 'x'>;\n\ntype INTERSECT_O_O1_EQUALS = {\n    c: {a: 'a'} & {b: 'b'};\n    readonly e?: 'string1';\n    readonly f: 0;\n    j: 'a' | undefined;\n};\n\nchecks([\n    check<O.Intersect<O, O1, 'default'>, INTERSECT_O_O1_DEFAULT, Test.Pass>(),\n    check<O.Intersect<O, O1, 'equals'>, INTERSECT_O_O1_EQUALS, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// INTERSECTKEYS\n\ntype INTERSECTKEYS_O_DEFAULT = U.Exclude<keyof O, 'x'>;\n\ntype INTERSECTKEYS_O_EQUALS = 'c' | 'e' | 'f' | 'j';\n\nchecks([\n    check<O.IntersectKeys<O, O1, 'default'>, INTERSECTKEYS_O_DEFAULT, Test.Pass>(),\n    check<O.IntersectKeys<O, O1, 'equals'>, INTERSECTKEYS_O_EQUALS, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// INVERT\n\nconst INVERT_SYM = Symbol('')\nconst INVERT_SYM2 = Symbol('')\n\ntype O_INVERT_T1 = {\n    A: 'Av';\n    B: typeof INVERT_SYM;\n    C: 42;\n};\n\ntype O_INVERT_T2 = O_INVERT_T1 | {\n    Af: 'Avf';\n    Bf: typeof INVERT_SYM2;\n    Cf: 43;\n};\n\ntype T1_INVERT_O = {\n    Av: 'A';\n    [INVERT_SYM]: 'B';\n    42: 'C';\n};\n\ntype T2_INVERT_O = {\n    Av: 'A';\n    [INVERT_SYM]: 'B';\n    42: 'C';\n} | {\n    Avf: 'Af';\n    [INVERT_SYM2]: 'Bf';\n    43: 'Cf';\n};\n\ninterface O_INVERT_I1 {\n    A: 'Av';\n    B: typeof INVERT_SYM;\n    C: 42;\n}\n\ninterface O_INVERT_I2 {\n    Af: 'Avf';\n    Bf: typeof INVERT_SYM2;\n    Cf: 43;\n}\n\ninterface I1_INVERT_O {\n    Av: 'A';\n    [INVERT_SYM]: 'B';\n    42: 'C';\n}\n\ninterface I2_INVERT_O {\n    Avf: 'Af';\n    [INVERT_SYM2]: 'Bf';\n    43: 'Cf';\n}\n\nchecks([\n    check<O.Invert<O_INVERT_T1>, T1_INVERT_O, Test.Pass>(),\n    check<O.Invert<O_INVERT_T2>, T2_INVERT_O, Test.Pass>(),\n    check<O.Invert<O_INVERT_I1>, T1_INVERT_O, Test.Pass>(),\n    check<O.Invert<O_INVERT_I1>, I1_INVERT_O, Test.Pass>(),\n    check<O.Invert<O_INVERT_I1 | O_INVERT_I2>, T2_INVERT_O, Test.Pass>(),\n    check<O.Invert<O_INVERT_I1 | O_INVERT_I2>, I1_INVERT_O | I2_INVERT_O, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// LISTOF\n\ntype O_LISTOF_INDEX = {\n    '0': 1;\n    '2': 3;\n    '3': never;\n    '5': 5;\n    '6': 6;\n};\n\ntype O_LISTOF_NUMBER = {\n    [K in number]: 42\n};\n\ntype O_LISTOF_STRING = {\n    [K in string]: 42\n};\n\ntype O_LISTOF_SYMBOL = {\n    [K in symbol]: 42\n};\n\ntype LISTOF_INDEX_O = [1, 3, never, 5, 6];\ntype LISTOF_NUMBER_O = 42[];\ntype LISTOF_STRING_O = 42[];\ntype LISTOF_SYMBOL_O = unknown[];\n\nchecks([\n    check<O.ListOf<O_LISTOF_INDEX>, LISTOF_INDEX_O, Test.Pass>(),\n    check<O.ListOf<O_LISTOF_NUMBER>, LISTOF_NUMBER_O, Test.Pass>(),\n    check<O.ListOf<O_LISTOF_STRING>, LISTOF_STRING_O, Test.Pass>(),\n    check<O.ListOf<O_LISTOF_SYMBOL>, LISTOF_SYMBOL_O, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// MERGE\n\ntype O_MERGE = {\n    a?: string;\n    c: {\n        a?: string;\n        b?: number;\n   } | Date;\n    d: 'hello' | undefined;\n    e: number | {a: 1};\n    f?: {\n        a: string;\n        b?: number;\n   },\n    g?: {\n        a?: string;\n        b?: number;\n   };\n    h: {\n        a: number;\n        b: number;\n   } | undefined;\n    i: {\n        a: string;\n   } | undefined;\n    j: {\n        a: {\n            b?: {};\n       };\n   },\n    k?: {[k: string]: string};\n    l: [{a: 'a'}];\n    n: 42;\n};\n\ntype O1_MERGE = {\n    a: object | undefined;\n    b: number;\n    c: {\n        a: object;\n        b?: object;\n        c: object;\n   };\n    d: 'goodbye';\n    e: string | {b: 2};\n    f?: {\n        a: object;\n        b?: object;\n        c: object;\n   };\n    h: {\n        a: string;\n   };\n    i: {\n        a: number;\n   } | undefined;\n    j?: {\n        a: {\n            b?: {\n                c: 1;\n           };\n       };\n   };\n    k: {} | Date;\n    l: [{b: 'b'}, 2, 3];\n    m: [];\n};\n\ntype MERGE_O_O1_LODASH = {\n    a: string | object | undefined;\n    b: number;\n    c: {\n        a?: string;\n        b?: number;\n   } | Date;\n    d: 'hello' | 'goodbye';\n    e: number | {a: 1};\n    f?: {\n        a: string;\n        b?: number;\n   } | {\n        a: object;\n        b?: object;\n        c: object;\n   },\n    g?: {\n        a?: string;\n        b?: number;\n   };\n    h: {\n        a: number;\n        b: number;\n   } | {\n        a: string;\n   };\n    i: {\n        a: string;\n   } | {\n        a: number;\n   } | undefined;\n    j: {\n        a: {\n            b?: {};\n       };\n   },\n    k: {} | {[k: string]: string} | Date;\n    l: [{a: 'a'}];\n    m: [];\n    n: 42;\n};\n\ntype MERGE_O_O1_DEEP_LODASH = {\n    a: string | object | undefined;\n    b: number;\n    c: {\n        a: string | object;\n        b?: number | object;\n        c: object;\n   } | Date;\n    d: 'hello' | 'goodbye';\n    e: number | {a: 1} | {a: 1, b: 2};\n    f?: {\n        a: string;\n        b?: number | undefined;\n   } | {\n        a: object;\n        b?: object | undefined;\n        c: object;\n   } | {\n        a: string;\n        b?: number | object | undefined;\n        c: object;\n   } | undefined;\n    g?: {\n        a?: string;\n        b?: number;\n   };\n    h: {\n        a: number;\n        b: number;\n   } | {\n        a: string;\n   };\n    i: {\n        a: string;\n   } | {\n        a: number;\n   } | undefined;\n    j: {\n        a: {\n            b?: {} | {\n                c: 1;\n           };\n       };\n   } | {\n        a: {\n            b?: {};\n       };\n   },\n    k: {} | {[k: string]: string} | {[x: string]: string | undefined} | Date;\n    l: [{a: 'a', b: 'b'}, 2, 3];\n    m: [];\n    n: 42;\n};\n\nchecks([\n    check<O.Merge<[1], [2, 3], 'flat'>, [1, 3], Test.Pass>(),\n    check<O.Merge<[1], [2, 3], 'deep'>, [1, 3], Test.Pass>(),\n    check<O.Merge<O_MERGE, O1_MERGE, 'flat', M.BuiltIn, undefined>, MERGE_O_O1_LODASH, Test.Pass>(),\n    check<O.Merge<O_MERGE, O1_MERGE, 'deep', M.BuiltIn, undefined>, MERGE_O_O1_DEEP_LODASH, Test.Pass>(),\n])\n\nfunction MERGE_GENERIC<O extends {n?: number}>(o: O) {\n    const v0 = o as O.Merge<O, {n: string}, 'flat'>\n    const v1 = o as O.Merge<O, {n: string}, 'deep'>\n    const p0: string | number = v0.n\n    const p1: string | number = v1.n\n}\n\n// ---------------------------------------------------------------------------------------\n// MERGEALL\n\nchecks([\n    check<O.MergeAll<{}, [O_MERGE, O1_MERGE], 'flat', M.BuiltIn, undefined>, MERGE_O_O1_LODASH, Test.Pass>(),\n    check<O.MergeAll<{}, [O_MERGE, O1_MERGE], 'deep', M.BuiltIn, undefined>, MERGE_O_O1_DEEP_LODASH, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// MODIFY\n\nchecks([\n    check<O.Modify<{a?: string}, {a: A.x, b: 9}>, {a: string, b: 9}, Test.Pass>(),\n    check<O.Modify<{}, {a: A.x, b: 9}>, {a: never, b: 9}, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// NONNULLABLE\n\ntype NONNULLABLE_O_FLAT = {\n    a: string;\n    b: number;\n    c: {a: 'a'} & {b: 'b'};\n    d?: 'string0';\n    readonly e?: 'string1';\n    readonly f: 0;\n    g: O;\n    h?: 1;\n    j: 'a';\n    k: {a: {b: string}};\n    x: () => 1;\n};\n\ntype NONNULLABLE_O_J_FLAT = {\n    a: string;\n    b: number;\n    c: {a: 'a'} & {b: 'b'};\n    d?: 'string0';\n    readonly e?: 'string1';\n    readonly f: 0;\n    g: O;\n    h?: 1;\n    j: 'a';\n    k: {a: {b: string}};\n    x: () => 1;\n};\n\nchecks([\n    check<O.NonNullable<O, keyof O, 'flat'>, NONNULLABLE_O_FLAT, Test.Pass>(),\n    check<O.NonNullable<O, 'j', 'flat'>, NONNULLABLE_O_J_FLAT, Test.Pass>(),\n    check<O.Path<O.NonNullable<O, 'g', 'deep'>, ['g', 'g']>, O.NonNullable<O, keyof O, 'deep'>, Test.Pass>(),\n])\n\nfunction NONNULLABLE_GENERIC<O extends {n: number[] | undefined}>(o: O) {\n    const v0 = o as O.NonNullable<O, Key, 'flat'>\n    const v1 = o as O.NonNullable<O, Key, 'deep'>\n    const p0: number[] = v0.n\n    const p1: number[] = v1.n\n}\n\n// ---------------------------------------------------------------------------------------\n// NONNULLABLEKEYS\n\nchecks([\n    check<O.NonNullableKeys<O>, 'a' | 'b' | 'c' | 'f' | 'g' | 'k' | 'x', Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// NULLABLE\n\ntype NULLABLE_O_FLAT = {\n    a: string | undefined | null;\n    b: number | undefined | null;\n    c: {a: 'a'} & {b: 'b'} | undefined | null;\n    d?: 'string0' | null;\n    readonly e?: 'string1' | null;\n    readonly f: 0 | undefined | null;\n    g: O | undefined | null;\n    h?: 1 | null;\n    j: 'a' | undefined | null;\n    k: {a: {b: string}} | undefined | null;\n    x: (() => 1) | undefined | null;\n};\n\ntype NULLABLE_O_A_FLAT = {\n    a: string | undefined | null;\n    b: number;\n    c: {a: 'a'} & {b: 'b'};\n    d?: 'string0';\n    readonly e?: 'string1';\n    readonly f: 0;\n    g: O;\n    h?: 1;\n    j: 'a' | undefined;\n    k: {a: {b: string}};\n    x: () => 1;\n};\n\nchecks([\n    check<O.Nullable<O, keyof O, 'flat'>, NULLABLE_O_FLAT, Test.Pass>(),\n    check<O.Nullable<O, 'a', 'flat'>, NULLABLE_O_A_FLAT, Test.Pass>(),\n    check<O.Path<O.Nullable<O, 'g', 'deep'>, ['g', 'g']>, O.Nullable<O, keyof O, 'deep'> | undefined | null, Test.Pass>(),\n])\n\nfunction NULLABLE_GENERIC<O extends {n: number[]}>(o: O) {\n    const v0 = o as O.Nullable<O, Key, 'flat'>\n    const v1 = o as O.Nullable<O, Key, 'deep'>\n    const p0: number[] | undefined | null = v0.n\n    const p1: (number | undefined | null)[] | null | undefined = v1.n\n}\n\n// ---------------------------------------------------------------------------------------\n// NULLABLEKEYS\n\nchecks([\n    check<O.NullableKeys<O>, 'd' | 'e' | 'h' | 'j', Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// OBJECT\n\n// Cannot be tested\n\n// ---------------------------------------------------------------------------------------\n// OMIT\n\ntype OMIT_O_DEH = {\n    a: string;\n    b: number;\n    c: {a: 'a'} & {b: 'b'};\n    readonly f: 0;\n    g: O;\n    j: 'a' | undefined;\n    k: {a: {b: string}};\n    x: () => 1;\n};\n\nchecks([\n    check<O.Omit<O, 'd' | 'e' | 'h'>, OMIT_O_DEH, Test.Pass>(),\n    check<O.Omit<O, keyof O>, {}, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// OPTIONAL\n\ntype OPTIONAL_O_FLAT = {\n    a?: string,\n    b?: number;\n    c?: {a: 'a'} & {b: 'b'};\n    d?: 'string0';\n    readonly e?: 'string1';\n    readonly f?: 0;\n    g?: O;\n    h?: 1;\n    j?: 'a';\n    k?: {a: {b: string}};\n    x?: () => 1;\n};\n\ntype OPTIONAL_O_A_FLAT = {\n    a?: string;\n    b: number;\n    c: {a: 'a'} & {b: 'b'};\n    d?: 'string0';\n    readonly e?: 'string1';\n    readonly f: 0;\n    g: O;\n    h?: 1;\n    j: 'a' | undefined;\n    k: {a: {b: string}};\n    x: () => 1;\n};\n\nchecks([\n    check<O.Optional<O, keyof O, 'flat'>, OPTIONAL_O_FLAT, Test.Pass>(),\n    check<O.Optional<O, 'a', 'flat'>, OPTIONAL_O_A_FLAT, Test.Pass>(),\n    check<O.Path<O.Optional<O, 'g', 'deep'>, ['g', 'g']>, O.Optional<O, keyof O, 'deep'> | undefined, Test.Pass>(),\n])\n\nfunction OPTIONAL_GENERIC<O extends {values: number[]}>(o: O) {\n    let v0 = o as O.Optional<O, Key, 'flat'>\n    let v1 = o as O.Optional<O, Key, 'deep'>\n\n    const p0: number[] | undefined = v0.values\n    const p1: OptionalDeep<O['values']> | undefined = v1.values\n\n    v0 = {}\n    v1 = {}\n}\n\n// ---------------------------------------------------------------------------------------\n// PARTIAL\n\ntype PARTIAL_O_FLAT = {\n    a?: string,\n    b?: number;\n    c?: {a: 'a'} & {b: 'b'};\n    d?: 'string0';\n    readonly e?: 'string1';\n    readonly f?: 0;\n    g?: O;\n    h?: 1;\n    j?: 'a';\n    k?: {a: {b: string}};\n    x?: () => 1;\n};\n\nchecks([\n    check<O.Partial<O, 'flat'>, PARTIAL_O_FLAT, Test.Pass>(),\n    check<O.Path<O.Partial<O, 'deep'>, ['g', 'g']>, O.Partial<O, 'deep'> | undefined, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// OPTIONALKEYS\n\nchecks([\n    check<O.OptionalKeys<O>, 'd' | 'e' | 'h', Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// OVERWRITE\n\nchecks([\n    check<O.Overwrite<{a: string}, {a: number, b: any}>, {a: number}, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// PATCH\n\ntype PATCH_O_O1 = {\n    a: string;\n    b: number;\n    c: {a: 'a'} & {b: 'b'};\n    d?: 'string0';\n    readonly e?: 'string1';\n    readonly f: 0;\n    g: O;\n    h?: 1;\n    i: {a: string};\n    j: 'a' | undefined;\n    k: {a: {b: string}};\n    l: [1, 2, 3];\n    x: () => 1;\n};\n\ntype PATCH_O1_O = {\n    a: string | number;\n    b: object;\n    c: {a: 'a'} & {b: 'b'};\n    d?: never;\n    readonly e?: 'string1';\n    readonly f: 0;\n    g: {};\n    h: never;\n    i: {a: string};\n    j: 'a' | undefined;\n    k: {a: {b: string, c: 0}};\n    l: [1, 2, 3];\n    x: () => 1;\n};\n\ntype PATCH_O_O1_DEEP = {\n    a: string;\n    b: number;\n    c: {a: 'a', b: 'b'};\n    d?: 'string0';\n    readonly e?: 'string1';\n    readonly f: 0;\n    g: O;\n    h?: 1;\n    i: {a: string};\n    j: 'a' | undefined;\n    k: {a: {b: string, c: 0}};\n    l: [1, 2, 3];\n    x: () => 1;\n};\n\nchecks([\n    check<O.Patch<O, O1>, PATCH_O_O1, Test.Pass>(),\n    check<O.Patch<O1, O>, PATCH_O1_O, Test.Pass>(),\n    check<O.Patch<O, O1, 'deep'>, PATCH_O_O1_DEEP, Test.Pass>(),\n])\n\nfunction PATCH_GENERIC<O extends {n: number}>(o: O) {\n    const v0 = o as O.Patch<O, {a: string}, 'flat'>\n    const v1 = o as O.Patch<O, {a: string}, 'deep'>\n    const p0n: number = v0.n\n    const p1n: number = v1.n\n    const p0a: string = v0.a\n    const p1a: string = v1.a\n}\n\n// ---------------------------------------------------------------------------------------\n// PATCHALL\n\nchecks([\n    check<O.PatchAll<{}, [O, O1]>, PATCH_O_O1, Test.Pass>(),\n    check<O.PatchAll<{}, [O, O1], 'deep'>, PATCH_O_O1_DEEP, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// PATH\n\nchecks([\n    check<O.Path<O, ['g', 'g', 'g']>, O['g'], Test.Pass>(),\n    check<O.Path<O, ['g', 'g', 'g', 'a']>, string, Test.Pass>(),\n    check<O.Path<O, ['g', 'x', 'g']>, undefined, Test.Pass>(),\n    // check<O.Path<O, []>, undefined, Test.Pass>(),\n    check<O.Path<O, ['d']>, 'string0' | undefined, Test.Pass>(),\n])\n\ntype O_PATH_U = {\n    b: {\n        c: {\n            d: 'bcd';\n        };\n        b: 'bb';\n    };\n    c: 1;\n} | {\n    a: {\n        b: boolean | {\n            c: 'abc';\n        };\n    };\n    c: 2;\n};\n\nchecks([\n    check<O.Path<O_PATH_U, ['c']>, 1 | 2, Test.Pass>(),\n    check<O.Path<O_PATH_U, ['b', 'c', 'x']>, undefined, Test.Pass>(),\n    check<O.Path<O_PATH_U, ['b', 'c', 'd']>, 'bcd' | undefined, Test.Pass>(),\n    check<O.Path<O_PATH_U, ['a', 'b', 'c']>, 'abc' | undefined, Test.Pass>(),\n    check<O.Path<O_PATH_U, ['a' | 'b', 'b']>, boolean | 'bb' | {c: 'abc'} | undefined, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// PATHS\n\ntype O_PATHS = {\n    a: {\n        a: boolean;\n    };\n    b: {\n        a: {\n            a: {};\n        };\n        b: {};\n    };\n} | {\n    c: boolean\n};\n\nchecks([\n    check<O.Paths<{'prop': {a: 1}[]}>, T.NonNullable<['prop'?, number?, 'a'?]>, Test.Pass>(),\n    check<O.Paths<O_PATHS>, T.NonNullable<['a'?, 'a'?] | ['b'?, 'a'?, 'a'?] | ['b'?, 'b'?] | ['c'?]>, Test.Pass>(),\n    check<O.Paths<O[]>, O.Paths<O[]>, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// PICK\n\ntype PICK_O_DEF = {\n    d?: 'string0';\n    readonly e?: 'string1';\n    readonly f: 0;\n};\n\nchecks([\n    check<O.Pick<O, 'd' | 'e' | 'f'>, PICK_O_DEF, Test.Pass>(),\n    check<O.Pick<O, keyof O>, O, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// READONLY\n\ntype READONLY_O_FLAT = {\n    readonly a: string,\n    readonly b: number;\n    readonly c: {a: 'a'} & {b: 'b'};\n    readonly d?: 'string0';\n    readonly e?: 'string1';\n    readonly f: 0;\n    readonly g: O;\n    readonly h?: 1;\n    readonly j: 'a' | undefined;\n    readonly k: {a: {b: string}};\n    readonly x: () => 1;\n};\n\ntype READONLY_O_A_FLAT = {\n    readonly a: string,\n    b: number;\n    c: {a: 'a'} & {b: 'b'};\n    d?: 'string0';\n    readonly e?: 'string1';\n    readonly f: 0;\n    g: O;\n    h?: 1;\n    j: 'a' | undefined;\n    k: {a: {b: string}};\n    x: () => 1;\n};\n\nchecks([\n    check<O.Readonly<O, keyof O, 'flat'>, READONLY_O_FLAT, Test.Pass>(),\n    check<O.Readonly<O, 'a', 'flat'>, READONLY_O_A_FLAT, Test.Pass>(),\n    check<O.Path<O.Readonly<O, 'g', 'deep'>, ['g', 'g']>, O.Readonly<O, keyof O, 'deep'>, Test.Pass>(),\n])\n\nfunction READONLY_GENERIC<O extends {n?: number[]}>(o: O) {\n    const v0 = o as O.Readonly<O, Key, 'flat'>\n    const v1 = o as O.Readonly<O, Key, 'deep'>\n    const p0: number[] | undefined = v0.n\n    const p1: readonly number[] | undefined = v1.n\n\n    // @ts-expect-error\n    v0.n = 1\n    // @ts-expect-error\n    v1.n = 1\n}\n\n// ---------------------------------------------------------------------------------------\n// READONLYKEYS\n\nchecks([\n    check<O.ReadonlyKeys<O>, 'e' | 'f', Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// RECORD\n\ntype RECORD_AB_A_OPTR = {\n    readonly a?: string;\n    readonly b?: string;\n};\n\ntype RECORD_AB_A_OPTW = {\n    a?: string;\n    b?: string;\n};\n\ntype RECORD_AB_A_REQR = {\n    readonly a: string;\n    readonly b: string;\n};\n\ntype RECORD_AB_A_REQW = {\n    a: string;\n    b: string;\n};\n\nchecks([\n    check<O.Record<'a' | 'b', string, ['?', 'R']>, RECORD_AB_A_OPTR, Test.Pass>(),\n    check<O.Record<'a' | 'b', string, ['?', 'W']>, RECORD_AB_A_OPTW, Test.Pass>(),\n    check<O.Record<'a' | 'b', string, ['!', 'R']>, RECORD_AB_A_REQR, Test.Pass>(),\n    check<O.Record<'a' | 'b', string, ['!', 'W']>, RECORD_AB_A_REQW, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// REPLACE\n\ntype REPLACE_STRING_NUMBER = {\n    a: number;\n    b: number;\n    c: {a: 'a'} & {b: 'b'};\n    d?: 'string0';\n    readonly e?: 'string1';\n    readonly f: 0;\n    g: O;\n    h?: 1;\n    j: 'a' | undefined;\n    k: {\n        a: {\n            b: string;\n       };\n   };\n    x: () => 1;\n};\n\nchecks([\n    check<O.Replace<O, string, number>, REPLACE_STRING_NUMBER, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// REQUIRED\n\ntype REQUIRED_O_FLAT = {\n    a: string,\n    b: number;\n    c: {a: 'a'} & {b: 'b'};\n    d: 'string0';\n    readonly e: 'string1';\n    readonly f: 0;\n    g: O;\n    h: 1;\n    j: 'a' | undefined;\n    k: {a: {b: string}};\n    x: () => 1;\n};\n\ntype REQUIRED_O_D_FLAT = {\n    a: string,\n    b: number;\n    c: {a: 'a'} & {b: 'b'};\n    d: 'string0';\n    readonly e?: 'string1';\n    readonly f: 0;\n    g: O;\n    h?: 1;\n    j: 'a' | undefined;\n    k: {a: {b: string}};\n    x: () => 1;\n};\n\nchecks([\n    check<O.Required<O, keyof O, 'flat'>, REQUIRED_O_FLAT, Test.Pass>(),\n    check<O.Required<O, 'd', 'flat'>, REQUIRED_O_D_FLAT, Test.Pass>(),\n    check<O.Path<O.Required<O, 'g', 'deep'>, ['g', 'g']>, O.Required<O, keyof O, 'deep'>, Test.Pass>(),\n])\n\nfunction REQUIRED_GENERIC<O extends {n?: number[]}>(o: O) {\n    const v0 = o as O.Required<O, Key, 'flat'>\n    const v1 = o as O.Required<O, Key, 'deep'>\n    const p0: number[] = v0.n\n    const p1: number[] = v1.n\n}\n\n// ---------------------------------------------------------------------------------------\n// REQUIREDKEYS\n\nchecks([\n    check<O.RequiredKeys<O>, 'a' | 'b' | 'c' | 'f' | 'g' | 'j' | 'k' | 'x', Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// SELECT\n\ntype SELECT_O_DEFAULT = {\n    a: string;\n    d?: 'string0';\n    readonly e?: 'string1';\n    j: 'a' | undefined;\n};\n\ntype SELECT_O_EQUALS = {\n    a: string,\n};\n\nchecks([\n    check<O.Select<O, string, 'extends->'>, SELECT_O_DEFAULT, Test.Pass>(),\n    check<O.Select<O, string, 'equals'>, SELECT_O_EQUALS, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// SELECTKEYS\n\ntype SELECTKEYS_O_DEFAULT = 'a' | 'd' | 'e' | 'j';\n\ntype SELECTKEYS_O_EQUALS = 'a';\n\nchecks([\n    check<O.SelectKeys<O, string, 'extends->'>, SELECTKEYS_O_DEFAULT, Test.Pass>(),\n    check<O.SelectKeys<O, string, 'equals'>, SELECTKEYS_O_EQUALS, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// UNDEFINABLE\n\ntype UNDEFINABLE_O_FLAT = {\n    a: string | undefined;\n    b: number | undefined;\n    c: {a: 'a'} & {b: 'b'} | undefined;\n    d?: 'string0';\n    readonly e?: 'string1';\n    readonly f: 0 | undefined;\n    g: O | undefined;\n    h?: 1;\n    j: 'a' | undefined;\n    k: {a: {b: string}} | undefined;\n    x: (() => 1) | undefined;\n};\n\ntype UNDEFINABLE_O_A_FLAT = {\n    a: string | undefined;\n    b: number;\n    c: {a: 'a'} & {b: 'b'};\n    d?: 'string0';\n    readonly e?: 'string1';\n    readonly f: 0;\n    g: O;\n    h?: 1;\n    j: 'a' | undefined;\n    k: {a: {b: string}};\n    x: () => 1;\n};\n\nchecks([\n    check<O.Undefinable<O, keyof O, 'flat'>, UNDEFINABLE_O_FLAT, Test.Pass>(),\n    check<O.Undefinable<O, 'a', 'flat'>, UNDEFINABLE_O_A_FLAT, Test.Pass>(),\n    check<O.Path<O.Undefinable<O, 'g', 'deep'>, ['g', 'g']>, O.Undefinable<O, keyof O, 'deep'> | undefined, Test.Pass>(),\n])\n\nfunction UNDEFINABLE_GENERIC<O extends {n: number}>(o: O) {\n    const v0 = o as O.Required<O, Key, 'flat'>\n    const v1 = o as O.Required<O, Key, 'deep'>\n    const p0: number | undefined = v0.n\n    const p1: number | undefined = v1.n\n}\n\n// ---------------------------------------------------------------------------------------\n// UNDEFINABLEKEYS\n\nchecks([\n    check<O.UndefinableKeys<O>, 'd' | 'e' | 'h' | 'j', Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// UNIONIZE\n\ntype O_UNIONIZE = {\n    a: 'a';\n    b: 'b';\n    c: never;\n    d?: 1;\n};\n\ntype O1_UNIONIZE = {\n    a: 'b';\n    b?: 'x';\n    c: 42;\n    d: {};\n};\n\ntype UNIONIZE_O_O1 = {\n    a: 'a' | 'b';\n    b: 'b' | 'x' | undefined;\n    c: 42;\n    d?: {} | 1;\n};\n\nchecks([\n    check<O.Unionize<O_UNIONIZE, O1_UNIONIZE>, UNIONIZE_O_O1, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// UNIONOF\n\ntype O_UNIONOF = {\n    a: 'a';\n    b: 'b';\n    c: never;\n    d: 1;\n};\n\ntype UNIONOF_O = 'a' | 'b' | 1;\n\nchecks([\n    check<O.UnionOf<O_UNIONOF>, UNIONOF_O, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// UPDATE\n\ntype O_UPDATE = {\n    a?: 'a';\n};\n\ntype UPDATE_O = {\n    a?: 'xxxx';\n};\n\ntype UPDATE_O_X = {\n    a?: 'a';\n};\n\ntype UPDATE_O_STRING_42 = {\n    [x: string]: 42;\n    // @ts-ignore\n    a?: 42 | undefined;\n};\n\nchecks([\n    check<O.Update<O_UPDATE, 'a' | 'b', 'xxxx'>, UPDATE_O, Test.Pass>(),\n    check<O.Update<O_UPDATE, 'a' | 'b', A.x>, UPDATE_O_X, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// WRITABLE\n\ntype WRITABLE_O_FLAT = {\n    a: string,\n    b: number;\n    c: {a: 'a'} & {b: 'b'};\n    d?: 'string0';\n    e?: 'string1';\n    f: 0;\n    g: O;\n    h?: 1;\n    j: 'a' | undefined;\n    k: {a: {b: string}};\n    x: () => 1;\n};\n\ntype WRITABLE_O_E_FLAT = {\n    a: string,\n    b: number;\n    c: {a: 'a'} & {b: 'b'};\n    d?: 'string0';\n    e?: 'string1';\n    readonly f: 0;\n    g: O;\n    h?: 1;\n    j: 'a' | undefined;\n    k: {a: {b: string}};\n    x: () => 1;\n};\n\nchecks([\n    check<O.Writable<O, keyof O, 'flat'>, WRITABLE_O_FLAT, Test.Pass>(),\n    check<O.Writable<O, 'e', 'flat'>, WRITABLE_O_E_FLAT, Test.Pass>(),\n    check<O.Path<O.Writable<O, 'g', 'deep'>, ['g', 'g']>, O.Writable<O, keyof O, 'deep'>, Test.Pass>(),\n])\n\nfunction WRITABLE_GENERIC<O extends {readonly n: number}>(o: O) {\n    const v0 = o as O.Writable<O, Key, 'flat'>\n    const v1 = o as O.Writable<O, Key, 'deep'>\n    const p0: number = v0.n\n    const p1: number = v1.n\n\n    v0.n = 1\n    v1.n = 1\n}\n\n// ---------------------------------------------------------------------------------------\n// WRITABLEKEYS\n\nchecks([\n    check<O.WritableKeys<O>, 'a' | 'b' | 'c' | 'd' | 'g' | 'h' | 'j' | 'k' | 'x', Test.Pass>(),\n])\n\n// ///////////////////////////////////////////////////////////////////////////////////////\n// OBJECT.P //////////////////////////////////////////////////////////////////////////////\n\ntype OP = {// A binary tree\n    a: {\n        a: string;\n        b: {\n            a: 'aba';\n            b: 'abb';\n       };\n   };\n    b?: {\n        a: {\n            a: 'baa';\n            b: 'bab';\n       };\n        b: {\n            a: 'bba';\n            b: 'bbb';\n       };\n   };\n    c?: string;\n};\n\ntype OP_UNIONS = {\n    a: {\n        a: string;\n        b: {\n            a: 'aba';\n            b: 'abb';\n       };\n   } | 'a';\n    b?: {\n        a: {\n            a: 'baa';\n            b: 'bab';\n       };\n        b: {\n            a: 'bba';\n            b: 'bbb';\n       };\n   } | 'b';\n    c?: string;\n};\n\ntype OP_ARRAYS = {\n    a: {\n        a: string;\n        b: {\n            a: 'aba';\n            b: 'abb';\n       }[];\n   }[][];\n    b?: {\n        a: {\n            a: 'baa';\n            b: 'bab';\n       }[];\n        b: {\n            a: 'bba';\n            b: 'bbb';\n       }[];\n   }[];\n    c?: string;\n};\n\ntype OP_ARRAYS_UNIONS = {\n    a: {\n        a: string;\n        b: {\n            a: 'aba';\n            b: 'abb';\n       }[];\n   }[][] | 'a'[];\n    b?: {\n        a: {\n            a: 'baa';\n            b: 'bab';\n       }[];\n        b: {\n            a: 'bba';\n            b: 'bbb';\n       }[];\n   }[] | 'b'[][];\n    c?: string;\n};\n\n// ---------------------------------------------------------------------------------------\n// P.MERGE\n\ntype O_PMERGE = {\n    a: {\n        a: string;\n        b: {\n            a: 'aba';\n            b: 'abb';\n            x: string;\n       };\n   };\n    b?: {\n        a: {\n            a: 'baa';\n            b: 'bab';\n       };\n        b: {\n            a: 'bba';\n            b: 'bbb';\n            x: string;\n       };\n   };\n    c?: string;\n};\n\ntype O_PMERGE_UNIONS = {\n    a: {\n        a: string;\n        b: {\n            a: 'aba';\n            b: 'abb';\n            x: string;\n       };\n   } | 'a';\n    b?: {\n        a: {\n            a: 'baa';\n            b: 'bab';\n       };\n        b: {\n            a: 'bba';\n            b: 'bbb';\n            x: string;\n       };\n   } | 'b';\n    c?: string;\n};\n\nchecks([\n    check<O.P.Merge<OP, ['a' | 'b', 'b'], {x: string}>, O_PMERGE, Test.Pass>(),\n    check<O.P.Merge<OP_UNIONS, ['a' | 'b', 'b'], {x: string}>, O_PMERGE_UNIONS, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// P.OMIT\n\ntype O_POMIT = {\n    a: {\n        b: {\n            a: 'aba';\n            b: 'abb';\n       };\n   };\n    b?: {\n        b: {\n            a: 'bba';\n            b: 'bbb';\n       };\n   };\n    c?: string;\n};\n\ntype O_POMIT_UNIONS = {\n    a: {\n        b: {\n            a: 'aba';\n            b: 'abb';\n       };\n   } | 'a';\n    b?: {\n        b: {\n            a: 'bba';\n            b: 'bbb';\n       };\n   } | 'b';\n    c?: string;\n};\n\nchecks([\n    check<O.P.Omit<OP, ['a' | 'b', 'a']>, O_POMIT, Test.Pass>(),\n    check<O.P.Omit<OP_UNIONS, ['a' | 'b', 'a']>, O_POMIT_UNIONS, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// P.PICK\n\ntype O_PPICK = {\n    a: {\n        a: string;\n    };\n    b?: {\n        a: {\n            a: 'baa';\n            b: 'bab';\n        };\n    };\n};\n\ntype O_PPICK_UNIONS = {\n    a: {\n        a: string;\n    } | 'a';\n    b?: {\n        a: {\n            a: 'baa';\n            b: 'bab';\n        };\n    } | 'b';\n};\n\ntype O_PPICK_AUTOPATH = {\n    a: {\n        a: string;\n        b: {\n            a: 'aba';\n            b: 'abb';\n        };\n    };\n} | {\n    a: {\n        a: string;\n    };\n} | {\n    b?: {\n        a: {\n            b: 'bab';\n        };\n    } | undefined;\n}\n\nconst o_ppick_autopath = pick({} as OP, ['a', 'a.a', 'b.a.b'])\n\ndeclare function pick<T extends Record<string, any>, K extends string>(\n    obj: T,\n    keys: F.AutoPath<T, K>[]\n): A.Compute<O.P.Pick<T, S.Split<K, '.'>>>\n\nchecks([\n    check<O.P.Pick<OP, ['a' | 'b', 'a']>, O_PPICK, Test.Pass>(),\n    check<O.P.Pick<OP_UNIONS, ['a' | 'b', 'a']>, O_PPICK_UNIONS, Test.Pass>(),\n    check<typeof o_ppick_autopath, O_PPICK_AUTOPATH, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// P.READONLY\n\ntype O_PREADONLY = {\n    a: {\n        readonly a: string;\n        b: {\n            a: 'aba';\n            b: 'abb';\n       };\n   };\n    b?: {\n        readonly a: {\n            a: 'baa';\n            b: 'bab';\n       };\n        b: {\n            a: 'bba';\n            b: 'bbb';\n       };\n   };\n    c?: string;\n};\n\ntype O_PREADONLY_UNIONS = {\n    a: {\n        readonly a: string;\n        b: {\n            a: 'aba';\n            b: 'abb';\n       };\n   } | 'a';\n    b?: {\n        readonly a: {\n            a: 'baa';\n            b: 'bab';\n       };\n        b: {\n            a: 'bba';\n            b: 'bbb';\n       };\n   } | 'b';\n    c?: string;\n};\n\nchecks([\n    check<O.P.Readonly<OP, ['a' | 'b', 'a']>, O_PREADONLY, Test.Pass>(),\n    check<O.P.Readonly<OP_UNIONS, ['a' | 'b', 'a']>, O_PREADONLY_UNIONS, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// P.UPDATE\n\ntype O_PUPDATE = {\n    a: {\n        a: 'x';\n        b: {\n            a: 'aba';\n            b: 'abb';\n       };\n   };\n    b?: {\n        a: 'x';\n        b: {\n            a: 'bba';\n            b: 'bbb';\n       };\n   };\n    c?: string;\n};\n\ntype O_PUPDATE_UNIONS = {\n    a: 'a' | {\n        a: 'x';\n        b: {\n            a: 'aba';\n            b: 'abb';\n       };\n   },\n    b?: 'b' | {\n        a: 'x';\n        b: {\n            a: 'bba';\n            b: 'bbb';\n       };\n   },\n    c?: string;\n};\n\ntype O_PUPDATE_VPATH = {\n    a: 'a' | {\n        a: string;\n        b: {\n            a: 'aba';\n            b: 'abb';\n       };\n   };\n    b?: 'b' | {\n        a: {\n            a: 'baa';\n            b: 'bab';\n       };\n        b: {\n            a: 'bba';\n            b: 'bbb';\n       };\n   };\n    c?: string;\n};\n\nchecks([\n    check<O.P.Update<OP, ['a' | 'b', 'a'], 'x'>, O_PUPDATE, Test.Pass>(),\n    check<O.P.Update<OP_UNIONS, ['a' | 'b', 'a'], 'x'>, O_PUPDATE_UNIONS, Test.Pass>(),\n    check<O.P.Update<OP_UNIONS, ['a' | 'b' | 'c', 'a', 'a', 'a'], 'x'>, O_PUPDATE_VPATH, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// P.RECORD\n\ntype RECORD_ABCD_STRING_OPTR = {\n    readonly a?: {\n        readonly b?: {\n            readonly d?: string;\n       };\n        readonly c?: {\n            readonly d?: string;\n       };\n   };\n};\n\ntype RECORD_ABCD_STRING_OPTW = {\n    a?: {\n        b?: {\n            d?: string;\n       };\n        c?: {\n            d?: string;\n       };\n   };\n};\n\ntype RECORD_ABCD_STRING_REQR = {\n    readonly a: {\n        readonly b: {\n            readonly d: string;\n       };\n        readonly c: {\n            readonly d: string;\n       };\n   };\n};\n\ntype RECORD_ABCD_STRING_REQW = {\n    a: {\n        b: {\n            d: string;\n       };\n        c: {\n            d: string;\n       };\n   };\n};\n\nchecks([\n    check<O.P.Record<['a', 'b' | 'c', 'd'], string, ['?', 'R']>, RECORD_ABCD_STRING_OPTR, Test.Pass>(),\n    check<O.P.Record<['a', 'b' | 'c', 'd'], string, ['?', 'W']>, RECORD_ABCD_STRING_OPTW, Test.Pass>(),\n    check<O.P.Record<['a', 'b' | 'c', 'd'], string, ['!', 'R']>, RECORD_ABCD_STRING_REQR, Test.Pass>(),\n    check<O.P.Record<['a', 'b' | 'c', 'd'], string, ['!', 'W']>, RECORD_ABCD_STRING_REQW, Test.Pass>(),\n])\n"
  },
  {
    "path": "tests/String.ts",
    "content": "import {Test, S} from '../sources'\n\nconst {checks, check} = Test\n\n// ///////////////////////////////////////////////////////////////////////////////////////\n// STRING ////////////////////////////////////////////////////////////////////////////////\n\ntype S =\n    | 'hola'\n    | 'ciao!'\n\n// ---------------------------------------------------------------------------------------\n// AT\n\nchecks([\n    check<S.At<S, 1 | 2>, 'o' | 'l' | 'i' | 'a', Test.Pass>(),\n    check<S.At<S, 20>, undefined, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// JOIN\n\nchecks([\n    check<S.Join<S.Split<S, ''>>, S, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// LENGTH\n\nchecks([\n    check<S.Length<S>, 4 | 5, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// REPLACE\n\nchecks([\n    check<S.Replace<'$1 is nice. $1 is good.', '$1', 'Jane'>, 'Jane is nice. Jane is good.', Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// SPLIT\n\nchecks([\n    check<S.Split<S>, ['h', 'o', 'l', 'a'] | ['c', 'i', 'a', 'o', '!'], Test.Pass>(),\n    check<S.Split<'a.b.c', '.'>, ['a', 'b', 'c'], Test.Pass>(),\n    check<S.Split<'a.b.c.', '.'>, ['a', 'b', 'c', ''], Test.Pass>(),\n])\n"
  },
  {
    "path": "tests/Union.ts",
    "content": "import {Test, U} from '../sources'\n\nconst {checks, check} = Test\n\n// ///////////////////////////////////////////////////////////////////////////////////////\n// UNION /////////////////////////////////////////////////////////////////////////////////\n\n// ---------------------------------------------------------------------------------------\n// DIFF\n\nchecks([\n    check<U.Diff<1 | 2, 1 | 3>, 2 | 3, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// EXCLUDE\n\nchecks([\n    check<U.Exclude<1 | 2 | 3, 3>, 1 | 2, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// FILTER\n\n// No test needed (same as U.Exclude)\n\n// ---------------------------------------------------------------------------------------\n// HAS\n\nchecks([\n    check<U.Has<1 | 2 | 3, string>, 0, Test.Pass>(),\n    check<U.Has<1 | 2 | 3, 1>, 1, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// INTERSECT\n\nchecks([\n    check<U.Intersect<1 | 2 | 3 | {a: 1}, {a: 1} | 4 | 1>, {a: 1} | 1, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// INTERSECTOF\n\nchecks([\n    check<U.IntersectOf<1 | 2 | 3>, 1 & 2 & 3, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// LAST\n\nchecks([\n    // check<U.Last<1 | 2 | 3>, 3, Test.Pass>(), // order not guaranteed\n    // check<U.Last<3 | 2 | 0>, 0, Test.Pass>(), // order not guaranteed\n])\n\n// ---------------------------------------------------------------------------------------\n// LISTOF\n\nchecks([\n    // check<U.ListOf<1 | 2 | 3>, [1, 2, 3], Test.Pass>(), // order not guaranteed\n])\n\n// ---------------------------------------------------------------------------------------\n// MERGE\n\ntype U_MERGE = {a: string, e: 22} | {b?: number, c: 42} | {b?: string, c?: 48, d: 21, e: 23};\ntype MERGE_U = {\n    a: string;\n    b?: string | number;\n    c: 42 | 48;\n    d: 21;\n    e: 22 | 23;\n};\n\nchecks([\n    check<U.Merge<U_MERGE>, MERGE_U, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// NONNULLABLE\n\nchecks([\n    check<U.NonNullable<1 | 2 | undefined>, 1 | 2, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// NULLABLE\n\nchecks([\n    check<U.Nullable<1 | 2>, 1 | 2 | undefined | null, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// POP\n\nchecks([\n    // check<U.Pop<1 | 2 | 3>, 1 | 2, Test.Pass>(), // order not guaranteed\n    check<U.Pop<1>, never, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// REPLACE\n\nchecks([\n    check<U.Replace<1 | 2 | 3, 1 | 2, 'a'>, 'a' | 3, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// SELECT\n\nchecks([\n    check<U.Select<1 | 2 | 'a', number>, 1 | 2, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// STRICT\n\nchecks([\n    check<U.Strict<{a: 0} | {b: 0}>, {a: 0, b?: never} | {a?: never, b: 0}, Test.Pass>(),\n])\n\n// ---------------------------------------------------------------------------------------\n// UNION\n\n// Cannot be tested\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n      // \"allowJs\": true, /* Allow javascript files to be compiled. */\n      // \"allowSyntheticDefaultImports\": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */\n      // \"allowUnreachableCode\": false, /* Do not report errors on unreachable code. */\n      // \"allowUnusedLabels\": false, /* Do not report errors on unused labels. */\n      // \"alwaysStrict\": true, /* Parse in strict mode and emit \"use strict\" for each source file. */\n      // \"baseUrl\": \"./\", /* Base directory to resolve non-absolute module names. */\n      // \"charset\": \"utf-8\", /** The character set of the input files.*/\n      // \"checkJs\": true, /* Report errors in .js files. */\n      // \"composite\": true, /* Work with partial tsconfig.json in mono-repos, reference to another ts project. */\n      \"declaration\": true, /* Generates corresponding '.d.ts' file. */\n      \"declarationDir\": \"./out/types\", /* Specify output directory for declaration files. */\n      // \"declarationMap\": false, /* Generates a sourcemap for each corresponding '.d.ts' file. */\n      // \"diagnostics\": true, /* Show diagnostic information. */\n      \"disableSizeLimit\": true, /* Disable size limit for JavaScript project. */\n      \"downlevelIteration\": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */\n      // \"emitBOM\": false, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */\n      // \"emitDeclarationOnly\": false, /* Only emit '.d.ts' declaration files. */\n      // \"emitDecoratorMetadata\": true, /* Enables experimental support for emitting type metadata for decorators. */\n      \"esModuleInterop\": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */\n      \"experimentalDecorators\": true, /* Enables experimental support for ES7 decorators. */\n      \"forceConsistentCasingInFileNames\": true, /* Disallow inconsistently-cased references to the same file. */\n      \"importHelpers\": true, /* Import emit helpers from 'tslib'. */\n      // \"inlineSourceMap\": true, /* Emit a single file with source maps instead of having a separate file. */\n      // \"inlineSources\": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */\n      // \"isolatedModules\": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */\n      // \"jsx\": \"react\", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */\n      // \"jsxFactory\": \"React.createElement\", /* Equivalent of Babel's pragma option, Replace the function used when compiling JSX expressions. */\n      // \"keyofStringsOnly\": false, /* Resolve 'keyof' to string valued property names only (no numbers or symbols). */\n      \"lib\": [\n        \"esnext\",\n        \"dom\"\n      ], /* Specify library files to be included in the compilation. */\n      // \"listEmittedFiles\": false, /* Enable to list all emitted files. */\n      // \"listFiles\": false, /* Print names of files part of the compilation. */\n      // \"mapRoot\": \"./\", /* Specify the location where debugger should locate map files instead of generated locations. */\n      // \"maxNodeModuleJsDepth\": 0, /* The maximum dependency depth to search under node_modules and load JavaScript files. Only applicable with --allowJs. */\n      \"module\": \"commonjs\", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */\n      // \"moduleResolution\": \"node\", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */\n      // \"newLine\": \"LF\", /* Specifies the end of line sequence to be used when emitting files: 'CRLF' (dos) or 'LF' (unix). */\n      // \"noEmit\": true, /* Do not emit outputs. */\n      // \"noEmitHelpers\": false, /* Do not generate custom helper functions like __extends in compiled output. */\n      \"noEmitOnError\": true, /* Do not emit outputs if any type checking errors were reported. */\n      \"noErrorTruncation\": true, /* Do not truncate error messages. */\n      \"noFallthroughCasesInSwitch\": true, /* Report errors for fallthrough cases in switch statement. */\n      \"noImplicitAny\": true, /* Raise error on expressions and declarations with an implied 'any' type. */\n      \"noImplicitReturns\": true, /* Report error when not all code paths in function return a value. */\n      // \"noImplicitThis\": true, /* Raise error on 'this' expressions with an implied 'any' type. */\n      // \"noImplicitUseStrict\": false, /* Do not emit 'use strict' directives in module output. */\n      // \"noLib\": false, /* Do not include the default library file (lib.d.ts). */\n      // \"noResolve\": false, /* Do not add triple-slash references or module import targets to the list of compiled files. */\n      // \"noStrictGenericChecks\": false, /* Disable strict checking of generic signatures in function types. */\n      // \"noUnusedLocals\": true, /* Report errors on unused locals. */\n      \"noUnusedParameters\": true, /* Report errors on unused parameters. */\n      \"outDir\": \"./out\", /* Redirect output structure to the directory. */\n      // \"outFile\": \"./\", /* Concatenate and emit output to single file. */\n      // \"paths\": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */\n      // \"preserveConstEnums\": false, /* Do not erase const enum declarations in generated code. */\n      // \"preserveSymlinks\": false, /* Do not resolve the real path of symlinks. */\n      // \"preserveWatchOutput\": false, /* Keep outdated console output in watch mode instead of clearing the screen. */\n      \"pretty\": true, /* Stylize errors and messages using color and context (experimental). */\n      \"removeComments\": false, /* Do not emit comments to output. */\n      \"resolveJsonModule\": true, /* Include modules imported with '.json' extension. */\n      \"rootDir\": \"./\", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. Always specify https://github.com/Microsoft/TypeScript/wiki/FAQ#why-does---outdir-moves-output-after-adding-a-new-file */\n      // \"rootDirs\": [], /* List of root folders whose combined content represents the structure of the project at runtime. */\n      // \"skipLibCheck\": false, /* Skip type checking of declaration files. */\n      \"sourceMap\": true, /* Generates corresponding '.map' file. */\n      // \"sourceRoot\": \"./\", /* Specify the location where debugger should locate TypeScript files instead of source locations. */\n      \"strict\": false, /* Enable all strict type-checking options. */\n      // \"strictBindCallApply\": true, /* Enable strict type checks for the bind, call, and apply methods on function objects. */\n      \"strictFunctionTypes\": true, /* Enable strict checking of function types. */\n      \"strictNullChecks\": true, /* Enable strict null checks. */\n      // \"strictPropertyInitialization\": true, /* Enable strict checking of property initialization in classes. */\n      \"stripInternal\": true, /* Do not emit declarations for code that has an '@internal' annotation. */\n      // \"suppressExcessPropertyErrors\": false, /* Suppress excess property checks for object literals. */\n      \"suppressImplicitAnyIndexErrors\": true, /* Suppress noImplicitAny errors for indexing objects lacking index signatures. */\n      \"target\": \"ES2015\", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */\n      // \"traceResolution\": false, /* Enable tracing of the name resolution process. */\n      // \"typeRoots\": [], /* List of folders to include type definitions from. */\n      // \"tsBuildInfoFile\": \".tsbuildinfo\" /* Specify what file to store incremental build information in. */\n      \"types\": [], /* Type declaration files to be included in compilation. */\n      \"watch\": false /* Watch input files. */\n\n      /* Deprecated Options */\n      // \"skipDefaultLibCheck\": false, DEPRECATED. Use skipLibCheck\n      // \"reactNamespace\": \"\", DEPRECATED. Use jsxFactory\n      // \"out\": \"\" DEPRECATED. Use outFile\n    },\n    \"include\": [\n      \"./sources/**/*\",\n      \"./scripts/**/*\",\n      \"./tests/**/*\"\n    ],\n    \"exclude\": [\n      \"./node_modules/**/*\",\n      \"./.github/**/*\",\n      \"./.git/**/*\"\n    ]\n}"
  }
]