Repository: char0n/ramda-adjunct
Pull request #1258 (2020-01-07 13:39:25)

test: add ramda placeholder and make tests consistent
Batch 10

Files:
test/
- isPromise.js
- isRegexp.js
- isString.js
- isSymbol.js
- isThenable.js

src/
- isPromise.js
- isRegexp.js
- isString.js


Patch:
diff --git a/README.md b/README.md
index a4315d7692..a8e2c389fb 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@
 [![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/char0n/ramda-adjunct/issues)
 [![try on RunKit](https://img.shields.io/badge/try%20on-RunKit-brightgreen.svg?style=flat)](https://npm.runkit.com/ramda-adjunct)
 [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fchar0n%2Framda-adjunct.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fchar0n%2Framda-adjunct?ref=badge_shield)
-[![Backers on Open Collective](https://opencollective.com/ramda-adjunct/backers/badge.svg)](#backers) 
+[![Backers on Open Collective](https://opencollective.com/ramda-adjunct/backers/badge.svg)](#backers)
 [![Sponsors on Open Collective](https://opencollective.com/ramda-adjunct/sponsors/badge.svg)](#sponsors)
 [![Join the chat at https://gitter.im/ramda-adjunct/Lobby](https://badges.gitter.im/ramda-adjunct/Lobby.svg)](https://gitter.im/ramda-adjunct/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
 [![Open Source Helpers](https://www.codetriage.com/char0n/ramda-adjunct/badges/users.svg)](https://www.codetriage.com/char0n/ramda-adjunct)
@@ -21,14 +21,14 @@
 <p align="center"><img src="https://raw.githubusercontent.com/char0n/ramda-adjunct/master/logo.jpg" width="250" height="200" /></p>
 
 
-Ramda Adjunct is the most popular and most comprehensive set of functional utilities for use with Ramda, providing a variety of useful, well tested functions with excellent documentation. 
+Ramda Adjunct is the most popular and most comprehensive set of functional utilities for use with Ramda, providing a variety of useful, well tested functions with excellent documentation.
 
 For a full list of functions see the [**Documentation For The Latest Release**](https://char0n.github.io/ramda-adjunct).
 
 Adjunct is a thing added to something else as a supplementary rather than an essential part. And that something is being ramda.
 
-Follow Ramda Adjunct on [**medium.com/ramda-adjunct**](https://medium.com/ramda-adjunct) to read latest news and 
-articles about the library. 
+Follow Ramda Adjunct on [**medium.com/ramda-adjunct**](https://medium.com/ramda-adjunct) to read latest news and
+articles about the library.
 
 <table>
   <tr>
@@ -38,7 +38,7 @@ articles about the library.
       <td valign="middle">
         <a href="https://tidelift.com/subscription/pkg/npm-ramda-adjunct?utm_source=npm-ramda-adjunct&utm_medium=referral&utm_campaign=readme">
             Get professionally supported ramda-adjunct with Tidelift Subscription.
-        </a>    
+        </a>
       </td>
   </tr>
 </table>
@@ -124,7 +124,7 @@ _Do you want to find out more about why this library exists ? Read this [**artic
 
 ## Requirements
 
- - ramda >= 0.19.0 <= 0.26.1 
+ - ramda >= 0.19.0 <= 0.26.1
  - node >= 0.10.48
 
 Ramda Adjunct is being automatically tested against node version >=8 <=11.
@@ -138,9 +138,9 @@ It is also possible that our ES5 distributions run on node versions older than 0
 ## API Documentation
 
  [LATEST](https://char0n.github.io/ramda-adjunct),
- [PREVIOUS](https://char0n.github.io/ramda-adjunct/2.23.0), 
- [ALL VERSIONS](./VERSIONS.md) 
- 
+ [PREVIOUS](https://char0n.github.io/ramda-adjunct/2.23.0),
+ [ALL VERSIONS](./VERSIONS.md)
+
 ## Wrote about us
 
 - [Ramda — R.adjust](https://medium.com/@kyletilman/ramda-r-adjust-b69a575274fa)
@@ -193,7 +193,7 @@ If you want to contribute to this project, please consult the [CONTRIBUTING.md](
 
 **Running linter**
 
-We're using [eslint](https://eslint.org/) and [airbnb codestyle](https://github.com/airbnb/javascript) rules with [prettier](https://prettier.io/) integrated as an eslint plugin.  
+We're using [eslint](https://eslint.org/) and [airbnb codestyle](https://github.com/airbnb/javascript) rules with [prettier](https://prettier.io/) integrated as an eslint plugin.
 
 ```sh
  $ npm run lint
@@ -234,7 +234,7 @@ You can always find fresh build files in circle-ci [artifacts](https://circleci.
 
 ## Tree shaking support
 
-Tree shaking is a term commonly used in a JavaScript context for dead-code elimination. It relies on the static structure of ES2015's module syntax, i.e. `import` and `export`. Ramda Adjunct natively supports tree shaking thanks to the way the code is organized and its use of ES2015 imports. 
+Tree shaking is a term commonly used in a JavaScript context for dead-code elimination. It relies on the static structure of ES2015's module syntax, i.e. `import` and `export`. Ramda Adjunct natively supports tree shaking thanks to the way the code is organized and its use of ES2015 imports.
 
 ```javascript
   import * as RA from 'ramda-adjunct';
@@ -249,11 +249,6 @@ Tree shaking is a term commonly used in a JavaScript context for dead-code elimi
 
 These two statements are equivalent and _only_ `isArray` should be incorporated into your bundle. You can pick and choose the functions you need without worrying about the whole library being included in your build.
 
-## Contributing
-
-Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests to us.
-
-
 ## Assimilated libraries
 
  - [rcb](https://github.com/enten/rcb) - Ramda Cookbook implementation
diff --git a/package-lock.json b/package-lock.json
index ac1b4c917e..f6ee2e91ff 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1490,19 +1490,19 @@
       }
     },
     "@commitlint/cli": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-8.2.0.tgz",
-      "integrity": "sha512-8fJ5pmytc38yw2QWbTTJmXLfSiWPwMkHH4govo9zJ/+ERPBF2jvlxD/dQvk24ezcizjKc6LFka2edYC4OQ+Dgw==",
+      "version": "8.3.4",
+      "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-8.3.4.tgz",
+      "integrity": "sha512-lYL61eO5CG5Du3YTOt8eXg959awIpl/u2KL+msctbooUGTDtiknvBb1r7dbdpUYwVMWcgdKQsk9heB+FRdygfA==",
       "dev": true,
       "requires": {
-        "@commitlint/format": "^8.2.0",
-        "@commitlint/lint": "^8.2.0",
-        "@commitlint/load": "^8.2.0",
-        "@commitlint/read": "^8.2.0",
+        "@commitlint/format": "^8.3.4",
+        "@commitlint/lint": "^8.3.4",
+        "@commitlint/load": "^8.3.4",
+        "@commitlint/read": "^8.3.4",
         "babel-polyfill": "6.26.0",
         "chalk": "2.4.2",
         "get-stdin": "7.0.0",
-        "lodash": "4.17.14",
+        "lodash": "4.17.15",
         "meow": "5.0.0",
         "resolve-from": "5.0.0",
         "resolve-global": "1.0.0"
@@ -1519,6 +1519,12 @@
             "supports-color": "^5.3.0"
           }
         },
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+          "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
+        },
         "resolve-from": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
@@ -1528,78 +1534,110 @@
       }
     },
     "@commitlint/config-conventional": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-8.2.0.tgz",
-      "integrity": "sha512-HuwlHQ3DyVhpK9GHgTMhJXD8Zp8PGIQVpQGYh/iTrEU6TVxdRC61BxIDZvfWatCaiG617Z/U8maRAFrqFM4TqA==",
-      "dev": true
+      "version": "8.3.4",
+      "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-8.3.4.tgz",
+      "integrity": "sha512-w0Yc5+aVAjZgjYqx29igBOnVCj8O22gy3Vo6Fyp7PwoS7+AYS1x3sN7IBq6i7Ae15Mv5P+rEx1pkxXo5zOMe4g==",
+      "dev": true,
+      "requires": {
+        "conventional-changelog-conventionalcommits": "4.2.1"
+      },
+      "dependencies": {
+        "conventional-changelog-conventionalcommits": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.2.1.tgz",
+          "integrity": "sha512-vC02KucnkNNap+foDKFm7BVUSDAXktXrUJqGszUuYnt6T0J2azsbYz/w9TDc3VsrW2v6JOtiQWVcgZnporHr4Q==",
+          "dev": true,
+          "requires": {
+            "compare-func": "^1.3.1",
+            "lodash": "^4.2.1",
+            "q": "^1.5.1"
+          }
+        }
+      }
     },
     "@commitlint/ensure": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-8.2.0.tgz",
-      "integrity": "sha512-XZZih/kcRrqK7lEORbSYCfqQw6byfsFbLygRGVdJMlCPGu9E2MjpwCtoj5z7y/lKfUB3MJaBhzn2muJqS1gC6A==",
+      "version": "8.3.4",
+      "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-8.3.4.tgz",
+      "integrity": "sha512-8NW77VxviLhD16O3EUd02lApMFnrHexq10YS4F4NftNoErKbKaJ0YYedktk2boKrtNRf/gQHY/Qf65edPx4ipw==",
       "dev": true,
       "requires": {
-        "lodash": "4.17.14"
+        "lodash": "4.17.15"
+      },
+      "dependencies": {
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+          "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
+        }
       }
     },
     "@commitlint/execute-rule": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-8.2.0.tgz",
-      "integrity": "sha512-9MBRthHaulbWTa8ReG2Oii2qc117NuvzhZdnkuKuYLhker7sUXGFcVhLanuWUKGyfyI2o9zVr/NHsNbCCsTzAA==",
+      "version": "8.3.4",
+      "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-8.3.4.tgz",
+      "integrity": "sha512-f4HigYjeIBn9f7OuNv5zh2y5vWaAhNFrfeul8CRJDy82l3Y+09lxOTGxfF3uMXKrZq4LmuK6qvvRCZ8mUrVvzQ==",
       "dev": true
     },
     "@commitlint/format": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-8.2.0.tgz",
-      "integrity": "sha512-sA77agkDEMsEMrlGhrLtAg8vRexkOofEEv/CZX+4xlANyAz2kNwJvMg33lcL65CBhqKEnRRJRxfZ1ZqcujdKcQ==",
+      "version": "8.3.4",
+      "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-8.3.4.tgz",
+      "integrity": "sha512-809wlQ/ND6CLZON+w2Rb3YM2TLNDfU2xyyqpZeqzf2reJNpySMSUAeaO/fNDJSOKIsOsR3bI01rGu6hv28k+Nw==",
       "dev": true,
       "requires": {
         "chalk": "^2.0.1"
       }
     },
     "@commitlint/is-ignored": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-8.2.0.tgz",
-      "integrity": "sha512-ADaGnKfbfV6KD1pETp0Qf7XAyc75xTy3WJlbvPbwZ4oPdBMsXF0oXEEGMis6qABfU2IXan5/KAJgAFX3vdd0jA==",
+      "version": "8.3.4",
+      "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-8.3.4.tgz",
+      "integrity": "sha512-9RTWJvOW2ZvOh09xRnw7wQhcSp24ekeChDPAoZV13d5cTay0qcGFFthvwHs6URstKuu6Iasoxswtq0HmTWvoAg==",
       "dev": true,
       "requires": {
         "@types/semver": "^6.0.1",
-        "semver": "6.2.0"
+        "semver": "6.3.0"
       },
       "dependencies": {
         "semver": {
-          "version": "6.2.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz",
-          "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==",
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
           "dev": true
         }
       }
     },
     "@commitlint/lint": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-8.2.0.tgz",
-      "integrity": "sha512-ch9JN8aR37ufdjoWv50jLfvFz9rWMgLW5HEkMGLsM/51gjekmQYS5NJg8S2+6F5+jmralAO7VkUMI6FukXKX0A==",
+      "version": "8.3.4",
+      "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-8.3.4.tgz",
+      "integrity": "sha512-ws1JLs7rNAcwlfYLKh0xhs3RNMcT4dYjyG0US/JenmSCrttzfAct+7IvdkAjkj6/3jsOn6fYaV4MhE6hfdPC9A==",
       "dev": true,
       "requires": {
-        "@commitlint/is-ignored": "^8.2.0",
-        "@commitlint/parse": "^8.2.0",
-        "@commitlint/rules": "^8.2.0",
+        "@commitlint/is-ignored": "^8.3.4",
+        "@commitlint/parse": "^8.3.4",
+        "@commitlint/rules": "^8.3.4",
         "babel-runtime": "^6.23.0",
-        "lodash": "4.17.14"
+        "lodash": "4.17.15"
+      },
+      "dependencies": {
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+          "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
+        }
       }
     },
     "@commitlint/load": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-8.2.0.tgz",
-      "integrity": "sha512-EV6PfAY/p83QynNd1llHxJiNxKmp43g8+7dZbyfHFbsGOdokrCnoelAVZ+WGgktXwLN/uXyfkcIAxwac015UYw==",
+      "version": "8.3.4",
+      "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-8.3.4.tgz",
+      "integrity": "sha512-B4MylKvT02UE3VHC5098OHxsrgkADUy5AD4Cdkiy7oX/edWypEmvK7Wuns3B9dwluWP/iFM6daoWtpkCVZoRwQ==",
       "dev": true,
       "requires": {
-        "@commitlint/execute-rule": "^8.2.0",
-        "@commitlint/resolve-extends": "^8.2.0",
+        "@commitlint/execute-rule": "^8.3.4",
+        "@commitlint/resolve-extends": "^8.3.4",
         "babel-runtime": "^6.23.0",
         "chalk": "2.4.2",
         "cosmiconfig": "^5.2.0",
-        "lodash": "4.17.14",
+        "lodash": "4.17.15",
         "resolve-from": "^5.0.0"
       },
       "dependencies": {
@@ -1614,6 +1652,12 @@
             "supports-color": "^5.3.0"
           }
         },
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+          "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
+        },
         "resolve-from": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
@@ -1623,51 +1667,51 @@
       }
     },
     "@commitlint/message": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-8.2.0.tgz",
-      "integrity": "sha512-LNsSwDLIFgE3nb/Sb1PIluYNy4Q8igdf4tpJCdv5JJDf7CZCZt3ZTglj0YutZZorpRRuHJsVIB2+dI4bVH3bFw==",
+      "version": "8.3.4",
+      "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-8.3.4.tgz",
+      "integrity": "sha512-nEj5tknoOKXqBsaQtCtgPcsAaf5VCg3+fWhss4Vmtq40633xLq0irkdDdMEsYIx8rGR0XPBTukqzln9kAWCkcA==",
       "dev": true
     },
     "@commitlint/parse": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-8.2.0.tgz",
-      "integrity": "sha512-vzouqroTXG6QXApkrps0gbeSYW6w5drpUk7QAeZIcaCSPsQXDM8eqqt98ZzlzLJHo5oPNXPX1AAVSTrssvHemA==",
+      "version": "8.3.4",
+      "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-8.3.4.tgz",
+      "integrity": "sha512-b3uQvpUQWC20EBfKSfMRnyx5Wc4Cn778bVeVOFErF/cXQK725L1bYFvPnEjQO/GT8yGVzq2wtLaoEqjm1NJ/Bw==",
       "dev": true,
       "requires": {
         "conventional-changelog-angular": "^1.3.3",
-        "conventional-commits-parser": "^2.1.0",
+        "conventional-commits-parser": "^3.0.0",
         "lodash": "^4.17.11"
       }
     },
     "@commitlint/read": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-8.2.0.tgz",
-      "integrity": "sha512-1tBai1VuSQmsOTsvJr3Fi/GZqX3zdxRqYe/yN4i3cLA5S2Y4QGJ5I3l6nGZlKgm/sSelTCVKHltrfWU8s5H7SA==",
+      "version": "8.3.4",
+      "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-8.3.4.tgz",
+      "integrity": "sha512-FKv1kHPrvcAG5j+OSbd41IWexsbLhfIXpxVC/YwQZO+FR0EHmygxQNYs66r+GnhD1EfYJYM4WQIqd5bJRx6OIw==",
       "dev": true,
       "requires": {
-        "@commitlint/top-level": "^8.2.0",
+        "@commitlint/top-level": "^8.3.4",
         "@marionebl/sander": "^0.6.0",
         "babel-runtime": "^6.23.0",
-        "git-raw-commits": "^1.3.0"
+        "git-raw-commits": "^2.0.0"
       }
     },
     "@commitlint/resolve-extends": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-8.2.0.tgz",
-      "integrity": "sha512-cwi0HUsDcD502HBP8huXfTkVuWmeo1Fiz3GKxNwMBBsJV4+bKa7QrtxbNpXhVuarX7QjWfNTvmW6KmFS7YK9uw==",
+      "version": "8.3.4",
+      "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-8.3.4.tgz",
+      "integrity": "sha512-M34RLaAW1eGWgtkVtotHfPaJa+cZIARe8twKItd7RhWs7n/1W2py9GTFIiIEq95LBN1uah5vm1WQHsfLqPZYHA==",
       "dev": true,
       "requires": {
         "@types/node": "^12.0.2",
         "import-fresh": "^3.0.0",
-        "lodash": "4.17.14",
+        "lodash": "4.17.15",
         "resolve-from": "^5.0.0",
         "resolve-global": "^1.0.0"
       },
       "dependencies": {
         "import-fresh": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz",
-          "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==",
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
+          "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
           "dev": true,
           "requires": {
             "parent-module": "^1.0.0",
@@ -1682,6 +1726,12 @@
             }
           }
         },
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+          "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
+        },
         "resolve-from": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
@@ -1691,27 +1741,27 @@
       }
     },
     "@commitlint/rules": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-8.2.0.tgz",
-      "integrity": "sha512-FlqSBBP2Gxt5Ibw+bxdYpzqYR6HI8NIBpaTBhAjSEAduQtdWFMOhF0zsgkwH7lHN7opaLcnY2fXxAhbzTmJQQA==",
+      "version": "8.3.4",
+      "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-8.3.4.tgz",
+      "integrity": "sha512-xuC9dlqD5xgAoDFgnbs578cJySvwOSkMLQyZADb1xD5n7BNcUJfP8WjT9W1Aw8K3Wf8+Ym/ysr9FZHXInLeaRg==",
       "dev": true,
       "requires": {
-        "@commitlint/ensure": "^8.2.0",
-        "@commitlint/message": "^8.2.0",
-        "@commitlint/to-lines": "^8.2.0",
+        "@commitlint/ensure": "^8.3.4",
+        "@commitlint/message": "^8.3.4",
+        "@commitlint/to-lines": "^8.3.4",
         "babel-runtime": "^6.23.0"
       }
     },
     "@commitlint/to-lines": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-8.2.0.tgz",
-      "integrity": "sha512-LXTYG3sMenlN5qwyTZ6czOULVcx46uMy+MEVqpvCgptqr/MZcV/C2J+S2o1DGwj1gOEFMpqrZaE3/1R2Q+N8ng==",
+      "version": "8.3.4",
+      "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-8.3.4.tgz",
+      "integrity": "sha512-5AvcdwRsMIVq0lrzXTwpbbG5fKRTWcHkhn/hCXJJ9pm1JidsnidS1y0RGkb3O50TEHGewhXwNoavxW9VToscUA==",
       "dev": true
     },
     "@commitlint/top-level": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-8.2.0.tgz",
-      "integrity": "sha512-Yaw4KmYNy31/HhRUuZ+fupFcDalnfpdu4JGBgGAqS9aBHdMSSWdWqtAaDaxdtWjTZeN3O0sA2gOhXwvKwiDwvw==",
+      "version": "8.3.4",
+      "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-8.3.4.tgz",
+      "integrity": "sha512-nOaeLBbAqSZNpKgEtO6NAxmui1G8ZvLG+0wb4rvv6mWhPDzK1GNZkCd8FUZPahCoJ1iHDoatw7F8BbJLg4nDjg==",
       "dev": true,
       "requires": {
         "find-up": "^4.0.0"
@@ -1737,9 +1787,9 @@
           }
         },
         "p-limit": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
-          "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
+          "version": "2.2.2",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
+          "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
           "dev": true,
           "requires": {
             "p-try": "^2.0.0"
@@ -1990,9 +2040,9 @@
       "dev": true
     },
     "@types/semver": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/@types/semver/-/semver-6.0.2.tgz",
-      "integrity": "sha512-G1Ggy7/9Nsa1Jt2yiBR2riEuyK2DFNnqow6R7cromXPMNynackRY1vqFTLz/gwnef1LHokbXThcPhqMRjUbkpQ==",
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/@types/semver/-/semver-6.2.0.tgz",
+      "integrity": "sha512-1OzrNb4RuAzIT7wHSsgZRlMBlNsJl+do6UblR7JMW4oB7bbR+uBEYtUh7gEc/jM84GGilh68lSOokyM/zNUlBA==",
       "dev": true
     },
     "@webassemblyjs/ast": {
@@ -3781,7 +3831,7 @@
     },
     "conventional-changelog-angular": {
       "version": "1.6.6",
-      "resolved": "http://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz",
+      "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz",
       "integrity": "sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg==",
       "dev": true,
       "requires": {
@@ -4053,42 +4103,34 @@
       }
     },
     "conventional-commits-parser": {
-      "version": "2.1.7",
-      "resolved": "http://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz",
-      "integrity": "sha512-BoMaddIEJ6B4QVMSDu9IkVImlGOSGA1I2BQyOZHeLQ6qVOJLcLKn97+fL6dGbzWEiqDzfH4OkcveULmeq2MHFQ==",
+      "version": "3.0.8",
+      "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.8.tgz",
+      "integrity": "sha512-YcBSGkZbYp7d+Cr3NWUeXbPDFUN6g3SaSIzOybi8bjHL5IJ5225OSCxJJ4LgziyEJ7AaJtE9L2/EU6H7Nt/DDQ==",
       "dev": true,
       "requires": {
         "JSONStream": "^1.0.4",
-        "is-text-path": "^1.0.0",
-        "lodash": "^4.2.1",
-        "meow": "^4.0.0",
+        "is-text-path": "^1.0.1",
+        "lodash": "^4.17.15",
+        "meow": "^5.0.0",
         "split2": "^2.0.0",
-        "through2": "^2.0.0",
+        "through2": "^3.0.0",
         "trim-off-newlines": "^1.0.0"
       },
       "dependencies": {
-        "meow": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz",
-          "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==",
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+          "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
+        },
+        "through2": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz",
+          "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==",
           "dev": true,
           "requires": {
-            "camelcase-keys": "^4.0.0",
-            "decamelize-keys": "^1.0.0",
-            "loud-rejection": "^1.0.0",
-            "minimist": "^1.1.3",
-            "minimist-options": "^3.0.1",
-            "normalize-package-data": "^2.3.4",
-            "read-pkg-up": "^3.0.0",
-            "redent": "^2.0.0",
-            "trim-newlines": "^2.0.0"
+            "readable-stream": "2 || 3"
           }
-        },
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
-          "dev": true
         }
       }
     },
@@ -7086,40 +7128,26 @@
       }
     },
     "git-raw-commits": {
-      "version": "1.3.6",
-      "resolved": "http://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.6.tgz",
-      "integrity": "sha512-svsK26tQ8vEKnMshTDatSIQSMDdz8CxIIqKsvPqbtV23Etmw6VNaFAitu8zwZ0VrOne7FztwPyRLxK7/DIUTQg==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.3.tgz",
+      "integrity": "sha512-SoSsFL5lnixVzctGEi2uykjA7B5I0AhO9x6kdzvGRHbxsa6JSEgrgy1esRKsfOKE1cgyOJ/KDR2Trxu157sb8w==",
       "dev": true,
       "requires": {
         "dargs": "^4.0.1",
         "lodash.template": "^4.0.2",
-        "meow": "^4.0.0",
+        "meow": "^5.0.0",
         "split2": "^2.0.0",
-        "through2": "^2.0.0"
+        "through2": "^3.0.0"
       },
       "dependencies": {
-        "meow": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz",
-          "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==",
+        "through2": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz",
+          "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==",
           "dev": true,
           "requires": {
-            "camelcase-keys": "^4.0.0",
-            "decamelize-keys": "^1.0.0",
-            "loud-rejection": "^1.0.0",
-            "minimist": "^1.1.3",
-            "minimist-options": "^3.0.1",
-            "normalize-package-data": "^2.3.4",
-            "read-pkg-up": "^3.0.0",
-            "redent": "^2.0.0",
-            "trim-newlines": "^2.0.0"
+            "readable-stream": "2 || 3"
           }
-        },
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
-          "dev": true
         }
       }
     },
diff --git a/package.json b/package.json
index 55a8b78515..6eab165e60 100644
--- a/package.json
+++ b/package.json
@@ -143,8 +143,8 @@
     "@babel/polyfill": "7.7.0",
     "@babel/preset-env": "7.7.7",
     "@babel/register": "7.7.7",
-    "@commitlint/cli": "8.2.0",
-    "@commitlint/config-conventional": "8.2.0",
+    "@commitlint/cli": "8.3.4",
+    "@commitlint/config-conventional": "8.3.4",
     "babel-loader": "8.0.6",
     "babel-plugin-annotate-pure-calls": "0.4.0",
     "babel-plugin-istanbul": "6.0.0",
diff --git a/src/index.js b/src/index.js
index fb9ecca516..24a7e82b6e 100644
--- a/src/index.js
+++ b/src/index.js
@@ -202,6 +202,7 @@ export { default as trimStart } from './trimStart';
 export { default as trimLeft } from './trimStart'; // alias of trimStart
 export { default as trimEnd } from './trimEnd';
 export { default as trimRight } from './trimEnd'; // alias of trimEnd
+export { default as trimCharsStart } from './trimCharsStart';
 export { default as padCharsStart } from './padCharsStart';
 export { default as padCharsEnd } from './padCharsEnd';
 export { default as padEnd } from './padEnd';
diff --git a/src/internal/polyfills/String.trimEnd.js b/src/internal/polyfills/String.trimEnd.js
index 4c5e20b90d..88dba39df7 100644
--- a/src/internal/polyfills/String.trimEnd.js
+++ b/src/internal/polyfills/String.trimEnd.js
@@ -1,5 +1,5 @@
 import { replace } from 'ramda';
 
-const trimStart = replace(/\s+$/, '');
+const trimStart = replace(/[\s\uFEFF\xA0]+$/, '');
 
 export default trimStart;
diff --git a/src/internal/polyfills/String.trimStart.js b/src/internal/polyfills/String.trimStart.js
index 0875eee2de..7b3ac28cd2 100644
--- a/src/internal/polyfills/String.trimStart.js
+++ b/src/internal/polyfills/String.trimStart.js
@@ -1,5 +1,5 @@
 import { replace } from 'ramda';
 
-const trimStart = replace(/^\s+/, '');
+const trimStart = replace(/^[\s\uFEFF\xA0]+/, '');
 
 export default trimStart;
diff --git a/src/isPromise.js b/src/isPromise.js
index fc7217042d..8bbaf2df16 100644
--- a/src/isPromise.js
+++ b/src/isPromise.js
@@ -1,4 +1,5 @@
 import { both, pipe, toString, equals } from 'ramda';
+import curry1 from 'ramda/src/internal/_curry1';
 
 import isObj from './isObj';
 
@@ -24,6 +25,8 @@ import isObj from './isObj';
  * RA.isPromise(Promise.reject()); // => true
  * RA.isPromise({ then: () => 1 }); // => false
  */
-const isPromise = both(isObj, pipe(toString, equals('[object Promise]')));
+const isPromise = curry1(
+  both(isObj, pipe(toString, equals('[object Promise]')))
+);
 
 export default isPromise;
diff --git a/src/isRegExp.js b/src/isRegExp.js
index 5f50bce4f1..fee3af5ef5 100644
--- a/src/isRegExp.js
+++ b/src/isRegExp.js
@@ -1,4 +1,5 @@
 import { type, identical, pipe } from 'ramda';
+import curry1 from 'ramda/src/internal/_curry1';
 
 /**
  * Checks if value is `RegExp` object.
@@ -17,6 +18,6 @@ import { type, identical, pipe } from 'ramda';
  * RA.isRegExp(/(?:)/); //=> true
  * RA.isRegExp(1); //=> false
  */
-const isRegExp = pipe(type, identical('RegExp'));
+const isRegExp = curry1(pipe(type, identical('RegExp')));
 
 export default isRegExp;
diff --git a/src/isString.js b/src/isString.js
index 0f7be8acb6..0c11a189b3 100644
--- a/src/isString.js
+++ b/src/isString.js
@@ -1,4 +1,5 @@
 import _isString from 'ramda/src/internal/_isString';
+import curry1 from 'ramda/src/internal/_curry1';
 
 /**
  * Checks if input value is `String`.
@@ -16,6 +17,6 @@ import _isString from 'ramda/src/internal/_isString';
  * RA.isString('abc'); //=> true
  * RA.isString(1); //=> false
  */
-const isString = _isString;
+const isString = curry1(_isString);
 
 export default isString;
diff --git a/src/trimCharsStart.js b/src/trimCharsStart.js
new file mode 100644
index 0000000000..50c66614d4
--- /dev/null
+++ b/src/trimCharsStart.js
@@ -0,0 +1,25 @@
+import { curry, dropWhile, join, pipe, split } from 'ramda';
+
+import contained from './contained';
+
+/**
+ * Removes leading specified characters from string.
+ *
+ * @func trimCharsStart
+ * @memberOf RA
+ * @since {@link https://char0n.github.io/ramda-adjunct/2.24.0|v2.24.0}
+ * @category String
+ * @sig String -> String
+ * @param {string} chars The characters to trim
+ * @param {string} value The characters to trim
+ * @return {string} Returns the trimmed string.
+ * @example
+ *
+ * RA.trimCharsStart('_-', '-_-abc-_-'); //=> 'abc-_-'
+ */
+
+const trimCharsStart = curry((chars, value) =>
+  pipe(split(''), dropWhile(contained(chars)), join(''))(value)
+);
+
+export default trimCharsStart;
diff --git a/types/index.d.ts b/types/index.d.ts
index e2305a315b..28b3151a73 100644
--- a/types/index.d.ts
+++ b/types/index.d.ts
@@ -1294,6 +1294,12 @@ declare namespace RamdaAdjunct {
         trimEnd(value: string): string;
         trimRight(value: string): string;
 
+        /**
+         * Removes leading specified characters from string.
+         */
+        trimCharsStart(chars: string, value: string): string;
+        trimCharsStart(chars: string): (value: string) => string;
+
         /**
          * The function pads the current string with a given string
          * (repeated, if needed) so that the resulting string reaches a given length.


Test patch:
diff --git a/test/isPromise.js b/test/isPromise.js
index dc13a7d4ee..38d795dddc 100644
--- a/test/isPromise.js
+++ b/test/isPromise.js
@@ -1,5 +1,5 @@
 import { assert } from 'chai';
-import { contains } from 'ramda';
+import * as R from 'ramda';
 
 import * as RA from '../src';
 import Symbol from './shared/Symbol';
@@ -41,7 +41,7 @@ describe('isPromise', function() {
   context('given value is an instance of native Promise', function() {
     const hasNativePromise =
       typeof Promise !== 'undefined' &&
-      contains('[native code]', Promise.toString());
+      R.contains('[native code]', Promise.toString());
 
     specify('should return true', function() {
       const resolvedP = Promise.resolve();
@@ -62,4 +62,10 @@ describe('isPromise', function() {
       assert.isFalse(RA.isPromise(func));
     });
   });
+
+  it('should support placeholder to specify "gaps"', function() {
+    const isPromise = RA.isPromise(R.__);
+
+    assert.isFalse(isPromise(1));
+  });
 });
diff --git a/test/isRegExp.js b/test/isRegExp.js
index 2418faf8ed..d2c6e7c7b8 100644
--- a/test/isRegExp.js
+++ b/test/isRegExp.js
@@ -1,34 +1,47 @@
 import { assert } from 'chai';
+import * as R from 'ramda';
 
 import * as RA from '../src';
 import args from './shared/arguments';
 import Symbol from './shared/Symbol';
 
 describe('isRegExp', function() {
-  it('tests a value for `RegExp`', function() {
-    assert.isTrue(RA.isRegExp(new RegExp()));
-    assert.isTrue(RA.isRegExp(/(?:)/));
+  context('given a `RegExp` value', function() {
+    specify('should return true', function() {
+      assert.isTrue(RA.isRegExp(new RegExp()));
+      assert.isTrue(RA.isRegExp(/(?:)/));
+    });
+  });
+
+  context('given a non `RegExp` value', function() {
+    specify('should return false', function() {
+      assert.isFalse(RA.isRegExp('a'));
+      assert.isFalse(RA.isRegExp(1));
+      assert.isFalse(RA.isRegExp([]));
+      assert.isFalse(RA.isRegExp({}));
+      assert.isFalse(RA.isRegExp(true));
+      assert.isFalse(RA.isRegExp(false));
+      assert.isFalse(RA.isRegExp(new Error()));
+      assert.isFalse(RA.isRegExp(new Date()));
+      assert.isFalse(RA.isRegExp(function() {}));
+      assert.isFalse(RA.isRegExp(Object(0)));
+      assert.isFalse(RA.isRegExp(Object('a')));
+      assert.isFalse(RA.isRegExp(Object(false)));
+      assert.isFalse(RA.isRegExp(RA));
+      assert.isFalse(RA.isRegExp(args));
 
-    assert.isFalse(RA.isRegExp('a'));
-    assert.isFalse(RA.isRegExp(1));
-    assert.isFalse(RA.isRegExp([]));
-    assert.isFalse(RA.isRegExp({}));
-    assert.isFalse(RA.isRegExp(true));
-    assert.isFalse(RA.isRegExp(false));
-    assert.isFalse(RA.isRegExp(new Error()));
-    assert.isFalse(RA.isRegExp(new Date()));
-    assert.isFalse(RA.isRegExp(function() {}));
-    assert.isFalse(RA.isRegExp(Object(0)));
-    assert.isFalse(RA.isRegExp(Object('a')));
-    assert.isFalse(RA.isRegExp(Object(false)));
-    assert.isFalse(RA.isRegExp(RA));
-    assert.isFalse(RA.isRegExp(args));
+      if (Symbol !== 'undefined') {
+        assert.isFalse(RA.isRegExp(Symbol));
+      }
+
+      assert.isFalse(RA.isRegExp(null));
+      assert.isFalse(RA.isRegExp(undefined));
+    });
+  });
 
-    if (Symbol !== 'undefined') {
-      assert.isFalse(RA.isRegExp(Symbol));
-    }
+  it('should support placeholder to specify "gaps"', function() {
+    const isRegExp = RA.isRegExp(R.__);
 
-    assert.isFalse(RA.isRegExp(null));
-    assert.isFalse(RA.isRegExp(undefined));
+    assert.isFalse(isRegExp(1));
   });
 });
diff --git a/test/isString.js b/test/isString.js
index a8f356b1cc..efbedf2eaa 100644
--- a/test/isString.js
+++ b/test/isString.js
@@ -1,26 +1,39 @@
 import { assert } from 'chai';
+import * as R from 'ramda';
 
 import * as RA from '../src';
 import Symbol from './shared/Symbol';
 import args from './shared/arguments';
 
 describe('isString', function() {
-  it('tests a value for `String`', function() {
-    assert.isTrue(RA.isString('abc'));
-    assert.isTrue(RA.isString(Object('abc')));
+  context('given a `String` value', function() {
+    specify('should return true', function() {
+      assert.isTrue(RA.isString('abc'));
+      assert.isTrue(RA.isString(Object('abc')));
+    });
+  });
+
+  context('given a non `String` value', function() {
+    specify('should return false', function() {
+      assert.isFalse(RA.isString(args));
+      assert.isFalse(RA.isString([1, 2, 3]));
+      assert.isFalse(RA.isString(true));
+      assert.isFalse(RA.isString(new Date()));
+      assert.isFalse(RA.isString(new Error()));
+      assert.isFalse(RA.isString(Array.prototype.slice));
+      assert.isFalse(RA.isString({ 0: 1, length: 1 }));
+      assert.isFalse(RA.isString(1));
+      assert.isFalse(RA.isString(/x/));
+
+      if (Symbol !== 'undefined') {
+        assert.isFalse(RA.isString(Symbol));
+      }
+    });
+  });
 
-    assert.isFalse(RA.isString(args));
-    assert.isFalse(RA.isString([1, 2, 3]));
-    assert.isFalse(RA.isString(true));
-    assert.isFalse(RA.isString(new Date()));
-    assert.isFalse(RA.isString(new Error()));
-    assert.isFalse(RA.isString(Array.prototype.slice));
-    assert.isFalse(RA.isString({ 0: 1, length: 1 }));
-    assert.isFalse(RA.isString(1));
-    assert.isFalse(RA.isString(/x/));
+  it('should support placeholder to specify "gaps"', function() {
+    const isString = RA.isString(R.__);
 
-    if (Symbol !== 'undefined') {
-      assert.isFalse(RA.isString(Symbol));
-    }
+    assert.isFalse(isString(1));
   });
 });
diff --git a/test/isSymbol.js b/test/isSymbol.js
index d81c59c82f..a2aee9e3d4 100644
--- a/test/isSymbol.js
+++ b/test/isSymbol.js
@@ -5,7 +5,7 @@ import * as RA from '../src';
 
 describe('isSymbol', function() {
   context('given a Symbol as value', function() {
-    it('should return true', function() {
+    specify('should return true', function() {
       assert.isTrue(RA.isSymbol(Symbol('any')));
       assert.isTrue(RA.isSymbol(Symbol(1)));
       assert.isTrue(RA.isSymbol(Symbol.iterator));
@@ -13,7 +13,7 @@ describe('isSymbol', function() {
   });
 
   context('given anything else as value', function() {
-    it('should return false', function() {
+    specify('should return false', function() {
       assert.isFalse(RA.isSymbol(undefined));
       assert.isFalse(RA.isSymbol(null));
       assert.isFalse(RA.isSymbol(() => {}));
diff --git a/test/isThenable.js b/test/isThenable.js
index 77fe3261e9..a84b10f150 100644
--- a/test/isThenable.js
+++ b/test/isThenable.js
@@ -1,4 +1,5 @@
 import { assert } from 'chai';
+import * as R from 'ramda';
 
 import * as RA from '../src';
 import Symbol from './shared/Symbol';
@@ -57,4 +58,10 @@ describe('isThenable', function() {
       assert.isTrue(RA.isThenable(func));
     });
   });
+
+  it('should support placeholder to specify "gaps"', function() {
+    const isThenable = RA.isThenable(R.__);
+
+    assert.isFalse(isThenable(1));
+  });
 });
diff --git a/test/trimCharsStart.js b/test/trimCharsStart.js
new file mode 100644
index 0000000000..d8e3a5dae6
--- /dev/null
+++ b/test/trimCharsStart.js
@@ -0,0 +1,49 @@
+import { assert } from 'chai';
+
+import * as RA from '../src';
+
+describe('trimCharsStart', function() {
+  it('should remove all occurences of a trim character', function() {
+    assert.strictEqual(RA.trimCharsStart('-', '---abc'), 'abc');
+  });
+
+  it('should remove all occurences of all trim characters', function() {
+    assert.strictEqual(RA.trimCharsStart('_-', '-_-abc'), 'abc');
+  });
+
+  it('should not remove the trim characters from the end of the string', function() {
+    assert.strictEqual(RA.trimCharsStart('_-', '-_-abc-_-'), 'abc-_-');
+  });
+
+  context('given none of the trim characters are present', function() {
+    specify('should return the target string as-is', function() {
+      assert.strictEqual(RA.trimCharsStart('_-', 'abc'), 'abc');
+    });
+  });
+
+  context(
+    'given the target string consists entirely of trim characters',
+    function() {
+      specify('should return an empty string', function() {
+        assert.strictEqual(RA.trimCharsStart('_-', '-_-_-_'), '');
+      });
+    }
+  );
+
+  context('given an empty string for the trim characters', function() {
+    specify('should return the target string as-is', function() {
+      assert.strictEqual(RA.trimCharsStart('', 'abc'), 'abc');
+    });
+  });
+
+  context('given an empty string for the target string', function() {
+    specify('should return an empty string', function() {
+      assert.strictEqual(RA.trimCharsStart('-_', ''), '');
+    });
+  });
+
+  it('should curry', function() {
+    assert.strictEqual(RA.trimCharsStart('_-', ''), '');
+    assert.strictEqual(RA.trimCharsStart('_-')(''), '');
+  });
+});
diff --git a/types/test/trimCharsStart.ts b/types/test/trimCharsStart.ts
new file mode 100644
index 0000000000..eae9254fb6
--- /dev/null
+++ b/types/test/trimCharsStart.ts
@@ -0,0 +1,15 @@
+import * as RA from 'ramda-adjunct';
+
+RA.trimCharsStart('-_', '-_-abc-_-'); // $ExpectType string
+RA.trimCharsStart('', '-_-abc-_-'); // $ExpectType string
+RA.trimCharsStart('-_', ''); // $ExpectType string
+
+RA.trimCharsStart(1, 42); // $ExpectError
+RA.trimCharsStart([], 'abc'); // $ExpectError
+RA.trimCharsStart('-_', []); // $ExpectError
+RA.trimCharsStart({}, 'abc'); // $ExpectError
+RA.trimCharsStart('-_', {}); // $ExpectError
+RA.trimCharsStart('-_', null); // $ExpectError
+RA.trimCharsStart(null, 'abc'); // $ExpectError
+RA.trimCharsStart('-_', undefined); // $ExpectError
+RA.trimCharsStart(undefined, 'abc'); // $ExpectError
diff --git a/webpack.config-test.web.js b/webpack.config-test.web.js
index 52a586678e..e0d1bb7390 100644
--- a/webpack.config-test.web.js
+++ b/webpack.config-test.web.js
@@ -9,7 +9,7 @@ module.exports = {
   entry: [
     '@babel/polyfill',
     ...glob.sync('./test/*.js', {
-      ignore: ['./test/typescript.js', './test/mocha-bootstrap.js'],
+      ignore: ['./test/mocha-bootstrap.js'],
     }),
   ],
   output: {