diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..c66ad55
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,154 @@
+#/
+# @license Apache-2.0
+#
+# Copyright (c) 2017 The Stdlib Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#/
+
+# EditorConfig configuration file (see ).
+
+# Indicate that this file is a root-level configuration file:
+root = true
+
+# Set properties for all files:
+[*]
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+# Set properties for JavaScript files:
+[*.js]
+indent_style = tab
+
+# Set properties for TypeScript files:
+[*.ts]
+indent_style = tab
+
+# Set properties for Python files:
+[*.py]
+indent_style = space
+indent_size = 4
+
+# Set properties for Julia files:
+[*.jl]
+indent_style = tab
+
+# Set properties for R files:
+[*.R]
+indent_style = tab
+
+# Set properties for C files:
+[*.c]
+indent_style = tab
+
+# Set properties for C header files:
+[*.h]
+indent_style = tab
+
+# Set properties for C++ files:
+[*.cpp]
+indent_style = tab
+
+# Set properties for C++ header files:
+[*.hpp]
+indent_style = tab
+
+# Set properties for Fortran files:
+[*.f]
+indent_style = space
+indent_size = 2
+insert_final_newline = false
+
+# Set properties for shell files:
+[*.sh]
+indent_style = tab
+
+# Set properties for AWK files:
+[*.awk]
+indent_style = tab
+
+# Set properties for HTML files:
+[*.html]
+indent_style = tab
+tab_width = 2
+
+# Set properties for CSS files:
+[*.css]
+indent_style = tab
+
+# Set properties for Makefiles:
+[Makefile]
+indent_style = tab
+
+[*.mk]
+indent_style = tab
+
+# Set properties for Markdown files:
+[*.md]
+indent_style = space
+indent_size = 4
+trim_trailing_whitespace = false
+
+# Set properties for `usage.txt` files:
+[usage.txt]
+indent_style = space
+indent_size = 2
+
+# Set properties for `repl.txt` files:
+[repl.txt]
+indent_style = space
+indent_size = 4
+
+# Set properties for `package.json` files:
+[package.json]
+indent_style = space
+indent_size = 2
+
+# Set properties for `datapackage.json` files:
+[datapackage.json]
+indent_style = space
+indent_size = 2
+
+# Set properties for `tslint.json` files:
+[tslint.json]
+indent_style = space
+indent_size = 2
+
+# Set properties for `tsconfig.json` files:
+[tsconfig.json]
+indent_style = space
+indent_size = 2
+
+# Set properties for LaTeX files:
+[*.tex]
+indent_style = tab
+
+# Set properties for LaTeX Bibliography files:
+[*.bib]
+indent_style = tab
+
+# Set properties for YAML files:
+[*.yml]
+indent_style = space
+indent_size = 2
+
+# Set properties for GYP files:
+[binding.gyp]
+indent_style = space
+indent_size = 2
+
+[*.gypi]
+indent_style = space
+indent_size = 2
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..7212d81
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,33 @@
+#/
+# @license Apache-2.0
+#
+# Copyright (c) 2017 The Stdlib Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#/
+
+# Configuration file which assigns attributes to pathnames.
+#
+# [1]: https://git-scm.com/docs/gitattributes
+
+# Automatically normalize the line endings of any committed text files:
+* text=auto
+
+# Override what is considered "vendored" by GitHub's linguist:
+/deps/** linguist-vendored=false
+/lib/node_modules/** linguist-vendored=false linguist-generated=false
+test/fixtures/** linguist-vendored=false
+tools/** linguist-vendored=false
+
+# Override what is considered "documentation" by GitHub's linguist:
+examples/** linguist-documentation=false
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..fb5c6dc
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,7 @@
+
+
+We are excited about your pull request, but unfortunately we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/repl/signature) of the main repository where we’ll review and provide feedback.
+
+If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. You may also consult the [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md) for help on developing stdlib.
+
+We look forward to receiving your contribution! :smiley:
\ No newline at end of file
diff --git a/.github/workflows/close_pull_requests.yml b/.github/workflows/close_pull_requests.yml
new file mode 100644
index 0000000..d4c8a2f
--- /dev/null
+++ b/.github/workflows/close_pull_requests.yml
@@ -0,0 +1,23 @@
+name: Close Pull Requests
+
+on:
+ pull_request_target:
+ types: [opened]
+
+jobs:
+ run:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: superbrothers/close-pull-request@v3
+ with:
+ comment: |
+ Thank you for submitting a pull request. :raised_hands:
+
+ We greatly appreciate your willingness to submit a contribution. However, we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib).
+
+ We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/repl/signature) of the main repository where we’ll review and provide feedback. If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions.
+
+ Thank you again, and we look forward to receiving your contribution! :smiley:
+
+ Best,
+ The stdlib team
\ No newline at end of file
diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml
new file mode 100644
index 0000000..7668c70
--- /dev/null
+++ b/.github/workflows/examples.yml
@@ -0,0 +1,19 @@
+name: examples
+
+on:
+ workflow_dispatch:
+
+jobs:
+ examples:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/setup-node@v1
+ with:
+ node-version: 14
+ - name: Install production and development dependencies
+ run: |
+ npm install
+ - name: Run examples
+ run: |
+ npm run examples
\ No newline at end of file
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
new file mode 100644
index 0000000..164619b
--- /dev/null
+++ b/.github/workflows/publish.yml
@@ -0,0 +1,34 @@
+name: Publish Package
+
+on: push
+
+jobs:
+ publish:
+ runs-on: ubuntu-latest
+ env:
+ SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/setup-node@v1
+ with:
+ node-version: 14
+ - name: Increment version
+ run: |
+ git config --local user.email "noreply@stdlib.io"
+ git config --local user.name "stdlib-bot"
+ npm version patch
+ - name: Publish package to npm
+ uses: JS-DevTools/npm-publish@v1
+ with:
+ token: ${{ secrets.NPM_TOKEN }}
+ access: public
+ - name: Push changes
+ run: |
+ git push origin main
+ git push --tags
+ - uses: act10ns/slack@v1
+ with:
+ status: ${{ job.status }}
+ steps: ${{ toJson(steps) }}
+ channel: '#npm-ci'
+ if: failure()
\ No newline at end of file
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
new file mode 100644
index 0000000..72b66f4
--- /dev/null
+++ b/.github/workflows/test.yml
@@ -0,0 +1,29 @@
+name: build
+
+on:
+ workflow_dispatch:
+
+jobs:
+ test:
+ runs-on: ubuntu-latest
+ env:
+ SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/setup-node@v1
+ with:
+ node-version: 14
+ - name: Install production and development dependencies
+ id: install
+ run: |
+ npm install
+ - name: Run tests
+ id: tests
+ run: |
+ npm test
+ - uses: act10ns/slack@v1
+ with:
+ status: ${{ job.status }}
+ steps: ${{ toJson(steps) }}
+ channel: '#npm-ci'
+ if: failure()
\ No newline at end of file
diff --git a/.github/workflows/test_coverage.yml b/.github/workflows/test_coverage.yml
new file mode 100644
index 0000000..debbfd5
--- /dev/null
+++ b/.github/workflows/test_coverage.yml
@@ -0,0 +1,24 @@
+name: coverage
+
+on:
+ workflow_dispatch:
+
+jobs:
+ test:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/setup-node@v1
+ with:
+ node-version: 14
+ - name: Install production and development dependencies
+ run: |
+ npm install
+ - name: Calculate test coverage
+ run: |
+ npm run test-cov
+ - name: Upload coverage to Codecov
+ uses: codecov/codecov-action@v1
+ with:
+ directory: reports/coverage
+ flags: unittests
\ No newline at end of file
diff --git a/.github/workflows/test_install.yml b/.github/workflows/test_install.yml
new file mode 100644
index 0000000..039afb6
--- /dev/null
+++ b/.github/workflows/test_install.yml
@@ -0,0 +1,27 @@
+name: Test Installing Dependencies
+
+on:
+ workflow_run:
+ workflows: ["Publish Package"]
+ types: [completed]
+
+jobs:
+ on-success:
+ runs-on: ubuntu-latest
+ env:
+ SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
+ if: ${{ github.event.workflow_run.conclusion == 'success' }}
+ steps:
+ - uses: actions/checkout@v1
+ - uses: actions/setup-node@v1
+ with:
+ node-version: 14
+ - name: Install production dependencies via npm
+ run: |
+ npm install --only=prod
+ - uses: act10ns/slack@v1
+ with:
+ status: ${{ job.status }}
+ steps: ${{ toJson(steps) }}
+ channel: '#npm-ci'
+ if: failure()
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1475963
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,181 @@
+#/
+# @license Apache-2.0
+#
+# Copyright (c) 2017 The Stdlib Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#/
+
+# Files #
+#########
+.postinstall.json
+
+# Directories #
+###############
+build/
+downloads/
+reports/
+tmp/
+
+# Compiled source #
+###################
+*.com
+*.class
+*.dll
+*.o
+*.so
+*.slo
+*.lo
+*.obj
+*.dylib
+*.lai
+*.la
+*.a
+*.lib
+*.ko
+*.elf
+*.node
+
+# Precompiled headers #
+#######################
+*.gch
+*.pch
+
+# Executables #
+###############
+*.exe
+*.out
+*.app
+
+# Packages #
+############
+# It is better to unpack these files and commit the raw source
+# git has its own built in compression methods
+*.7z
+*.dmg
+*.gz
+*.iso
+*.jar
+*.rar
+*.tar
+*.zip
+
+# Make an exception for compressed distributable files:
+!dist/*.gz
+
+# Logs and databases #
+######################
+*.log
+*.sql
+*.sqlite
+
+# OS generated files #
+######################
+.DS_Store
+.DS_Store?
+._*
+.Spotlight-V100
+.Trashes
+Icon?
+ehthumbs.db
+Thumbs.db
+Desktop.ini
+
+# Temporary files #
+###################
+*~
+
+# Node.js #
+###########
+/node_modules/
+lib/node_modules/**/node_modules/
+docs/**/node_modules/
+pids
+*.pid
+*.seed
+
+# Typescript #
+##############
+*.tsbuildinfo
+lib/node_modules/**/tsconfig.json
+lib/node_modules/**/tslint.json
+
+# Matlab #
+##########
+*.asv
+*.mex*
+
+# Fortran #
+###########
+*.mod
+
+# R #
+#####
+.Rhistory
+.Rapp.history
+.Rproj.user/
+
+# Python #
+##########
+__pycache__/
+*.py[cod]
+*$py.class
+*.egg-info/
+
+# TeX #
+#######
+*.aux
+*.lof
+*.log
+*.lot
+*.fls
+*.out
+*.toc
+*.dvi
+*-converted-to.*
+*.bbl
+*.bcf
+*.blg
+*-blx.aux
+*-blx.bib
+*.brf
+*.run.xml
+*.fdb_latexmk
+*.synctex
+*.synctex.gz
+*.synctex.gz(busy)
+*.pdfsync
+*.alg
+*.loa
+acs-*.bib
+*.thm
+*.nav
+*.snm
+*.vrb
+*.acn
+*.acr
+*.glg
+*.glo
+*.gls
+*-concordance.tex
+*.tikz
+*-tikzDictionary
+*.idx
+*.ilg
+*.ind
+*.ist
+
+# Visual Studio #
+#################
+.vscode/
+jsconfig.json
diff --git a/.npmignore b/.npmignore
new file mode 100644
index 0000000..401aa76
--- /dev/null
+++ b/.npmignore
@@ -0,0 +1,225 @@
+#/
+# @license Apache-2.0
+#
+# Copyright (c) 2017 The Stdlib Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#/
+
+# Files #
+#########
+CODE_OF_CONDUCT.md
+CONTRIBUTING.md
+CONTRIBUTORS
+TODO.md
+ROADMAP.md
+.postinstall.json
+
+# Directories #
+###############
+.circleci/
+.github/
+**/benchmark/
+**/build/
+**/examples/
+reports/
+support/
+**/tmp/
+workshops/
+
+# Ignore test directories, except for testing dependency installation:
+**/test/
+!/deps/test/
+
+# Only top-level directories:
+/etc/
+/docs/
+
+# Compiled source #
+###################
+*.com
+*.class
+*.dll
+*.o
+*.so
+*.slo
+*.lo
+*.obj
+*.dylib
+*.lai
+*.la
+*.a
+*.lib
+*.ko
+*.elf
+*.node
+
+# Precompiled headers #
+#######################
+*.gch
+*.pch
+
+# Executables #
+###############
+*.exe
+*.out
+*.app
+
+# Packages #
+############
+*.7z
+*.dmg
+*.gz
+*.iso
+*.jar
+*.rar
+*.tar
+*.zip
+
+# Make an exception for compressed distributable files:
+!dist/*.gz
+
+# Logs and databases #
+######################
+*.log
+*.sql
+*.sqlite
+
+# OS generated files #
+######################
+.DS_Store
+.DS_Store?
+._*
+.Spotlight-V100
+.Trashes
+Icon?
+ehthumbs.db
+Thumbs.db
+Desktop.ini
+
+# Temporary files #
+###################
+*~
+
+# Node.js #
+###########
+.npmignore
+
+# Only top-level node_modules:
+/node_modules/
+
+# TypeScript #
+##############
+tsconfig.json
+tslint.json
+*.tsbuildinfo
+
+# Matlab #
+##########
+*.asv
+*.mex*
+
+# Fortran #
+###########
+*.mod
+
+# R #
+#####
+.Rhistory
+.Rapp.history
+.Rproj.user/
+
+# Python #
+##########
+__pycache__/
+*.py[cod]
+*$py.class
+*.egg-info/
+.ipynb_checkpoints
+setup.cfg
+setup.py
+
+# TeX #
+#######
+*.aux
+*.lof
+*.log
+*.lot
+*.fls
+*.out
+*.toc
+*.dvi
+*-converted-to.*
+*.bbl
+*.bcf
+*.blg
+*-blx.aux
+*-blx.bib
+*.brf
+*.run.xml
+*.fdb_latexmk
+*.synctex
+*.synctex.gz
+*.synctex.gz(busy)
+*.pdfsync
+*.alg
+*.loa
+acs-*.bib
+*.thm
+*.nav
+*.snm
+*.vrb
+*.acn
+*.acr
+*.glg
+*.glo
+*.gls
+*-concordance.tex
+*.tikz
+*-tikzDictionary
+*.idx
+*.ilg
+*.ind
+*.ist
+
+# Git #
+#######
+.git*
+.mailmap
+
+# Visual Studio #
+#################
+.vscode/
+jsconfig.json
+
+# Utilities #
+#############
+.jshintrc
+.jshintignore
+.eslintrc*
+.eslintignore
+
+.pylintrc
+.pycodestyle
+.pydocstyle
+
+.travis.yml
+circle.yml
+appveyor.yml
+azure-pipelines.yml
+
+.editorconfig
+.codeclimate.yml
+.codecov.yml
+
+.rtlintrc
diff --git a/.npmrc b/.npmrc
new file mode 100644
index 0000000..36f5bef
--- /dev/null
+++ b/.npmrc
@@ -0,0 +1,28 @@
+#/
+# @license Apache-2.0
+#
+# Copyright (c) 2017 The Stdlib Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#/
+
+# Configuration for [npm][1].
+#
+# [1]: https://docs.npmjs.com/files/npmrc
+
+# Disable the creation of a lock file:
+package-lock = false
+shrinkwrap = false
+
+# Disable automatically "saving" dependencies on install:
+save = false
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..35b70c9
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,3 @@
+# Code of Conduct
+
+stdlib expects community participants to adhere to the project Code of Conduct. The [full text](https://github.com/stdlib-js/stdlib/blob/develop/CODE_OF_CONDUCT.md) is available in the main project repository.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..5f59443
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,3 @@
+# Contribution Guidelines
+
+Woot woot! If you are new to stdlib, welcome! And thanks for your interest! Guidelines for how to contribute to the project are [available](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) in the main project repository.
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
new file mode 100644
index 0000000..da469e5
--- /dev/null
+++ b/CONTRIBUTORS
@@ -0,0 +1,24 @@
+# This file is generated by tools/scripts/update_contributors.
+#
+# Contributors listed in alphabetical order.
+
+Athan Reines
+Brendan Graetz
+Bruno Fenzl
+Christopher Dambamuromo
+Dominik Moritz
+Frank Kovacs
+James
+Jithin KS
+Joey Reed
+Joris Labie
+Justin Dennison
+Marcus
+Matt Cochrane
+Milan Raj
+Ognjen Jevremović
+Philipp Burckhardt
+Ricky Reusser
+Ryan Seal
+Shraddheya Shendre
+rei2hu
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..fcc9934
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,481 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+
+
+Boost Software License - Version 1.0 - August 17th, 2003
+
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by this
+license (the "Software") to use, reproduce, display, distribute, execute, and
+transmit the Software, and to prepare derivative works of the Software, and to
+permit third-parties to whom the Software is furnished to do so, all subject to
+the following:
+
+The copyright notices in the Software and this entire statement, including the
+above license grant, this restriction and the following disclaimer, must be
+included in all copies of the Software, in whole or in part, and all derivative
+works of the Software, unless such copies or derivative works are solely in the
+form of machine-executable object code generated by a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES
+OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+
+
+DEPENDENCIES
+
+The library links against the following external libraries, which have their own
+licenses:
+
+* OpenBLAS
+
+Copyright (c) 2011-2014, The OpenBLAS Project
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ 3. Neither the name of the OpenBLAS project nor the names of
+ its contributors may be used to endorse or promote products
+ derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+* Electron
+
+Copyright (c) 2013-2017 GitHub Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+* Boost
+
+Boost Software License - Version 1.0 - August 17th, 2003
+
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+
+* Cephes
+
+Copyright (c) 1984-2000 Stephen L. Moshier
+
+Some software in this archive may be from the book _Methods and Programs for
+Mathematical Functions_ (Prentice-Hall or Simon & Schuster International, 1989)
+or from the Cephes Mathematical Library, a commercial product. In either event,
+it is copyrighted by the author. What you see here may be used freely but it
+comes with no support or guarantee.
+
+Stephen L. Moshier
+moshier@na-net.ornl.gov
+
+
+
+ATTRIBUTION
+
+The library contains implementations from the following external libraries,
+which have their own licenses:
+
+* FreeBSD
+
+Copyright (C) 1993-2004 by Sun Microsystems, Inc. All rights reserved.
+
+Developed at SunPro, a Sun Microsystems, Inc. business.
+Permission to use, copy, modify, and distribute this
+software is freely granted, provided that this notice
+is preserved.
+
+
+* FDLIBM
+
+Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved.
+
+Developed at SunPro, a Sun Microsystems, Inc. business.
+Permission to use, copy, modify, and distribute this
+software is freely granted, provided that this notice
+is preserved.
+
+
+* Go
+
+Copyright (c) 2009 The Go Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+* SLATEC Common Mathematical Library
+
+Public domain.
+
+
+* ESLint
+
+Copyright JS Foundation and other contributors, https://js.foundation
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+
+* StatsFuns.jl
+
+Copyright (c) 2015: Dahua Lin.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+* SpecialFunctions.jl
+
+The MIT License (MIT)
+
+Copyright (c) 2017 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and others:
+
+https://github.com/JuliaMath/SpecialFunctions.jl/graphs/contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+
+* MT19937
+
+Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. The names of its contributors may not be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..1c7d53e
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,534 @@
+#/
+# @license Apache-2.0
+#
+# Copyright (c) 2021 The Stdlib Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#/
+
+# USER VARIABLES #
+
+ifndef VERBOSE
+ QUIET := @
+else
+ QUIET :=
+endif
+
+# Indicate whether to "fast" fail when linting, running tests, etc:
+ifndef FAST_FAIL
+ FAIL_FAST := true
+else
+ifeq ($(FAST_FAIL), 0)
+ FAIL_FAST := false
+else
+ FAIL_FAST := true
+endif
+endif
+
+# Define the `NODE_PATH` environment variable:
+NODE_PATH ?=
+
+# Define the `NODE_ENV` environment variable:
+NODE_ENV ?=
+
+
+# INTERNAL VARIABLES #
+
+# Instruct make to warn us when we use an undefined variable (e.g., misspellings).
+MAKEFLAGS += --warn-undefined-variables
+
+# Define the default target:
+.DEFAULT_GOAL := all
+
+# Define the `SHELL` variable to avoid issues on systems where the variable may be inherited from the environment.
+#
+# ## Notes
+#
+# - We use `bash` so that we can use `pipefail`.
+#
+#
+# [1]: https://www.gnu.org/prep/standards/html_node/Makefile-Basics.html#Makefile-Basics
+# [2]: http://clarkgrubb.com/makefile-style-guide
+SHELL := bash
+
+# Define shell flags.
+#
+# ## Notes
+#
+# - `.SHELLFLAGS` was introduced in GNU Make 3.82 and has no effect on the version of GNU Make installed on Mac OS X, which is 3.81.
+# - The `-e` flag causes `bash` to exit immediately if a `bash` executed command fails.
+# - The `-u` flag causes `bash` to exit with an error message if a variable is accessed without being defined.
+# - The `pipefail` option specifies that, if any of the commands in a pipeline fail, the entire pipeline fails. Otherwise the return value of a pipeline is the return value of the last command.
+# - The `-c` flag is in the default value of `.SHELLFLAGS`, which must be preserved, as this is how `make` passes the script to be executed to `bash`.
+#
+.SHELLFLAGS := -eu -o pipefail -c
+
+# Remove targets if its recipe fails.
+#
+# ## Notes
+#
+# - Mentioning this target anywhere in a Makefile prevents a user from re-running make and using an incomplete or invalid target.
+# - When debugging, it may be necessary to comment this line out so the incomplete or invalid target can be inspected.
+#
+# [1]: https://www.gnu.org/software/make/manual/html_node/Special-Targets.html
+.DELETE_ON_ERROR:
+
+# Remove all the default suffixes, preferring to define all rules explicitly.
+#
+# [1]: https://www.gnu.org/software/make/manual/html_node/Suffix-Rules.html#Suffix-Rules
+# [2]: https://www.gnu.org/software/make/manual/html_node/Suffix-Rules.html#Suffix-Rules
+.SUFFIXES:
+
+# Determine the OS ([1][1], [2][2]).
+#
+# [1]: https://en.wikipedia.org/wiki/Uname#Examples
+# [2]: http://stackoverflow.com/a/27776822/2225624
+OS ?= $(shell uname)
+ifneq (, $(findstring MINGW,$(OS)))
+ OS := WINNT
+else
+ifneq (, $(findstring MSYS,$(OS)))
+ OS := WINNT
+else
+ifneq (, $(findstring CYGWIN,$(OS)))
+ OS := WINNT
+else
+ifneq (, $(findstring Windows_NT,$(OS)))
+ OS := WINNT
+endif
+endif
+endif
+endif
+
+# Determine the filename:
+this_file := $(lastword $(MAKEFILE_LIST))
+
+# Determine the absolute path of the Makefile (see http://blog.jgc.org/2007/01/what-makefile-am-i-in.html):
+this_dir := $(dir $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)))
+
+# Remove the trailing slash:
+this_dir := $(patsubst %/,%,$(this_dir))
+
+# Determine root directory:
+ROOT_DIR = $(this_dir)
+
+# Define the root build directory:
+BUILD_DIR ?= $(ROOT_DIR)/build
+
+# Define the root directory for storing distributable files:
+DIST_DIR ?= $(ROOT_DIR)/dist
+
+# Define the root directory for storing temporary files:
+TMP_DIR ?= $(ROOT_DIR)/tmp
+
+# Define the directories for writing reports, including code coverage:
+REPORTS_DIR ?= $(ROOT_DIR)/reports
+COVERAGE_DIR ?= $(REPORTS_DIR)/coverage
+
+# Define the top-level directory containing node module dependencies:
+NODE_MODULES ?= $(ROOT_DIR)/node_modules
+
+# Define the top-level directory containing node module executables:
+BIN_DIR ?= $(NODE_MODULES)/.bin
+
+# Define the path to the root `package.json`:
+ROOT_PACKAGE_JSON ?= $(ROOT_DIR)/package.json
+
+# Define the folder name convention for source files requiring compilation:
+SRC_FOLDER ?= src
+
+# Define the folder name convention for documentation files:
+DOCUMENTATION_FOLDER ?= docs
+
+# Define the folder name convention for configuration files:
+CONFIG_FOLDER ?= etc
+
+# Define the folder name convention for benchmark files:
+BENCHMARKS_FOLDER ?= benchmark
+
+# Define the folder name convention for benchmark fixtures:
+BENCHMARKS_FIXTURES_FOLDER ?= $(BENCHMARKS_FOLDER)/fixtures
+
+# Define the folder name convention for examples files:
+EXAMPLES_FOLDER ?= examples
+
+# Define the folder name convention for examples fixtures:
+EXAMPLES_FIXTURES_FOLDER ?= $(EXAMPLES_FOLDER)/fixtures
+
+# Define the folder name convention for test files:
+TESTS_FOLDER ?= test
+
+# Define the folder name convention for test fixtures:
+TESTS_FIXTURES_FOLDER ?= $(TESTS_FOLDER)/fixtures
+
+# Define a filepath pattern for benchmark files:
+BENCHMARKS_FILTER ?= .*/.*
+
+# Define a filepath pattern for example files:
+EXAMPLES_FILTER ?= .*/.*
+
+# Define a filepath pattern for test files:
+TESTS_FILTER ?= .*/.*
+
+# Define a filename pattern for benchmark files:
+BENCHMARKS_PATTERN ?= benchmark*.js
+
+# Define a filename pattern for example files:
+EXAMPLES_PATTERN ?= *.js
+
+# Define a filename pattern for test files:
+TESTS_PATTERN ?= test*.js
+
+# Define Node environments:
+ifdef NODE_ENV
+ NODE_ENV_BENCHMARK := $(NODE_ENV)
+ NODE_ENV_EXAMPLES := $(NODE_ENV)
+ NODE_ENV_TEST := $(NODE_ENV)
+else
+ NODE_ENV ?=
+ NODE_ENV_BENCHMARK ?= benchmark
+ NODE_ENV_EXAMPLES ?= examples
+ NODE_ENV_TEST ?= test
+endif
+
+# Define whether delete operations should be safe (i.e., deleted items are sent to trash, rather than permanently deleted):
+SAFE_DELETE ?= false
+
+# Define the delete command:
+ifeq ($(SAFE_DELETE), true)
+ # FIXME: -rm -rf
+ DELETE := -rm
+ DELETE_FLAGS := -rf
+else
+ DELETE ?= -rm
+ DELETE_FLAGS ?= -rf
+endif
+
+# Determine the `open` command:
+ifeq ($(OS), Darwin)
+ OPEN ?= open
+else
+ OPEN ?= xdg-open
+endif
+# TODO: add Windows command
+
+# Define the command for `node`:
+NODE ?= node
+
+# Define the command for `npm`:
+NPM ?= npm
+
+# Define the path to a JavaScript test runner.
+#
+# ## Notes
+#
+# - We reference the `bin` file directly in order to support using `istanbul` for code coverage on Windows (https://github.com/gotwarlost/istanbul#usage-on-windows)
+JAVASCRIPT_TEST ?= $(NODE_MODULES)/tape/bin/tape
+
+# Define any command-line options to use when invoking the test runner:
+JAVASCRIPT_TEST_FLAGS ?=
+
+# Define the path to the executable for parsing TAP output:
+TAP_REPORTER ?= $(BIN_DIR)/tap-spec
+
+# Define the path to the Istanbul executable:
+ISTANBUL ?= $(BIN_DIR)/istanbul
+
+# Define which files and directories to exclude from coverage instrumentation:
+ISTANBUL_EXCLUDES_FLAGS ?= \
+ --no-default-excludes \
+ -x 'node_modules/**' \
+ -x 'reports/**' \
+ -x 'tmp/**' \
+ -x 'deps/**' \
+ -x 'dist/**' \
+ -x "**/$(SRC_FOLDER)/**" \
+ -x "**/$(TESTS_FOLDER)/**" \
+ -x "**/$(EXAMPLES_FOLDER)/**" \
+ -x "**/$(BENCHMARKS_FOLDER)/**" \
+ -x "**/$(CONFIG_FOLDER)/**" \
+ -x "**/$(DOCUMENTATION_FOLDER)/**"
+
+# Define the command to generate test coverage:
+ISTANBUL_COVER ?= $(ISTANBUL) cover
+
+# Define the type of report Istanbul should produce:
+ISTANBUL_COVER_REPORT_FORMAT ?= lcov
+
+# Define the command-line options to be used when generating code coverage:
+ISTANBUL_COVER_FLAGS ?= \
+ $(ISTANBUL_EXCLUDES_FLAGS) \
+ --dir $(COVERAGE_DIR) \
+ --report $(ISTANBUL_COVER_REPORT_FORMAT)
+
+# On Mac OSX, in order to use `|` and other regular expression operators, we need to use enhanced regular expression syntax (-E); see https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man7/re_format.7.html#//apple_ref/doc/man/7/re_format.
+ifeq ($(OS), Darwin)
+ find_kernel_prefix := -E
+else
+ find_kernel_prefix :=
+endif
+
+# Common exclude flags that most recipes for finding package files should use (Note: order does matter to some degree):
+FIND_COMMON_EXCLUDE_FLAGS ?= \
+ -not -path "$(ROOT_DIR)/.*" \
+ -not -path "$(NODE_MODULES)/*" \
+ -not -path "$(BUILD_DIR)/*" \
+ -not -path "$(REPORTS_DIR)/*" \
+
+# Define exclusion flags to use when searching for benchmark files:
+FIND_BENCHMARKS_EXCLUDE_FLAGS ?= \
+ $(FIND_COMMON_EXCLUDE_FLAGS) \
+ -not -path "$(ROOT_DIR)/**/$(BENCHMARKS_FIXTURES_FOLDER)/*"
+
+# Define flags for finding benchmark files:
+FIND_BENCHMARKS_FLAGS ?= \
+ -type f \
+ -name "$(BENCHMARKS_PATTERN)" \
+ -path "$(ROOT_DIR)/**/$(BENCHMARKS_FOLDER)/**" \
+ -regex "$(BENCHMARKS_FILTER)" \
+ $(FIND_BENCHMARKS_EXCLUDE_FLAGS)
+
+ifneq ($(OS), Darwin)
+ FIND_BENCHMARKS_FLAGS := -regextype posix-extended $(FIND_BENCHMARKS_FLAGS)
+endif
+
+# Define a command to list benchmark files:
+FIND_BENCHMARKS_CMD ?= find $(find_kernel_prefix) $(ROOT_DIR) $(FIND_BENCHMARKS_FLAGS)
+
+# Define exclusion flags to use when searching for examples files:
+FIND_EXAMPLES_EXCLUDE_FLAGS ?= \
+ $(FIND_COMMON_EXCLUDE_FLAGS) \
+ -not -path "$(ROOT_DIR)/**/$(EXAMPLES_FIXTURES_FOLDER)/*"
+
+# Define flags for finding examples files:
+FIND_EXAMPLES_FLAGS ?= \
+ -type f \
+ -name "$(EXAMPLES_PATTERN)" \
+ -path "$(ROOT_DIR)/**/$(EXAMPLES_FOLDER)/**" \
+ -regex "$(EXAMPLES_FILTER)" \
+ $(FIND_EXAMPLES_EXCLUDE_FLAGS)
+
+ifneq ($(OS), Darwin)
+ FIND_EXAMPLES_FLAGS := -regextype posix-extended $(FIND_EXAMPLES_FLAGS)
+endif
+
+# Define a command to list example files:
+FIND_EXAMPLES_CMD ?= find $(find_kernel_prefix) $(ROOT_DIR) $(FIND_EXAMPLES_FLAGS)
+
+# Define exclusion flags to use when searching for test files:
+FIND_TESTS_EXCLUDE_FLAGS ?= \
+ $(FIND_COMMON_EXCLUDE_FLAGS) \
+ -not -path "$(ROOT_DIR)/**/$(TESTS_FIXTURES_FOLDER)/*"
+
+# Define flags for finding test files:
+FIND_TESTS_FLAGS ?= \
+ -type f \
+ -name "$(TESTS_PATTERN)" \
+ -regex "$(TESTS_FILTER)" \
+ $(FIND_TESTS_EXCLUDE_FLAGS)
+
+ifneq ($(OS), Darwin)
+ FIND_TESTS_FLAGS := -regextype posix-extended $(FIND_TESTS_FLAGS)
+endif
+
+# Define a command to list test files:
+FIND_TESTS_CMD ?= find $(find_kernel_prefix) $(ROOT_DIR) $(FIND_TESTS_FLAGS)
+
+
+# RULES #
+
+#/
+# Default target.
+#
+# @example
+# make
+#
+# @example
+# make all
+#/
+all: help
+
+.PHONY: all
+
+#/
+# Prints a `Makefile` help message.
+#
+# @example
+# make help
+#/
+help:
+ $(QUIET) echo 'Read the Makefile to see the list of available commands.'
+ $(QUIET) echo ''
+
+.PHONY: help
+
+#/
+# Prints the runtime value of a `Makefile` variable.
+#
+# ## Notes
+#
+# - The rule uses the following format:
+#
+# ```bash
+# $ make inspect.
+# ```
+#
+# @example
+# make inspect.ROOT_DIR
+#
+# @example
+# make inspect.CC
+#/
+inspect.%:
+ $(QUIET) echo '$*=$($*)'
+
+#/
+# Runs the project's install sequence.
+#
+# @example
+# make install
+#/
+install:
+ $(NPM) install
+
+.PHONY: install
+
+#/
+# Removes node module dependencies.
+#
+# @example
+# make clean-node
+#/
+clean-node:
+ $(QUIET) $(DELETE) $(DELETE_FLAGS) $(NODE_MODULES)
+
+#/
+# Runs the project's cleanup sequence.
+#
+# @example
+# make clean
+#/
+clean: clean-node clean-cov
+ $(QUIET) $(DELETE) $(DELETE_FLAGS) $(BUILD_DIR)
+ $(QUIET) $(DELETE) $(DELETE_FLAGS) $(REPORTS_DIR)
+
+.PHONY: clean
+
+#/
+# Runs JavaScript benchmarks consecutively.
+#
+# ## Notes
+#
+# - The recipe assumes that benchmark files can be run via Node.js.
+# - This rule is useful when wanting to glob for JavaScript benchmark files (e.g., run all JavaScript benchmarks for a particular package).
+#
+#
+# @param {string} [BENCHMARKS_FILTER] - file path pattern (e.g., `.*/utils/group-by/.*`)
+#
+# @example
+# make benchmark
+#
+# @example
+# make benchmark BENCHMARKS_FILTER=".*/utils/group-by/.*"
+#/
+benchmark: $(NODE_MODULES)
+ $(QUIET) $(FIND_BENCHMARKS_CMD) | grep '^[\/]\|^[a-zA-Z]:[/\]' | while read -r file; do \
+ echo ""; \
+ echo "Running benchmark: $$file"; \
+ NODE_ENV="$(NODE_ENV_BENCHMARK)" \
+ NODE_PATH="$(NODE_PATH)" \
+ $(NODE) $$file || exit 1; \
+ done
+
+.PHONY: benchmark
+
+#/
+# Runs JavaScript examples consecutively.
+#
+# ## Notes
+#
+# - This rule is useful when wanting to glob for JavaScript examples files (e.g., run all JavaScript examples for a particular package).
+# - This rule **assumes** that examples files can be run using Node.js.
+#
+#
+# @param {string} [EXAMPLES_FILTER] - file path pattern (e.g., `.*/math/base/special/abs/.*`)
+#
+# @example
+# make examples
+#
+# @example
+# make examples EXAMPLES_FILTER=".*/strided/common/.*"
+#/
+examples: $(NODE_MODULES)
+ $(QUIET) $(FIND_EXAMPLES_CMD) | grep '^[\/]\|^[a-zA-Z]:[/\]' | while read -r file; do \
+ echo ""; \
+ echo "Running example: $$file"; \
+ NODE_ENV="$(NODE_ENV_EXAMPLES)" \
+ NODE_PATH="$(NODE_PATH)" \
+ $(NODE) $$file || exit 1; \
+ done
+
+.PHONY: examples
+
+#/
+# Runs JavaScript tests consecutively.
+#
+# ## Notes
+#
+# - This rule is useful when wanting to glob for JavaScript test files (e.g., run all JavaScript tests for a particular package).
+# - This rule **assumes** that test files can be run using Node.js.
+#
+#
+# @param {string} [TEST_FILTER] - file path pattern (e.g., `.*/math/base/special/abs/.*`)
+#
+# @example
+# make test
+#
+# @example
+# make test TESTS_FILTER=".*/strided/common/.*"
+#/
+test: $(NODE_MODULES)
+ $(QUIET) $(FIND_TESTS_CMD) | grep '^[\/]\|^[a-zA-Z]:[/\]' | while read -r test; do \
+ echo ''; \
+ echo "Running test: $$test"; \
+ NODE_ENV="$(NODE_ENV_TEST)" \
+ NODE_PATH="$(NODE_PATH)" \
+ $(JAVASCRIPT_TEST) \
+ $(JAVASCRIPT_TEST_FLAGS) \
+ $$test \
+ | $(TAP_REPORTER) || exit 1; \
+ done
+
+.PHONY: test
+
+#/
+# Runs unit tests and generate a test coverage report.
+#
+# @example
+# make test-cov
+#/
+test-cov: clean-cov
+ $(QUIET) NODE_ENV="$(NODE_ENV_TEST)" \
+ NODE_PATH="$(NODE_PATH)" \
+ $(ISTANBUL_COVER) $(ISTANBUL_COVER_FLAGS) $(JAVASCRIPT_TEST) -- $$( $(FIND_TESTS_CMD) )
+
+.PHONY: test-cov
+
+#/
+# Removes a test coverage directory.
+#
+# @example
+# make clean-cov
+#/
+clean-cov:
+ $(QUIET) $(DELETE) $(DELETE_FLAGS) $(COVERAGE_DIR)
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 0000000..f5374f6
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1 @@
+Copyright (c) 2016-2021 The Stdlib Authors.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2478497
--- /dev/null
+++ b/README.md
@@ -0,0 +1,257 @@
+
+
+# Signature
+
+[![NPM version][npm-image]][npm-url] [![Build Status][test-image]][test-url] [![Coverage Status][coverage-image]][coverage-url] [![dependencies][dependencies-image]][dependencies-url]
+
+> Return the signature(s) associated with a provided alias.
+
+
+
+
+
+
+
+
+
+
+
+## Installation
+
+```bash
+npm install @stdlib/repl-signature
+```
+
+
+
+
+
+## Usage
+
+```javascript
+var signature = require( '@stdlib/repl-signature' );
+```
+
+#### signature( alias )
+
+Returns the signature(s) for a provided alias.
+
+```javascript
+var out = signature( 'base.sin' );
+// returns [ '...' ]
+```
+
+If provided an unrecognized `alias`, the function returns `null`.
+
+```javascript
+var txt = signature( 'unrecognized_alias_beep_boop_bop_bip' );
+// returns null
+```
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## Examples
+
+
+
+
+
+```javascript
+var discreteUniform = require( '@stdlib/random-base-discrete-uniform' );
+var aliases = require( '@stdlib/namespace-aliases' );
+var signature = require( '@stdlib/repl-signature' );
+
+var list;
+var len;
+var idx;
+var sig;
+var i;
+
+list = aliases();
+len = list.length;
+
+for ( i = 0; i < 100; i++ ) {
+ idx = discreteUniform( 0, len-1 );
+ sig = signature( list[ idx ] );
+ if ( sig ) {
+ console.log( sig.join( '\n' ) );
+ }
+}
+```
+
+
+
+
+
+
+
+* * *
+
+
+
+## CLI
+
+
+
+## Installation
+
+To use the module as a general utility, install the module globally
+
+```bash
+npm install -g @stdlib/repl-signature
+```
+
+
+
+
+
+### Usage
+
+```text
+Usage: stdlib-alias-signature [options]
+
+Options:
+
+ -h, --help Print this message.
+ -V, --version Print the package version.
+```
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+### Examples
+
+```bash
+$ stdlib-alias-signature 'base.sin'
+```
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## License
+
+The data files (databases) are licensed under an [Open Data Commons Public Domain Dedication & License 1.0][pddl-1.0] and their contents are licensed under [Creative Commons Zero v1.0 Universal][cc0]. The software is licensed under [Apache License, Version 2.0][apache-license].
+
+
+
+
+
+
+
+
+* * *
+
+## Notice
+
+This package is part of [stdlib][stdlib], a standard library for JavaScript and Node.js, with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more.
+
+For more information on the project, filing bug reports and feature requests, and guidance on how to develop [stdlib][stdlib], see the main project [repository][stdlib].
+
+---
+
+## License
+
+See [LICENSE][stdlib-license].
+
+
+## Copyright
+
+Copyright © 2016-2021. The Stdlib [Authors][stdlib-authors].
+
+
+
+
+
+
+
+
+
+[npm-image]: http://img.shields.io/npm/v/@stdlib/repl-signature.svg
+[npm-url]: https://npmjs.org/package/@stdlib/repl-signature
+
+[test-image]: https://github.com/stdlib-js/repl-signature/actions/workflows/test.yml/badge.svg
+[test-url]: https://github.com/stdlib-js/repl-signature/actions/workflows/test.yml
+
+[coverage-image]: https://img.shields.io/codecov/c/github/stdlib-js/repl-signature/main.svg
+[coverage-url]: https://codecov.io/github/stdlib-js/repl-signature?branch=main
+
+[dependencies-image]: https://img.shields.io/david/stdlib-js/repl-signature
+[dependencies-url]: https://david-dm.org/stdlib-js/repl-signature/main
+
+[stdlib]: https://github.com/stdlib-js/stdlib
+
+[stdlib-authors]: https://github.com/stdlib-js/stdlib/graphs/contributors
+
+[stdlib-license]: https://raw.githubusercontent.com/stdlib-js/repl-signature/main/LICENSE
+
+[pddl-1.0]: http://opendatacommons.org/licenses/pddl/1.0/
+
+[cc0]: https://creativecommons.org/publicdomain/zero/1.0
+
+[apache-license]: https://www.apache.org/licenses/LICENSE-2.0
+
+
+
+
diff --git a/benchmark/benchmark.js b/benchmark/benchmark.js
new file mode 100644
index 0000000..d65f77d
--- /dev/null
+++ b/benchmark/benchmark.js
@@ -0,0 +1,52 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2019 The Stdlib Authors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+'use strict';
+
+// MODULES //
+
+var bench = require( '@stdlib/bench' );
+var isStringArray = require( '@stdlib/assert-is-string-array' ).primitives;
+var aliases = require( '@stdlib/namespace-aliases' );
+var pkg = require( './../package.json' ).name;
+var signature = require( './../lib' );
+
+
+// MAIN //
+
+bench( pkg, function benchmark( b ) {
+ var values;
+ var v;
+ var i;
+
+ values = aliases();
+
+ b.tic();
+ for ( i = 0; i < b.iterations; i++ ) {
+ v = signature( values[ i%values.length ] );
+ if ( typeof v !== 'object' ) {
+ b.fail( 'should return an object' );
+ }
+ }
+ b.toc();
+ if ( !isStringArray( v ) && v !== null ) {
+ b.fail( 'should return an array of strings or null' );
+ }
+ b.pass( 'benchmark finished' );
+ b.end();
+});
diff --git a/bin/cli b/bin/cli
new file mode 100644
index 0000000..7918562
--- /dev/null
+++ b/bin/cli
@@ -0,0 +1,71 @@
+#!/usr/bin/env node
+
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2019 The Stdlib Authors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+'use strict';
+
+// MODULES //
+
+var resolve = require( 'path' ).resolve;
+var readFileSync = require( '@stdlib/fs/read-file' ).sync;
+var CLI = require( '@stdlib/cli' );
+var signature = require( './../lib' );
+
+
+// MAIN //
+
+/**
+* Main execution sequence.
+*
+* @private
+*/
+function main() {
+ var flags;
+ var args;
+ var cli;
+ var out;
+
+ // Create a command-line interface:
+ cli = new CLI({
+ 'pkg': require( './../package.json' ),
+ 'options': require( './../etc/cli_opts.json' ),
+ 'help': readFileSync( resolve( __dirname, '..', 'docs', 'usage.txt' ), {
+ 'encoding': 'utf8'
+ })
+ });
+
+ // Get any provided command-line options:
+ flags = cli.flags();
+ if ( flags.help || flags.version ) {
+ return;
+ }
+
+ // Get any provided command-line arguments:
+ args = cli.args();
+
+ // Print the signature(s) corresponding to a provided alias...
+ out = signature( args[ 0 ] );
+ if ( out ) {
+ console.log( out.join( '\n' ) ); // eslint-disable-line no-console
+ } else {
+ cli.close( 1 );
+ }
+}
+
+main();
diff --git a/datapackage.json b/datapackage.json
new file mode 100644
index 0000000..0ee3d95
--- /dev/null
+++ b/datapackage.json
@@ -0,0 +1,63 @@
+{
+ "name": "stdlib-alias-signature",
+ "version": "",
+ "title": "Standard Library Aliases and Signatures",
+ "description": "A mapping between standard library aliases and signatures.",
+ "resources": [
+ {
+ "name": "stdlib-alias-signature-json",
+ "title": "Standard Library Aliases and Signatures",
+ "description": "A mapping between standard library aliases and signatures.",
+ "format": "json",
+ "mediatype": "application/json",
+ "encoding": "UTF-8",
+ "hash": "",
+ "path": "./data/data.json"
+ },
+ {
+ "name": "stdlib-alias-signature-csv",
+ "title": "Standard Library Aliases and Signatures",
+ "description": "A mapping between standard library aliases and signatures.",
+ "format": "csv",
+ "mediatype": "plain/csv",
+ "encoding": "UTF-8",
+ "hash": "",
+ "path": "./data/data.csv",
+ "schema": {
+ "fields": [
+ {
+ "name": "alias",
+ "title": "Alias",
+ "description": "Alias.",
+ "type": "string",
+ "format": "default"
+ },
+ {
+ "name": "signature",
+ "title": "Signature",
+ "description": "Signature.",
+ "type": "string",
+ "format": "default"
+ }
+ ]
+ }
+ }
+ ],
+ "sources": [],
+ "keywords": [
+ "stdlib",
+ "namespace",
+ "aliases",
+ "help",
+ "text",
+ "txt",
+ "docs",
+ "documentation",
+ "repl",
+ "usage",
+ "signature",
+ "interface",
+ "api"
+ ],
+ "license": "PDDL-1.0 AND CC0-1.0"
+}
diff --git a/docs/repl.txt b/docs/repl.txt
new file mode 100644
index 0000000..9bc1e3a
--- /dev/null
+++ b/docs/repl.txt
@@ -0,0 +1,21 @@
+
+{{alias}}( alias )
+ Returns the signature(s) associated with a provided alias.
+
+ Parameters
+ ----------
+ alias: string
+ Alias.
+
+ Returns
+ -------
+ out: Array|null
+ Signature(s).
+
+ Examples
+ --------
+ > var out = {{alias}}( '{{alias:@stdlib/math/base/special/sin}}' )
+
+ See Also
+ --------
+
diff --git a/docs/types/index.d.ts b/docs/types/index.d.ts
new file mode 100644
index 0000000..6be135d
--- /dev/null
+++ b/docs/types/index.d.ts
@@ -0,0 +1,35 @@
+/*
+* @license Apache-2.0
+*
+* Copyright (c) 2019 The Stdlib Authors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+// TypeScript Version: 2.0
+
+/**
+* Returns the signature(s) associated with a specified alias.
+*
+* @param alias - alias
+* @returns signatures
+*
+* @example
+* var out = signature( 'base.sin' );
+*/
+declare function signature( alias: string ): Array | null;
+
+
+// EXPORTS //
+
+export = signature;
diff --git a/docs/types/test.ts b/docs/types/test.ts
new file mode 100644
index 0000000..862c1b8
--- /dev/null
+++ b/docs/types/test.ts
@@ -0,0 +1,44 @@
+/*
+* @license Apache-2.0
+*
+* Copyright (c) 2019 The Stdlib Authors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+import signature = require( './index' );
+
+
+// TESTS //
+
+// The function returns an array of strings or null...
+{
+ signature( 'base.sin' ); // $ExpectType string[] | null
+}
+
+// The compiler throws an error if the function is not provided a string...
+{
+ signature( 5 ); // $ExpectError
+ signature( true ); // $ExpectError
+ signature( false ); // $ExpectError
+ signature( null ); // $ExpectError
+ signature( undefined ); // $ExpectError
+ signature( [] ); // $ExpectError
+ signature( {} ); // $ExpectError
+ signature( ( x: number ): number => x ); // $ExpectError
+}
+
+// The compiler throws an error if the function is provided an unsupported number of arguments...
+{
+ signature( 'base.sin', 'beep' ); // $ExpectError
+}
diff --git a/docs/usage.txt b/docs/usage.txt
new file mode 100644
index 0000000..f81cfcb
--- /dev/null
+++ b/docs/usage.txt
@@ -0,0 +1,8 @@
+
+Usage: stdlib-alias-signature [options]
+
+Options:
+
+ -h, --help Print this message.
+ -V, --version Print the package version.
+
diff --git a/etc/cli_opts.json b/etc/cli_opts.json
new file mode 100644
index 0000000..92119c4
--- /dev/null
+++ b/etc/cli_opts.json
@@ -0,0 +1,15 @@
+{
+ "string": [],
+ "boolean": [
+ "help",
+ "version"
+ ],
+ "alias": {
+ "help": [
+ "h"
+ ],
+ "version": [
+ "V"
+ ]
+ }
+}
diff --git a/examples/index.js b/examples/index.js
new file mode 100644
index 0000000..7054ce5
--- /dev/null
+++ b/examples/index.js
@@ -0,0 +1,40 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2019 The Stdlib Authors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+'use strict';
+
+var discreteUniform = require( '@stdlib/random-base-discrete-uniform' );
+var aliases = require( '@stdlib/namespace-aliases' );
+var signature = require( './../lib' );
+
+var list;
+var len;
+var idx;
+var sig;
+var i;
+
+list = aliases();
+len = list.length;
+
+for ( i = 0; i < 100; i++ ) {
+ idx = discreteUniform( 0, len-1 );
+ sig = signature( list[ idx ] );
+ if ( sig ) {
+ console.log( sig.join( '\n' ) );
+ }
+}
diff --git a/lib/index.js b/lib/index.js
new file mode 100644
index 0000000..95d6d3f
--- /dev/null
+++ b/lib/index.js
@@ -0,0 +1,40 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2019 The Stdlib Authors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+'use strict';
+
+/**
+* Return the signature(s) associated with a provided alias.
+*
+* @module @stdlib/repl/signature
+*
+* @example
+* var signature = require( '@stdlib/repl-signature' );
+*
+* var out = signature( 'base.sin' );
+* // returns [ '...' ]
+*/
+
+// MODULES //
+
+var signature = require( './main.js' );
+
+
+// EXPORTS //
+
+module.exports = signature;
diff --git a/lib/main.js b/lib/main.js
new file mode 100644
index 0000000..f3fa013
--- /dev/null
+++ b/lib/main.js
@@ -0,0 +1,58 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2019 The Stdlib Authors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+'use strict';
+
+// MODULES //
+
+var isString = require( '@stdlib/assert-is-string' ).isPrimitive;
+var ALIAS_TO_SIGNATURE = require( './../data/data.json' );
+
+
+// MAIN //
+
+/**
+* Returns the signature(s) associated with a specified alias.
+*
+* @param {string} alias - alias
+* @throws {TypeError} must provide a string
+* @returns {(StringArray|null)} signature(s)
+*
+* @example
+* var out = signature( 'base.sin' );
+* // returns [ '...' ]
+*/
+function signature( alias ) {
+ var out;
+ var i;
+ if ( !isString( alias ) ) {
+ throw new TypeError( 'invalid argument. Must provide a string. Value: `' + alias + '`.' );
+ }
+ out = [];
+ for ( i = 0; i < ALIAS_TO_SIGNATURE.length; i++ ) {
+ if ( ALIAS_TO_SIGNATURE[ i ][ 0 ] === alias ) {
+ out.push( ALIAS_TO_SIGNATURE[ i ][ 1 ] );
+ }
+ }
+ return ( out.length ) ? out : null;
+}
+
+
+// EXPORTS //
+
+module.exports = signature;
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..654968a
--- /dev/null
+++ b/package.json
@@ -0,0 +1,94 @@
+{
+ "name": "@stdlib/repl-signature",
+ "version": "0.0.0",
+ "description": "Return the signature(s) associated with a provided alias.",
+ "license": "Apache-2.0",
+ "author": {
+ "name": "The Stdlib Authors",
+ "url": "https://github.com/stdlib-js/stdlib/graphs/contributors"
+ },
+ "contributors": [
+ {
+ "name": "The Stdlib Authors",
+ "url": "https://github.com/stdlib-js/stdlib/graphs/contributors"
+ }
+ ],
+ "bin": {
+ "stdlib-alias-signature": "./bin/cli"
+ },
+ "main": "./lib",
+ "directories": {
+ "benchmark": "./benchmark",
+ "bin": "./bin",
+ "data": "./data",
+ "doc": "./docs",
+ "example": "./examples",
+ "lib": "./lib",
+ "test": "./test"
+ },
+ "types": "./docs/types",
+ "scripts": {
+ "test": "make test",
+ "test-cov": "make test-cov",
+ "examples": "make examples"
+ },
+ "homepage": "https://github.com/stdlib-js/stdlib",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/stdlib-js/repl-signature.git"
+ },
+ "bugs": {
+ "url": "https://github.com/stdlib-js/stdlib/issues"
+ },
+ "dependencies": {
+ "@stdlib/assert-is-string": "^0.0.x",
+ "@stdlib/cli": "^0.0.x",
+ "@stdlib/fs-read-file": "^0.0.x"
+ },
+ "devDependencies": {
+ "@stdlib/assert-is-browser": "^0.0.x",
+ "@stdlib/assert-is-string-array": "^0.0.x",
+ "@stdlib/assert-is-windows": "^0.0.x",
+ "@stdlib/bench": "^0.0.x",
+ "@stdlib/fs-write-file": "^0.0.x",
+ "@stdlib/namespace-aliases": "^0.0.x",
+ "@stdlib/process-exec-path": "^0.0.x",
+ "@stdlib/random-base-discrete-uniform": "^0.0.x",
+ "@stdlib/repl-help": "^0.0.x",
+ "@stdlib/string-replace": "^0.0.x",
+ "tape": "git+https://github.com/kgryte/tape.git#fix/globby",
+ "istanbul": "^0.4.1",
+ "tap-spec": "5.x.x"
+ },
+ "engines": {
+ "node": ">=0.10.0",
+ "npm": ">2.7.0"
+ },
+ "os": [
+ "aix",
+ "darwin",
+ "freebsd",
+ "linux",
+ "macos",
+ "openbsd",
+ "sunos",
+ "win32",
+ "windows"
+ ],
+ "keywords": [
+ "stdlib",
+ "repl",
+ "docs",
+ "help",
+ "documentation",
+ "man",
+ "manual",
+ "signature",
+ "interface",
+ "api"
+ ],
+ "funding": {
+ "type": "patreon",
+ "url": "https://www.patreon.com/athan"
+ }
+}
diff --git a/test/test.cli.js b/test/test.cli.js
new file mode 100644
index 0000000..27bce0c
--- /dev/null
+++ b/test/test.cli.js
@@ -0,0 +1,185 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2019 The Stdlib Authors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+'use strict';
+
+// MODULES //
+
+var resolve = require( 'path' ).resolve;
+var exec = require( 'child_process' ).exec;
+var tape = require( 'tape' );
+var IS_BROWSER = require( '@stdlib/assert-is-browser' );
+var IS_WINDOWS = require( '@stdlib/assert-is-windows' );
+var readFileSync = require( '@stdlib/fs-read-file' ).sync;
+var EXEC_PATH = require( '@stdlib/process-exec-path' );
+
+
+// VARIABLES //
+
+var fpath = resolve( __dirname, '..', 'bin', 'cli' );
+var opts = {
+ 'skip': IS_BROWSER || IS_WINDOWS
+};
+
+
+// FIXTURES //
+
+var PKG_VERSION = require( './../package.json' ).version;
+
+
+// TESTS //
+
+tape( 'command-line interface', function test( t ) {
+ t.ok( true, __filename );
+ t.end();
+});
+
+tape( 'when invoked with a `--help` flag, the command-line interface prints the help text to `stderr`', opts, function test( t ) {
+ var expected;
+ var cmd;
+
+ expected = readFileSync( resolve( __dirname, '..', 'docs', 'usage.txt' ), {
+ 'encoding': 'utf8'
+ });
+ cmd = [
+ EXEC_PATH,
+ fpath,
+ '--help'
+ ];
+
+ exec( cmd.join( ' ' ), done );
+
+ function done( error, stdout, stderr ) {
+ if ( error ) {
+ t.fail( error.message );
+ } else {
+ t.strictEqual( stdout.toString(), '', 'does not print to `stdout`' );
+ t.strictEqual( stderr.toString(), expected+'\n', 'expected value' );
+ }
+ t.end();
+ }
+});
+
+tape( 'when invoked with a `-h` flag, the command-line interface prints the help text to `stderr`', opts, function test( t ) {
+ var expected;
+ var cmd;
+
+ expected = readFileSync( resolve( __dirname, '..', 'docs', 'usage.txt' ), {
+ 'encoding': 'utf8'
+ });
+ cmd = [
+ EXEC_PATH,
+ fpath,
+ '-h'
+ ];
+
+ exec( cmd.join( ' ' ), done );
+
+ function done( error, stdout, stderr ) {
+ if ( error ) {
+ t.fail( error.message );
+ } else {
+ t.strictEqual( stdout.toString(), '', 'does not print to `stdout`' );
+ t.strictEqual( stderr.toString(), expected+'\n', 'expected value' );
+ }
+ t.end();
+ }
+});
+
+tape( 'when invoked with a `--version` flag, the command-line interface prints the version to `stderr`', opts, function test( t ) {
+ var cmd = [
+ EXEC_PATH,
+ fpath,
+ '--version'
+ ];
+
+ exec( cmd.join( ' ' ), done );
+
+ function done( error, stdout, stderr ) {
+ if ( error ) {
+ t.fail( error.message );
+ } else {
+ t.strictEqual( stdout.toString(), '', 'does not print to `stdout`' );
+ t.strictEqual( stderr.toString(), PKG_VERSION+'\n', 'expected value' );
+ }
+ t.end();
+ }
+});
+
+tape( 'when invoked with a `-V` flag, the command-line interface prints the version to `stderr`', opts, function test( t ) {
+ var cmd = [
+ EXEC_PATH,
+ fpath,
+ '-V'
+ ];
+
+ exec( cmd.join( ' ' ), done );
+
+ function done( error, stdout, stderr ) {
+ if ( error ) {
+ t.fail( error.message );
+ } else {
+ t.strictEqual( stdout.toString(), '', 'does not print to `stdout`' );
+ t.strictEqual( stderr.toString(), PKG_VERSION+'\n', 'expected value' );
+ }
+ t.end();
+ }
+});
+
+tape( 'the command-line interface prints signatures', opts, function test( t ) {
+ var cmd = [
+ EXEC_PATH,
+ fpath,
+ 'base.sin'
+ ];
+
+ exec( cmd.join( ' ' ), done );
+
+ function done( error, stdout, stderr ) {
+ if ( error ) {
+ t.fail( error.message );
+ } else {
+ stdout = stdout.toString().split( '\n' );
+
+ // Greater than 1 in order to include the trailing newline:
+ t.strictEqual( stdout.length > 1, true, 'prints signatures' );
+ t.strictEqual( stderr.toString(), '', 'does not print to `stderr`' );
+ }
+ t.end();
+ }
+});
+
+tape( 'if unable to resolve signatures, the command-line interface sets a non-zero exit code', opts, function test( t ) {
+ var cmd = [
+ EXEC_PATH,
+ fpath,
+ 'fjaldfjadljfeoejreandfljasdfjadsfjs'
+ ];
+
+ exec( cmd.join( ' ' ), done );
+
+ function done( error, stdout, stderr ) {
+ if ( error ) {
+ t.pass( error.message );
+ t.strictEqual( error.code, 1, 'expected exit code' );
+ }
+ t.strictEqual( stdout.toString(), '', 'does not print to` stdout`' );
+ t.strictEqual( stderr.toString(), '', 'does not print to `stderr`' );
+ t.end();
+ }
+});
diff --git a/test/test.js b/test/test.js
new file mode 100644
index 0000000..cbd5ebf
--- /dev/null
+++ b/test/test.js
@@ -0,0 +1,101 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2019 The Stdlib Authors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+'use strict';
+
+// MODULES //
+
+var tape = require( 'tape' );
+var aliases = require( '@stdlib/namespace-aliases' );
+var DATA = require( './../data/data.json' );
+var signature = require( './../lib' );
+
+
+// TESTS //
+
+tape( 'main export is a function', function test( t ) {
+ t.ok( true, __filename );
+ t.strictEqual( typeof signature, 'function', 'main export is a function' );
+ t.end();
+});
+
+tape( 'the function throws an error if not provided a string', function test( t ) {
+ var values;
+ var i;
+
+ values = [
+ 5,
+ NaN,
+ true,
+ false,
+ null,
+ void 0,
+ [],
+ {},
+ function noop() {}
+ ];
+ for ( i = 0; i < values.length; i++ ) {
+ t.throws( badValue( values[i] ), TypeError, 'throws an error when provided '+values[i] );
+ }
+ t.end();
+
+ function badValue( value ) {
+ return function badValue() {
+ signature( value );
+ };
+ }
+});
+
+tape( 'the function returns one or more signatures', function test( t ) {
+ var expected;
+ var actual;
+ var list;
+ var i;
+ var j;
+
+ list = aliases();
+ for ( i = 0; i < list.length; i++ ) {
+ expected = [];
+ for ( j = 0; j < DATA.length; j++ ) {
+ if ( DATA[ j ][ 0 ] === list[ i ] ) {
+ expected.push( DATA[ j ][ 1 ] );
+ }
+ }
+ if ( expected.length === 0 ) {
+ expected = null;
+ }
+ actual = signature( list[i] );
+ t.deepEqual( actual, expected, 'returns expected value for '+list[i] );
+ }
+ t.end();
+});
+
+tape( 'the function returns `null` if provided an unrecognized alias', function test( t ) {
+ var values;
+ var i;
+
+ values = [
+ 'adfkaljdfdsafs',
+ 'adklfadjflajdslfjalsdf',
+ 'adflkajdlkfjasdlkfjsadlkfjlasdjflsdjfla'
+ ];
+ for ( i = 0; i < values.length; i++ ) {
+ t.strictEqual( signature( values[ i ] ), null, 'returns expected value' );
+ }
+ t.end();
+});