Repository: char0n/ramda-adjunct
Pull request #946 (2019-05-31 22:21:35)

Feat: add flattenDepth
Closes https://github.com/char0n/ramda-adjunct/issues/844


char0n: Thank you for conyributing. I'll provide code review during today evening

Patch:
diff --git a/package-lock.json b/package-lock.json
index beafa5fc5b..dff188e947 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1080,7 +1080,7 @@
       "dependencies": {
         "chalk": {
           "version": "2.3.1",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz",
           "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==",
           "dev": true,
           "requires": {
@@ -1098,9 +1098,9 @@
       }
     },
     "@commitlint/config-conventional": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-7.6.0.tgz",
-      "integrity": "sha512-1Gnv5p3tc1VsEK25oTIRBO86czLtX6s/jeLNPAQRzdCnyEmsxkbx/sfoUJ1dwv7v8W++xckVnnuvdZv2Hp8yCw==",
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-8.0.0.tgz",
+      "integrity": "sha512-umg1irroowOV+x8oZPBw8woCogZO5MFKUYQq+fRZvhowoSwDHXYILP3ETcdHUgvytw/K/a8Xvu7iCypK6oZQ+g==",
       "dev": true
     },
     "@commitlint/ensure": {
@@ -1822,7 +1822,7 @@
         },
         "util": {
           "version": "0.10.3",
-          "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz",
+          "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
           "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
           "dev": true,
           "requires": {
@@ -2296,7 +2296,7 @@
     },
     "browserify-aes": {
       "version": "1.2.0",
-      "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
       "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
       "dev": true,
       "requires": {
@@ -2333,7 +2333,7 @@
     },
     "browserify-rsa": {
       "version": "4.0.1",
-      "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
+      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
       "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
       "dev": true,
       "requires": {
@@ -2378,7 +2378,7 @@
     },
     "buffer": {
       "version": "4.9.1",
-      "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
       "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
       "dev": true,
       "requires": {
@@ -2634,9 +2634,9 @@
       "dev": true
     },
     "chrome-trace-event": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz",
-      "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
+      "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
       "dev": true,
       "requires": {
         "tslib": "^1.9.0"
@@ -2911,7 +2911,7 @@
     },
     "conventional-changelog-angular": {
       "version": "1.6.6",
-      "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz",
+      "resolved": "http://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz",
       "integrity": "sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg==",
       "dev": true,
       "requires": {
@@ -3065,7 +3065,7 @@
         },
         "minimist": {
           "version": "1.2.0",
-          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
           "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
           "dev": true
         },
@@ -3169,7 +3169,7 @@
         },
         "minimist": {
           "version": "1.2.0",
-          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
           "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
           "dev": true
         },
@@ -3196,7 +3196,7 @@
     },
     "conventional-commits-parser": {
       "version": "2.1.7",
-      "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz",
+      "resolved": "http://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz",
       "integrity": "sha512-BoMaddIEJ6B4QVMSDu9IkVImlGOSGA1I2BQyOZHeLQ6qVOJLcLKn97+fL6dGbzWEiqDzfH4OkcveULmeq2MHFQ==",
       "dev": true,
       "requires": {
@@ -3376,7 +3376,7 @@
     },
     "create-hash": {
       "version": "1.2.0",
-      "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
       "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
       "dev": true,
       "requires": {
@@ -3389,7 +3389,7 @@
     },
     "create-hmac": {
       "version": "1.1.7",
-      "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+      "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
       "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
       "dev": true,
       "requires": {
@@ -3675,7 +3675,7 @@
     },
     "diffie-hellman": {
       "version": "5.0.3",
-      "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+      "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
       "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
       "dev": true,
       "requires": {
@@ -4141,9 +4141,9 @@
       }
     },
     "eslint-config-prettier": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-4.3.0.tgz",
-      "integrity": "sha512-sZwhSTHVVz78+kYD3t5pCWSYEdVSBR0PXnwjDRsUs8ytIrK8PLXw+6FKp8r3Z7rx4ZszdetWlXYKOHoUrrwPlA==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-5.0.0.tgz",
+      "integrity": "sha512-c17Aqiz5e8LEqoc/QPmYnaxQFAHTx2KlCZBPxXXjEMmNchOLnV/7j0HoPZuC+rL/tDC9bazUYOKJW9bOhftI/w==",
       "dev": true,
       "requires": {
         "get-stdin": "^6.0.0"
@@ -5812,7 +5812,7 @@
         },
         "minimist": {
           "version": "1.2.0",
-          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
           "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
           "dev": true
         },
@@ -5940,7 +5940,7 @@
     },
     "git-raw-commits": {
       "version": "1.3.6",
-      "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.6.tgz",
+      "resolved": "http://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.6.tgz",
       "integrity": "sha512-svsK26tQ8vEKnMshTDatSIQSMDdz8CxIIqKsvPqbtV23Etmw6VNaFAitu8zwZ0VrOne7FztwPyRLxK7/DIUTQg==",
       "dev": true,
       "requires": {
@@ -6023,7 +6023,7 @@
         },
         "minimist": {
           "version": "1.2.0",
-          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
           "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
           "dev": true
         }
@@ -6386,9 +6386,9 @@
       }
     },
     "husky": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/husky/-/husky-2.3.0.tgz",
-      "integrity": "sha512-A/ZQSEILoq+mQM3yC3RIBSaw1bYXdkKnyyKVSUiJl+iBjVZc5LQEXdGY1ZjrDxC4IzfRPiJ0IqzEQGCN5TQa/A==",
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/husky/-/husky-2.4.1.tgz",
+      "integrity": "sha512-ZRwMWHr7QruR22dQ5l3rEGXQ7rAQYsJYqaeCd+NyOsIFczAtqaApZQP3P4HwLZjCtFbm3SUNYoKuoBXX3AYYfw==",
       "dev": true,
       "requires": {
         "cosmiconfig": "^5.2.0",
@@ -6459,12 +6459,41 @@
           "dev": true
         },
         "pkg-dir": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.1.0.tgz",
-          "integrity": "sha512-55k9QN4saZ8q518lE6EFgYiu95u3BWkSajCifhdQjvLvmr8IpnRbhI+UGpWJQfa0KzDguHeeWT1ccO1PmkOi3A==",
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+          "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
           "dev": true,
           "requires": {
-            "find-up": "^3.0.0"
+            "find-up": "^4.0.0"
+          },
+          "dependencies": {
+            "find-up": {
+              "version": "4.0.0",
+              "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.0.0.tgz",
+              "integrity": "sha512-zoH7ZWPkRdgwYCDVoQTzqjG8JSPANhtvLhh4KVUHyKnaUJJrNeFmWIkTcNuJmR3GLMEmGYEf2S2bjgx26JTF+Q==",
+              "dev": true,
+              "requires": {
+                "locate-path": "^5.0.0"
+              }
+            },
+            "locate-path": {
+              "version": "5.0.0",
+              "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+              "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+              "dev": true,
+              "requires": {
+                "p-locate": "^4.1.0"
+              }
+            },
+            "p-locate": {
+              "version": "4.1.0",
+              "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+              "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+              "dev": true,
+              "requires": {
+                "p-limit": "^2.2.0"
+              }
+            }
           }
         },
         "read-pkg": {
@@ -6480,9 +6509,9 @@
           }
         },
         "resolve": {
-          "version": "1.10.1",
-          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz",
-          "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==",
+          "version": "1.11.1",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz",
+          "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==",
           "dev": true,
           "requires": {
             "path-parse": "^1.0.6"
@@ -8281,9 +8310,9 @@
       }
     },
     "mocha-junit-reporter": {
-      "version": "1.22.0",
-      "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-1.22.0.tgz",
-      "integrity": "sha512-nRBCVxzYYhOqQr2XlByLRj5MAAy7djArRkGUSx9dGc+B9NMu4yCeo74uXKALAnMhXjuLmtAL9F8WGe3wQV30IA==",
+      "version": "1.23.0",
+      "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-1.23.0.tgz",
+      "integrity": "sha512-pmpnEO4iDTmLfrT2RKqPsc5relG4crnDSGmXPuGogdda27A7kLujDNJV4EbTbXlVBCZXggN9rQYPEWMkOv4AAA==",
       "dev": true,
       "requires": {
         "debug": "^2.2.0",
@@ -8472,9 +8501,9 @@
       "dev": true
     },
     "node-libs-browser": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz",
-      "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==",
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
+      "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
       "dev": true,
       "requires": {
         "assert": "^1.1.1",
@@ -8487,7 +8516,7 @@
         "events": "^3.0.0",
         "https-browserify": "^1.0.0",
         "os-browserify": "^0.3.0",
-        "path-browserify": "0.0.0",
+        "path-browserify": "0.0.1",
         "process": "^0.11.10",
         "punycode": "^1.2.4",
         "querystring-es3": "^0.2.0",
@@ -8499,7 +8528,7 @@
         "tty-browserify": "0.0.0",
         "url": "^0.11.0",
         "util": "^0.11.0",
-        "vm-browserify": "0.0.4"
+        "vm-browserify": "^1.0.1"
       },
       "dependencies": {
         "punycode": {
@@ -9135,9 +9164,9 @@
       "dev": true
     },
     "path-browserify": {
-      "version": "0.0.0",
-      "resolved": "http://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
-      "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
+      "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
       "dev": true
     },
     "path-dirname": {
@@ -9288,9 +9317,9 @@
       "dev": true
     },
     "prettier": {
-      "version": "1.17.0",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.17.0.tgz",
-      "integrity": "sha512-sXe5lSt2WQlCbydGETgfm1YBShgOX4HxQkFPvbxkcwgDvGDeqVau8h+12+lmSVlP3rHPz0oavfddSZg/q+Szjw==",
+      "version": "1.18.0",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.0.tgz",
+      "integrity": "sha512-YsdAD29M0+WY2xXZk3i0PA16olY9qZss+AuODxglXcJ+2ZBwFv+6k5tE8GS8/HKAthaajlS/WqhdgcjumOrPlg==",
       "dev": true
     },
     "prettier-linter-helpers": {
@@ -10033,7 +10062,7 @@
     },
     "sha.js": {
       "version": "2.4.11",
-      "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
       "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
       "dev": true,
       "requires": {
@@ -11108,7 +11137,7 @@
     },
     "tty-browserify": {
       "version": "0.0.0",
-      "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
+      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
       "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
       "dev": true
     },
@@ -11457,9 +11486,9 @@
       "dev": true
     },
     "v8-compile-cache": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz",
-      "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz",
+      "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==",
       "dev": true
     },
     "validate-npm-package-license": {
@@ -11490,13 +11519,10 @@
       }
     },
     "vm-browserify": {
-      "version": "0.0.4",
-      "resolved": "http://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
-      "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
-      "dev": true,
-      "requires": {
-        "indexof": "0.0.1"
-      }
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz",
+      "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==",
+      "dev": true
     },
     "watchpack": {
       "version": "1.6.0",
@@ -11510,9 +11536,9 @@
       }
     },
     "webpack": {
-      "version": "4.32.0",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.32.0.tgz",
-      "integrity": "sha512-ofFq9jjAn4HRzlmkcZZrjijbRZcqDw+mM9KrjKd0r6lS0qxyZ7jzICzhphGafXL62dGdjP7TgMK9mZeMLUgZgw==",
+      "version": "4.34.0",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.34.0.tgz",
+      "integrity": "sha512-ry2IQy1wJjOefLe1uJLzn5tG/DdIKzQqNlIAd2L84kcaADqNvQDTBlo8UcCNyDaT5FiaB+16jhAkb63YeG3H8Q==",
       "dev": true,
       "requires": {
         "@webassemblyjs/ast": "1.8.5",
@@ -11542,9 +11568,9 @@
       }
     },
     "webpack-cli": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.2.tgz",
-      "integrity": "sha512-FLkobnaJJ+03j5eplxlI0TUxhGCOdfewspIGuvDVtpOlrAuKMFC57K42Ukxqs1tn8947/PM6tP95gQc0DCzRYA==",
+      "version": "3.3.4",
+      "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.4.tgz",
+      "integrity": "sha512-ubJGQEKMtBSpT+LiL5hXvn2GIOWiRWItR1DGUqJRhwRBeGhpRXjvF5f0erqdRJLErkfqS5/Ldkkedh4AL5Q1ZQ==",
       "dev": true,
       "requires": {
         "chalk": "^2.4.1",
@@ -11555,6 +11581,7 @@
         "import-local": "^2.0.0",
         "interpret": "^1.1.0",
         "loader-utils": "^1.1.0",
+        "prettier": "^1.17.0",
         "supports-color": "^5.5.0",
         "v8-compile-cache": "^2.0.2",
         "yargs": "^12.0.5"
diff --git a/package.json b/package.json
index fcfdb7c041..2f4f5ddf33 100644
--- a/package.json
+++ b/package.json
@@ -140,7 +140,7 @@
     "@babel/preset-env": "7.4.5",
     "@babel/register": "7.4.4",
     "@commitlint/cli": "8.0.0",
-    "@commitlint/config-conventional": "7.6.0",
+    "@commitlint/config-conventional": "=8.0.0",
     "babel-loader": "8.0.6",
     "babel-plugin-annotate-pure-calls": "0.4.0",
     "babel-plugin-istanbul": "5.1.4",
@@ -151,7 +151,7 @@
     "docdash": "git+https://github.com/char0n/docdash.git#534b44382138a55dd8d93642c979e51e46471185",
     "eslint": "5.16.0",
     "eslint-config-airbnb-base": "13.1.0",
-    "eslint-config-prettier": "4.3.0",
+    "eslint-config-prettier": "5.0.0",
     "eslint-plugin-import": "2.17.3",
     "eslint-plugin-mocha": "5.3.0",
     "eslint-plugin-prettier": "3.1.0",
@@ -160,17 +160,17 @@
     "fantasy-laws": "=1.2.0",
     "folktale": "=2.3.2",
     "glob": "7.1.4",
-    "husky": "2.3.0",
+    "husky": "2.4.1",
     "istanbul": "=0.4.5",
     "jsdoc": "3.6.2",
     "jsverify": "0.8.4",
     "license-cli": "1.1.6",
     "mocha": "6.1.4",
-    "mocha-junit-reporter": "1.22.0",
+    "mocha-junit-reporter": "1.23.0",
     "mocha-multi-reporters": "1.1.7",
     "monet": "0.9.0",
     "nyc": "14.1.1",
-    "prettier": "1.17.0",
+    "prettier": "=1.18.0",
     "ramda": "=0.26.1",
     "ramda-fantasy": "=0.8.0",
     "rimraf": "2.6.3",
@@ -182,8 +182,8 @@
     "tslint-config-prettier": "1.17.0",
     "typescript": "=3.2.2",
     "typescript-definition-tester": "0.0.6",
-    "webpack": "4.32.0",
-    "webpack-cli": "3.3.2"
+    "webpack": "4.34.0",
+    "webpack-cli": "3.3.4"
   },
   "browserslist": "> 0.25%, ie 10, ie 11, not op_mini all",
   "tonicExampleFilename": "tonicExample.js"
diff --git a/src/flattenDepth.js b/src/flattenDepth.js
new file mode 100644
index 0000000000..350a0e2f73
--- /dev/null
+++ b/src/flattenDepth.js
@@ -0,0 +1,38 @@
+import { curry } from 'ramda';
+import _makeFlat from 'ramda/src/internal/_makeFlat';
+
+const flatten1 = _makeFlat(false);
+
+/**
+ * Flattens the list to the specified depth.
+ *
+ * @func flattenDepth
+ * @memberOf RA
+ * @since {@link https://char0n.github.io/ramda-adjunct/2.19.0|v2.19.0}
+ * @category List
+ * @sig Number -> [a] -> [b]
+ * @param {!number} depth The maximum recursion depth.
+ * @param {!Array} list The array to flatten
+ * @return {!Array} Returns the new flattened array
+ * @see {@link http://ramdajs.com/docs/#flatten|R.flatten}, {@link http://ramdajs.com/docs/#unnest|R.unnest}
+ * @example
+ *
+ * RA.flattenDepth(
+ *   2,
+ *   [1, [2], [3, [4, 5], 6, [[[7], 8]]], 9, 10]
+ * ); // => [1, 2, 3, 4, 5, 6, [[7], 8], 9, 10];
+ */
+const flattenDepth = curry((depth, list) => {
+  let currentDept = depth;
+  let flatList = list;
+
+  while (currentDept > 0) {
+    flatList = flatten1(flatList);
+
+    currentDept -= 1;
+  }
+
+  return flatList;
+});
+
+export default flattenDepth;
diff --git a/src/index.d.ts b/src/index.d.ts
index 4107543080..a5da5aad01 100644
--- a/src/index.d.ts
+++ b/src/index.d.ts
@@ -901,6 +901,12 @@ declare namespace RamdaAdjunct {
         allEqualTo<T>(val: T, list: T[]): boolean;
         allEqualTo<T>(val: T): <T>(list: T[]) => boolean;
 
+        /*
+         * Flattens the list to the specified depth.
+         */
+        flattenDepth<T>(depth: number, list: T[]): T[]
+        flattenDepth<T>(depth: number): <T>(list: T[]) => T[]
+
         /**
          * Checks if input value is a `thenable`.
          * `thenable` is an object or function that defines a `then` method.
@@ -979,6 +985,12 @@ declare namespace RamdaAdjunct {
          */
         neither(firstPredicate: Function, secondPredicate: Function): Function;
 
+        /**
+         * Returns true if both arguments are falsy; false otherwise.
+         */
+        nand(a: any, b: any): Boolean;
+        nand(a: any): (b: any) => Boolean;
+
         /**
          * Takes a list of predicates and returns a predicate that returns true for a given list of
          * arguments if one or more of the provided predicates is not satisfied by those arguments.
diff --git a/src/index.js b/src/index.js
index c52b999768..757aed52ad 100644
--- a/src/index.js
+++ b/src/index.js
@@ -129,6 +129,7 @@ export { default as repeatStr } from './repeatStr';
 export { default as allIdentical } from './allIdentical';
 export { default as allIdenticalTo } from './allIdenticalTo';
 export { default as allEqualTo } from './allEqualTo';
+export { default as flattenDepth } from './flattenDepth';
 // Object
 export { default as paths } from './paths';
 export { default as renameKeys } from './renameKeys';
@@ -161,6 +162,7 @@ export { default as inRange } from './inRange';
 export { default as isNotEmpty } from './isNotEmpty';
 export { default as defaultWhen } from './defaultWhen';
 export { default as notBoth } from './notBoth';
+export { default as nand } from './nand';
 export { default as neither } from './neither';
 export { default as notAllPass } from './notAllPass';
 export { default as nonePass } from './nonePass';
diff --git a/src/isFinite.js b/src/isFinite.js
index 679cc69377..46e47d8d58 100644
--- a/src/isFinite.js
+++ b/src/isFinite.js
@@ -1,8 +1,11 @@
+import { bind } from 'ramda';
 import curry1 from 'ramda/src/internal/_curry1';
 
 import isFunction from './isFunction';
 import polyfill from './internal/polyfills/Number.isFinite';
 
+export const isFinitePolyfill = curry1(polyfill);
+
 /**
  * Checks whether the passed value is a finite `Number`.
  *
@@ -28,8 +31,8 @@ import polyfill from './internal/polyfills/Number.isFinite';
  * RA.isFinite(null); // => false
  *                    // would've been true with global isFinite(null)
  */
-const _isFinite = curry1(
-  isFunction(Number.isFinite) ? Number.isFinite : polyfill
-);
+const _isFinite = isFunction(Number.isFinite)
+  ? curry1(bind(Number.isFinite, Number))
+  : isFinitePolyfill;
 
 export default _isFinite;
diff --git a/src/nand.js b/src/nand.js
new file mode 100644
index 0000000000..61a298912b
--- /dev/null
+++ b/src/nand.js
@@ -0,0 +1,27 @@
+import { and, complement } from 'ramda';
+
+/**
+ * Returns true if both arguments are falsy; false otherwise.
+ *
+ * @func nand
+ * @memberOf RA
+ * @since {@link https://char0n.github.io/ramda-adjunct/2.19.0|v2.19.0}
+ * @category Logic
+ * @sig a -> b -> Boolean
+ * @param {Boolean} a
+ * @param {Boolean} b
+ * @return {Boolean} true if both arguments are false
+ * @example
+ *
+ * RA.nand(true, true); //=> false
+ * RA.nand(false, true); //=> true
+ * RA.nand(true, false); //=> true
+ * RA.nand(false, false); //=> true
+ * RA.nand(1.0, 1.0); //=> false
+ * RA.nand(1.0, 0); //=> true
+ * RA.nand(0, 1.0); //=> true
+ * RA.nand(0, 0); //=> true
+ */
+const nand = complement(and); // eslint-disable-line ramda/complement-simplification
+
+export default nand;
diff --git a/src/pickIndexes.js b/src/pickIndexes.js
index 28737ae79c..81c7389f57 100644
--- a/src/pickIndexes.js
+++ b/src/pickIndexes.js
@@ -7,6 +7,9 @@ const containsIndex = curry((indexes, val, index) => contains(index, indexes));
 /**
  * Picks values from list by indexes.
  *
+ * Note: pickIndexes will skip non existing indexes. If you want to include them
+ * use ramda's `props` function.
+ *
  * @func pickIndexes
  * @memberOf RA
  * @since {@link https://char0n.github.io/ramda-adjunct/1.1.0|v1.1.0}


Test patch:
diff --git a/test/flattenDepth.js b/test/flattenDepth.js
new file mode 100644
index 0000000000..4c2382bf98
--- /dev/null
+++ b/test/flattenDepth.js
@@ -0,0 +1,72 @@
+import { assert } from 'chai';
+
+import * as RA from '../src';
+
+describe('flattenDepth', function() {
+  context('given a list that has nested elements', function() {
+    specify(
+      'should return a flattened list to the specified depth',
+      function() {
+        const nest = [1, [2], [3, [4, 5], 6, [[[7], 8]]], 9, 10];
+
+        assert.deepEqual(
+          [1, [2], [3, [4, 5], 6, [[[7], 8]]], 9, 10],
+          RA.flattenDepth(-1, nest)
+        );
+        assert.deepEqual(
+          [1, [2], [3, [4, 5], 6, [[[7], 8]]], 9, 10],
+          RA.flattenDepth(0, nest)
+        );
+        assert.deepEqual(
+          [1, 2, 3, [4, 5], 6, [[[7], 8]], 9, 10],
+          RA.flattenDepth(1, nest)
+        );
+        assert.deepEqual(
+          [1, 2, 3, 4, 5, 6, [[7], 8], 9, 10],
+          RA.flattenDepth(2, nest)
+        );
+        assert.deepEqual(
+          [1, 2, 3, 4, 5, 6, [7], 8, 9, 10],
+          RA.flattenDepth(3, nest)
+        );
+        assert.deepEqual(
+          [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
+          RA.flattenDepth(4, nest)
+        );
+        assert.deepEqual(
+          [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
+          RA.flattenDepth(5, nest)
+        );
+
+        assert.deepEqual(
+          [1, [2], [3, [4, 5], 6, [[[7], 8]]], 9, 10],
+          RA.flattenDepth(-1)(nest)
+        );
+        assert.deepEqual(
+          [1, [2], [3, [4, 5], 6, [[[7], 8]]], 9, 10],
+          RA.flattenDepth(0)(nest)
+        );
+        assert.deepEqual(
+          [1, 2, 3, [4, 5], 6, [[[7], 8]], 9, 10],
+          RA.flattenDepth(1)(nest)
+        );
+        assert.deepEqual(
+          [1, 2, 3, 4, 5, 6, [[7], 8], 9, 10],
+          RA.flattenDepth(2)(nest)
+        );
+        assert.deepEqual(
+          [1, 2, 3, 4, 5, 6, [7], 8, 9, 10],
+          RA.flattenDepth(3)(nest)
+        );
+        assert.deepEqual(
+          [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
+          RA.flattenDepth(4)(nest)
+        );
+        assert.deepEqual(
+          [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
+          RA.flattenDepth(5)(nest)
+        );
+      }
+    );
+  });
+});
diff --git a/test/isNotFinite.js b/test/isNotFinite.js
index 161e1b0e6f..df43b720c9 100644
--- a/test/isNotFinite.js
+++ b/test/isNotFinite.js
@@ -1,39 +1,58 @@
-import { complement } from 'ramda';
+import { assert } from 'chai';
+import * as R from 'ramda';
 
 import * as RA from '../src';
-import polyfill from '../src/internal/polyfills/Number.isFinite';
-import eq from './shared/eq';
+import { isFinitePolyfill } from '../src/isFinite';
 
 describe('isNotFinite', function() {
-  it('tests a value for complement of finite `Number`', function() {
-    eq(RA.isNotFinite(Infinity), true);
-    eq(RA.isNotFinite(NaN), true);
-    eq(RA.isNotFinite(-Infinity), true);
-
-    eq(RA.isNotFinite(0), false);
-    eq(RA.isNotFinite(-0), false);
-    eq(RA.isNotFinite(2e64), false);
-    eq(RA.isNotFinite(324234), false);
-    eq(RA.isNotFinite(1.2342), false);
-
-    eq(RA.isNotFinite('0'), true);
-    eq(RA.isNotFinite(null), true);
+  it('should test a value for complement of finite `Number`', function() {
+    assert.isTrue(RA.isNotFinite(Infinity));
+    assert.isTrue(RA.isNotFinite(NaN));
+    assert.isTrue(RA.isNotFinite(-Infinity));
+
+    assert.isFalse(RA.isNotFinite(0));
+    assert.isFalse(RA.isNotFinite(-0));
+    assert.isFalse(RA.isNotFinite(2e64));
+    assert.isFalse(RA.isNotFinite(324234));
+    assert.isFalse(RA.isNotFinite(1.2342));
+
+    assert.isTrue(RA.isNotFinite('0'));
+    assert.isTrue(RA.isNotFinite(null));
   });
 
-  it('tests polyfill for complement of finite `Number', function() {
-    const polyfillC = complement(polyfill);
-
-    eq(polyfillC(Infinity), true);
-    eq(polyfillC(NaN), true);
-    eq(polyfillC(-Infinity), true);
+  context('isFinitePolyfill complement', function() {
+    context('given we create complement of the polyfill', function() {
+      const polyfillC = R.complement(isFinitePolyfill);
+
+      specify(
+        'should test a value for complement of finite `Number`',
+        function() {
+          assert.isTrue(polyfillC(Infinity));
+          assert.isTrue(polyfillC(NaN));
+          assert.isTrue(polyfillC(-Infinity));
+
+          assert.isFalse(polyfillC(0));
+          assert.isFalse(polyfillC(-0));
+          assert.isFalse(polyfillC(2e64));
+          assert.isFalse(polyfillC(324234));
+          assert.isFalse(polyfillC(1.2342));
+
+          assert.isTrue(polyfillC('0'));
+          assert.isTrue(polyfillC(null));
+        }
+      );
+
+      specify('should support placeholder to specify "gaps"', function() {
+        const isNotFinite = polyfillC(R.__);
+
+        assert.isFalse(isNotFinite(-1));
+      });
+    });
+  });
 
-    eq(polyfillC(0), false);
-    eq(polyfillC(-0), false);
-    eq(polyfillC(2e64), false);
-    eq(polyfillC(324234), false);
-    eq(polyfillC(1.2342), false);
+  it('should support placeholder to specify "gaps"', function() {
+    const isNotFinite = RA.isNotFinite(R.__);
 
-    eq(polyfillC('0'), true);
-    eq(polyfillC(null), true);
+    assert.isFalse(isNotFinite(-1));
   });
 });
diff --git a/test/nand.js b/test/nand.js
new file mode 100644
index 0000000000..1ef3876216
--- /dev/null
+++ b/test/nand.js
@@ -0,0 +1,38 @@
+import eq from './shared/eq';
+import * as RA from '../src';
+
+describe('RA.nand', function() {
+  it('should work on booleans', function() {
+    eq(RA.nand(true, true), false);
+    eq(RA.nand(false, true), true);
+    eq(RA.nand(true, false), true);
+    eq(RA.nand(false, false), true);
+  });
+
+  it('should work on numbers', function() {
+    eq(RA.nand(1.0, 1.0), false);
+    eq(RA.nand(0.0, 1.0), true);
+    eq(RA.nand(1.0, 0.0), true);
+    eq(RA.nand(0.0, 0.0), true);
+  });
+
+  it('should work on a combination of things', function() {
+    eq(RA.nand(true, 1.0), false);
+    eq(RA.nand(null, true), true);
+    eq(RA.nand(1.0, undefined), true);
+    eq(RA.nand(0.0, false), true);
+    eq(RA.nand(null, null), true);
+    eq(RA.nand(null, undefined), true);
+  });
+
+  it('should support currying', function() {
+    eq(RA.nand(true, true), false);
+    eq(RA.nand(true)(true), false);
+    eq(RA.nand(false, true), true);
+    eq(RA.nand(false)(true), true);
+    eq(RA.nand(true, false), true);
+    eq(RA.nand(true)(false), true);
+    eq(RA.nand(false, false), true);
+    eq(RA.nand(false)(false), true);
+  });
+});
diff --git a/test/shared/Symbol.js b/test/shared/Symbol.js
index 3b7b564d26..d900764468 100644
--- a/test/shared/Symbol.js
+++ b/test/shared/Symbol.js
@@ -1,1 +1,1 @@
-export default (typeof Symbol === 'function' ? Symbol : undefined);
+export default typeof Symbol === 'function' ? Symbol : undefined;