Repository: char0n/ramda-adjunct (js)

Issue:
flattenDepth
**Is your feature request related to a problem? Please describe.**
`flattenDepth` function contains reference to internal ramda function called `_makeFlat` which further makes reference to `_isArrayLike`. We have `_isArrayLike` function implemented in ramda-adjunct, so we only need to reimplement `makeFlat` into our codebase. Be aware that function just cannot be copied due to licensing reasons, it really needs to be understood and reimplemented. 

**Describe the solution you'd like**
See text above..


**Describe alternatives you've considered**

--

**Additional context**

--


Pull request:
refactor(makeFlat): use internal makeFlat
This addresses the issue #1364 which asks to use an internal version of makeFlat for flattenDepth
rather than the ramda one.

This is essentially the ramda one with some changes for the linting and closes #1364 

Patch:
diff --git a/package-lock.json b/package-lock.json
index 238de19a8a..ac10c0d32a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2694,29 +2694,29 @@
       }
     },
     "@definitelytyped/header-parser": {
-      "version": "0.0.29",
-      "resolved": "https://registry.npmjs.org/@definitelytyped/header-parser/-/header-parser-0.0.29.tgz",
-      "integrity": "sha512-d6FgX8LhSY75fa6cpjsTkLsbFuRKxT4k9EV2oc38wznndlkaWLjP9FW1GT24AMg5hkRuA9AJUbKRO1QhSqvSpA==",
+      "version": "0.0.34",
+      "resolved": "https://registry.npmjs.org/@definitelytyped/header-parser/-/header-parser-0.0.34.tgz",
+      "integrity": "sha512-/yTifMAhYKB8SFH3pSlAQmcBzrk7UyqpEz9/vJKaMKdzRpJrxmc1zWMP+hwJtJTVCjAK+Ul4m3i1GZQrTZfymw==",
       "dev": true,
       "requires": {
-        "@definitelytyped/typescript-versions": "^0.0.29",
+        "@definitelytyped/typescript-versions": "^0.0.34",
         "@types/parsimmon": "^1.10.1",
         "parsimmon": "^1.13.0"
       }
     },
     "@definitelytyped/typescript-versions": {
-      "version": "0.0.29",
-      "resolved": "https://registry.npmjs.org/@definitelytyped/typescript-versions/-/typescript-versions-0.0.29.tgz",
-      "integrity": "sha512-jMWqu0U5MiEVuTBtAbLwxKoF1ZWzbrcFrmX6nuzPzwxNHzUJlACq9RnIH93//bU7JOxkW6UrZy/8V8W5jxmiFA==",
+      "version": "0.0.34",
+      "resolved": "https://registry.npmjs.org/@definitelytyped/typescript-versions/-/typescript-versions-0.0.34.tgz",
+      "integrity": "sha512-7IqWcbHKYbfY8Lt7AigXDa29cbz3gynzBHMjwMUCeLnex8D682M6OW8uBLouvVHCr+YENL58tQB3dn0Zos8mFQ==",
       "dev": true
     },
     "@definitelytyped/utils": {
-      "version": "0.0.29",
-      "resolved": "https://registry.npmjs.org/@definitelytyped/utils/-/utils-0.0.29.tgz",
-      "integrity": "sha512-cqUjvXijj9PgEbVH+DwS5kLHjB700CmeQhFjfRlxn9CeRzSUoa5D0uOdz9b5Hl4XKDQfo1A1lY04nc6z486Nqw==",
+      "version": "0.0.34",
+      "resolved": "https://registry.npmjs.org/@definitelytyped/utils/-/utils-0.0.34.tgz",
+      "integrity": "sha512-C1mlA9ixRfv7PPmO99hJZ8Ii2roKY+7GoIwBPh5uYSF6WfABoVlzyWX3LsF6fy1MwpZbempC+r81iDm2QeYTsw==",
       "dev": true,
       "requires": {
-        "@definitelytyped/typescript-versions": "^0.0.29",
+        "@definitelytyped/typescript-versions": "^0.0.34",
         "@types/node": "^12.12.29",
         "charm": "^1.0.2",
         "fs-extra": "^8.1.0",
@@ -2915,9 +2915,9 @@
       "dev": true
     },
     "@types/node": {
-      "version": "12.12.38",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.38.tgz",
-      "integrity": "sha512-75eLjX0pFuTcUXnnWmALMzzkYorjND0ezNEycaKesbUBg9eGZp4GHPuDmkRc4mQQvIpe29zrzATNRA6hkYqwmA==",
+      "version": "12.12.39",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.39.tgz",
+      "integrity": "sha512-pADGfwnDkr6zagDwEiCVE4yQrv7XDkoeVa4OfA9Ju/zRTk6YNDLGtQbkdL4/56mCQQCs4AhNrBIag6jrp7ZuOg==",
       "dev": true
     },
     "@types/normalize-package-data": {
@@ -5671,19 +5671,6 @@
             "path-exists": "^4.0.0"
           }
         },
-        "handlebars": {
-          "version": "4.7.6",
-          "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz",
-          "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==",
-          "dev": true,
-          "requires": {
-            "minimist": "^1.2.5",
-            "neo-async": "^2.6.0",
-            "source-map": "^0.6.1",
-            "uglify-js": "^3.1.4",
-            "wordwrap": "^1.0.0"
-          }
-        },
         "indent-string": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
@@ -5734,8 +5721,7 @@
         "minimist": {
           "version": "1.2.5",
           "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-          "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
-          "dev": true
+          "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
         },
         "minimist-options": {
           "version": "4.0.2",
@@ -5890,8 +5876,7 @@
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
         },
         "strip-indent": {
           "version": "3.0.0",
@@ -5926,8 +5911,7 @@
         "wordwrap": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
-          "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
-          "dev": true
+          "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
         },
         "yargs-parser": {
           "version": "18.1.3",
@@ -6435,12 +6419,12 @@
       "dev": true
     },
     "dts-critic": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/dts-critic/-/dts-critic-3.1.0.tgz",
-      "integrity": "sha512-cNn4SsrlnGqnqxXE0GdPORurDrr+Y8k6yy5eBpjM6lu0C80QgabU8ypq+uAQ+JYeJ/ykQVUNo9zdLQfZHvnSVQ==",
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/dts-critic/-/dts-critic-3.2.1.tgz",
+      "integrity": "sha512-jNCWcrOduMsEUDXTZd+qWN7Nig52OgPVPL2IRJ7QQTx0MdYASEwqkoBdPrcEY/ClkKZ+rSjZi/xjBiNmRObuRg==",
       "dev": true,
       "requires": {
-        "@definitelytyped/header-parser": "0.0.29",
+        "@definitelytyped/header-parser": "0.0.34",
         "command-exists": "^1.2.8",
         "rimraf": "^3.0.2",
         "semver": "^6.2.0",
@@ -6536,20 +6520,20 @@
       }
     },
     "dtslint": {
-      "version": "3.5.2",
-      "resolved": "https://registry.npmjs.org/dtslint/-/dtslint-3.5.2.tgz",
-      "integrity": "sha512-i76Ai9Oo8uD8IQhGcb8X0AHNs/fo7RUnVSOk+a/OYkO9WXkM7l8oHGnZGZSMu2TbSRE1JQD/hWK56R94e+uXrQ==",
+      "version": "3.6.1",
+      "resolved": "https://registry.npmjs.org/dtslint/-/dtslint-3.6.1.tgz",
+      "integrity": "sha512-wtkvf2DgZC7nJAzgX4+WUh59O+BE86UEs0CpEs1atrk2Hy6Y8/CK9Vlmu4SLVAEmKnIk+kaNwTZq0AFRX6Ra+g==",
       "dev": true,
       "requires": {
-        "@definitelytyped/header-parser": "0.0.29",
-        "@definitelytyped/typescript-versions": "0.0.29",
-        "@definitelytyped/utils": "0.0.29",
-        "dts-critic": "^3.0.2",
+        "@definitelytyped/header-parser": "0.0.34",
+        "@definitelytyped/typescript-versions": "0.0.34",
+        "@definitelytyped/utils": "0.0.34",
+        "dts-critic": "^3.2.0",
         "fs-extra": "^6.0.1",
         "json-stable-stringify": "^1.0.1",
         "strip-json-comments": "^2.0.1",
         "tslint": "5.14.0",
-        "typescript": "=4.0.0-dev.20200507",
+        "typescript": "=4.0.0-dev.20200514",
         "yargs": "^15.1.0"
       },
       "dependencies": {
@@ -6575,9 +6559,9 @@
           }
         },
         "typescript": {
-          "version": "4.0.0-dev.20200507",
-          "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.0-dev.20200507.tgz",
-          "integrity": "sha512-/2vM7rURldVj9Wmwg79o+2tidfcWboTyUWloGTkyHOpHbvdY2R5E5CAtxhT9Er1gF39TV01rBZO3uj+rgvx8NQ==",
+          "version": "4.0.0-dev.20200514",
+          "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.0-dev.20200514.tgz",
+          "integrity": "sha512-o++Z0PwCL2iqEwTnoUVfDIAMo9xS+dvxm/6sl6n2VfxGGmVyaC9F6Naaylh+VZ5qG6Actdso0kJnzDxXVwY5fw==",
           "dev": true
         }
       }
@@ -9434,22 +9418,35 @@
       "dev": true
     },
     "handlebars": {
-      "version": "4.5.3",
-      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz",
-      "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==",
+      "version": "4.7.6",
+      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz",
+      "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==",
       "dev": true,
       "requires": {
+        "minimist": "^1.2.5",
         "neo-async": "^2.6.0",
-        "optimist": "^0.6.1",
         "source-map": "^0.6.1",
-        "uglify-js": "^3.1.4"
+        "uglify-js": "^3.1.4",
+        "wordwrap": "^1.0.0"
       },
       "dependencies": {
+        "minimist": {
+          "version": "1.2.5",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+          "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+          "dev": true
+        },
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
           "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
+        },
+        "wordwrap": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+          "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+          "dev": true
         }
       }
     },
@@ -12223,12 +12220,6 @@
         "brace-expansion": "^1.1.7"
       }
     },
-    "minimist": {
-      "version": "0.0.10",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
-      "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
-      "dev": true
-    },
     "minimist-options": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz",
@@ -13442,16 +13433,6 @@
       "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==",
       "dev": true
     },
-    "optimist": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
-      "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
-      "dev": true,
-      "requires": {
-        "minimist": "~0.0.1",
-        "wordwrap": "~0.0.2"
-      }
-    },
     "optionator": {
       "version": "0.8.2",
       "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
@@ -16146,9 +16127,9 @@
       }
     },
     "typescript": {
-      "version": "3.8.3",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz",
-      "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==",
+      "version": "3.9.2",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.2.tgz",
+      "integrity": "sha512-q2ktq4n/uLuNNShyayit+DTobV2ApPEo/6so68JaD5ojvc/6GClBipedB9zNWYxRSAlZXAe405Rlijzl6qDiSw==",
       "dev": true
     },
     "typify-parser": {
@@ -16814,12 +16795,6 @@
       "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
       "dev": true
     },
-    "wordwrap": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
-      "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
-      "dev": true
-    },
     "worker-farm": {
       "version": "1.7.0",
       "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
diff --git a/package.json b/package.json
index 8aed763a54..4aceac2417 100644
--- a/package.json
+++ b/package.json
@@ -154,7 +154,7 @@
     "codecov": "3.6.5",
     "conventional-changelog-cli": "2.0.34",
     "docdash": "git+https://github.com/char0n/docdash.git#534b44382138a55dd8d93642c979e51e46471185",
-    "dtslint": "=3.5.2",
+    "dtslint": "=3.6.1",
     "eslint": "6.8.0",
     "eslint-config-airbnb-base": "14.1.0",
     "eslint-config-prettier": "6.11.0",
@@ -186,7 +186,7 @@
     "terser-webpack-plugin": "3.0.1",
     "testem": "3.1.0",
     "tslint": "=6.1.2",
-    "typescript": "=3.8.3",
+    "typescript": "=3.9.2",
     "webpack": "4.43.0",
     "webpack-cli": "3.3.11"
   },
diff --git a/src/flattenDepth.js b/src/flattenDepth.js
index 5892ae3677..022f00f9a2 100644
--- a/src/flattenDepth.js
+++ b/src/flattenDepth.js
@@ -1,5 +1,6 @@
 import { curry } from 'ramda';
-import _makeFlat from 'ramda/src/internal/_makeFlat';
+
+import _makeFlat from './internal/makeFlat';
 
 const flatten1 = _makeFlat(false);
 
diff --git a/src/index.js b/src/index.js
index 5dbc9251c6..bee118f573 100644
--- a/src/index.js
+++ b/src/index.js
@@ -55,6 +55,7 @@ export { default as isNotNilOrEmpty } from './isNotNilOrEmpty';
 export { default as isNonPositive } from './isNonPositive';
 export { default as isNonNegative } from './isNonNegative';
 export { default as isMap } from './isMap';
+export { default as isNotMap } from './isNotMap';
 export { default as isNaN } from './isNaN';
 export { default as isNotNaN } from './isNotNaN';
 export { default as isFinite } from './isFinite';
@@ -79,6 +80,7 @@ export { default as isFalsy } from './isFalsy';
 export { default as isRegExp } from './isRegExp';
 export { default as isNotRegExp } from './isNotRegExp';
 export { default as isSet } from './isSet';
+export { default as isNotSet } from './isNotSet';
 export { default as isSparseArray } from './isSparseArray';
 export { default as isSymbol } from './isSymbol';
 export { default as isSafeInteger } from './isSafeInteger';
diff --git a/src/internal/makeFlat.js b/src/internal/makeFlat.js
new file mode 100644
index 0000000000..31f74494f4
--- /dev/null
+++ b/src/internal/makeFlat.js
@@ -0,0 +1,43 @@
+import isArrayLike from '../isArrayLike';
+
+/**
+ * `makeFlat` is a helper function that returns a one-level or fully recursive
+ * function based on the flag passed in.
+ *
+ * @func makeFlat
+ * @memberOf RA
+ *
+ * @category List
+ * @param {!bool} = should recursively flatten
+ * @param {!Array} = the nested list to be flattened
+ * @return {!Array} = the flattened list
+ * @sig Bool -> List -> List
+ *
+ */
+const makeFlat = (recursive) => {
+  return function flatt(list) {
+    let value;
+    let jlen;
+    let j;
+    const result = [];
+    let idx = 0;
+
+    while (idx < list.length) {
+      if (isArrayLike(list[idx])) {
+        value = recursive ? flatt(list[idx]) : list[idx];
+        j = 0;
+        jlen = value.length;
+        while (j < jlen) {
+          result[result.length] = value[j];
+          j += 1;
+        }
+      } else {
+        result[result.length] = list[idx];
+      }
+      idx += 1;
+    }
+    return result;
+  };
+};
+
+export default makeFlat;
diff --git a/src/isNotMap.js b/src/isNotMap.js
new file mode 100644
index 0000000000..9ecf3c7232
--- /dev/null
+++ b/src/isNotMap.js
@@ -0,0 +1,26 @@
+import { complement } from 'ramda';
+
+import isMap from './isMap';
+
+/**
+ * Checks if value is complement of `Map` object.
+ *
+ * @func isNotMap
+ * @memberOf RA
+ * @category Type
+ * @sig * -> Boolean
+ * @param {*} val The value to test
+ * @return {boolean}
+ * @see {@link RA.isMap|isMap}
+ * @example
+ *
+ * RA.isNotMap(new Map()); //=> false
+ * RA.isNotMap(new Map([[1, 2], [2, 1]])); //=> false
+ * RA.isNotMap(new Set()); //=> true
+ * RA.isNotMap({}); //=> true
+ * RA.isNotMap(12); //=> true
+ */
+
+const isNotMap = complement(isMap);
+
+export default isNotMap;
diff --git a/src/isNotSet.js b/src/isNotSet.js
new file mode 100644
index 0000000000..c752e66da4
--- /dev/null
+++ b/src/isNotSet.js
@@ -0,0 +1,25 @@
+import { complement } from 'ramda';
+
+import isSet from './isSet';
+
+/**
+ * Checks if value is complement of `Set` object.
+ *
+ * @func isNotSet
+ * @memberOf RA
+ * @category Type
+ * @sig * -> Boolean
+ * @param {*} val The value to test
+ * @return {boolean}
+ * @see {@link RA.isSet|isSet}
+ * @example
+ *
+ * RA.isNotSet(new Map()); //=> true
+ * RA.isNotSet(new Set()); //=> false
+ * RA.isNotSet(new Set([1,2]); //=> false
+ * RA.isNotSet(new Object()); //=> true
+ */
+
+const isNotSet = complement(isSet);
+
+export default isNotSet;
diff --git a/types/index.d.ts b/types/index.d.ts
index 9f37d3264b..47f96ab671 100644
--- a/types/index.d.ts
+++ b/types/index.d.ts
@@ -250,6 +250,11 @@ declare namespace RamdaAdjunct {
          */
         isMap(val: any): val is Map<any, any>;
 
+        /**
+         * Checks if value is complement of `Map` object.
+         */
+        isNotMap(val: any): boolean;
+
         /**
          * Checks whether the passed value is `NaN` and its type is `Number`.
          * It is a more robust version of the original, global isNaN().
@@ -392,6 +397,11 @@ declare namespace RamdaAdjunct {
          */
         isSet(val: any): val is Set<any>;
 
+        /**
+         * Checks if value is complement of `Set` object.
+         */
+        isNotSet(val: any): boolean;
+
         /**
          * Checks if value is complement of `RegExp` object.
          */


Test patch:
diff --git a/test/internal/makeFlat.js b/test/internal/makeFlat.js
new file mode 100644
index 0000000000..c44310949d
--- /dev/null
+++ b/test/internal/makeFlat.js
@@ -0,0 +1,22 @@
+import { assert } from 'chai';
+
+import * as RA from '../../src';
+import makeFlat from '../../src/internal/makeFlat';
+
+describe('makeFlat', function () {
+  it('should flatten an ar of n levels', function () {
+    assert.sameOrderedMembers(makeFlat(true)([[1], [2]]), [1, 2]);
+    assert.sameOrderedMembers(makeFlat(true)([[[1], [2]]]), [1, 2]);
+    assert.sameOrderedMembers(makeFlat(true)([[[[1], [2]]]]), [1, 2]);
+    assert.sameOrderedMembers(makeFlat(true)(RA.list([[[[1], [2]]]])), [1, 2]);
+  });
+  it('should flatten just one level', function () {
+    assert.sameOrderedMembers(makeFlat(false)([[1], [2]]), [1, 2]);
+    assert.deepEqual(makeFlat(false)([[[1], [2]]]), [[1], [2]]);
+    assert.deepEqual(makeFlat(false)([[[[1], [2]]]]), [[[1], [2]]]);
+    assert.deepEqual(makeFlat(false)([[[[[1]], [2]]]]), [[[[1]], [2]]]);
+    assert.deepEqual(makeFlat(false)(RA.list([[[[[1]], [2]]]])), [
+      [[[[1]], [2]]],
+    ]);
+  });
+});
diff --git a/test/isNotMap.js b/test/isNotMap.js
new file mode 100644
index 0000000000..c3e1c5485d
--- /dev/null
+++ b/test/isNotMap.js
@@ -0,0 +1,44 @@
+import * as R from 'ramda';
+import { assert } from 'chai';
+
+import * as RA from '../src';
+import Symbol from './shared/Symbol';
+
+describe('isNotMap', function () {
+  context('given a map', function () {
+    specify('should return false', function () {
+      assert.isFalse(RA.isNotMap(new Map()));
+      assert.isFalse(
+        RA.isNotMap(
+          new Map([
+            [1, 2],
+            [2, 1],
+          ])
+        )
+      );
+    });
+  });
+
+  context('given not a map', function () {
+    specify('should return true', function () {
+      assert.isTrue(RA.isNotMap('abc'));
+      assert.isTrue(RA.isNotMap(Object('abc')));
+      assert.isTrue(RA.isNotMap(Object()));
+      assert.isTrue(RA.isNotMap(new Date()));
+      assert.isTrue(RA.isNotMap(new Error()));
+      assert.isTrue(RA.isNotMap(RA.isNotMap));
+      assert.isTrue(RA.isNotMap(3));
+      assert.isTrue(RA.isNotMap(Symbol));
+      assert.isTrue(RA.isNotMap(R));
+      assert.isTrue(RA.isNotMap(new Set()));
+      assert.isTrue(RA.isNotMap(new Set([1, 2])));
+      assert.isTrue(RA.isNotMap(/regex/));
+    });
+  });
+
+  it('should support placeholder to specify "gaps"', function () {
+    const isNotMap = RA.isNotMap(R.__);
+
+    assert.isFalse(isNotMap(new Map()));
+  });
+});
diff --git a/test/isNotSet.js b/test/isNotSet.js
new file mode 100644
index 0000000000..7096cdcab8
--- /dev/null
+++ b/test/isNotSet.js
@@ -0,0 +1,34 @@
+import * as R from 'ramda';
+import { assert } from 'chai';
+
+import * as RA from '../src';
+import Symbol from './shared/Symbol';
+
+describe('isNotSet', function () {
+  context('given a set', function () {
+    specify('should return false', function () {
+      assert.isFalse(RA.isNotSet(new Set()));
+      assert.isFalse(RA.isNotSet(new Set([1, 2])));
+    });
+  });
+
+  context('given not a set', function () {
+    specify('should return true', function () {
+      assert.isTrue(RA.isNotSet('abc'));
+      assert.isTrue(RA.isNotSet(Object('abc')));
+      assert.isTrue(RA.isNotSet(new Date()));
+      assert.isTrue(RA.isNotSet(new Error()));
+      assert.isTrue(RA.isNotSet(RA.isNotSet));
+      assert.isTrue(RA.isNotSet(3));
+      assert.isTrue(RA.isNotSet(Symbol));
+      assert.isTrue(RA.isNotSet(R));
+      assert.isTrue(RA.isNotSet(/regex/));
+    });
+  });
+
+  it('should support placeholder to specify "gaps"', function () {
+    const isNotSet = RA.isNotSet(R.__);
+
+    assert.isFalse(isNotSet(new Set()));
+  });
+});
diff --git a/types/test/isNotMap.ts b/types/test/isNotMap.ts
new file mode 100644
index 0000000000..fda765a05a
--- /dev/null
+++ b/types/test/isNotMap.ts
@@ -0,0 +1,17 @@
+import * as RA from 'ramda-adjunct';
+
+RA.isNotMap(new Map()); // $ExpectType boolean
+RA.isNotMap(new Map([[1, 2], [2, 1]])); // $ExpectType boolean
+RA.isNotMap(new Set()); // $ExpectType boolean
+RA.isNotMap(new Set([1, 2])); // $ExpectType boolean
+RA.isNotMap(+0); // $ExpectType boolean
+RA.isNotMap(null); // $ExpectType boolean
+RA.isNotMap(true); // $ExpectType boolean
+RA.isNotMap(NaN); // $ExpectType boolean
+RA.isNotMap({}); // $ExpectType boolean
+RA.isNotMap([]); // $ExpectType boolean
+RA.isNotMap(() => {}); // $ExpectType boolean
+RA.isNotMap('string'); // $ExpectType boolean
+RA.isNotMap(1); // $ExpectType boolean
+RA.isNotMap(Object()); // $ExpectType boolean
+RA.isNotMap(Object(5)); // $ExpectType boolean
diff --git a/types/test/isNotSet.ts b/types/test/isNotSet.ts
new file mode 100644
index 0000000000..e95cf793a1
--- /dev/null
+++ b/types/test/isNotSet.ts
@@ -0,0 +1,16 @@
+import * as RA from 'ramda-adjunct';
+
+RA.isNotSet(new Set()); // $ExpectType boolean
+RA.isNotSet(new Set([1, 2])); // $ExpectType boolean
+RA.isNotSet(+0); // $ExpectType boolean
+RA.isNotSet(null); // $ExpectType boolean
+RA.isNotSet(true); // $ExpectType boolean
+RA.isNotSet(NaN); // $ExpectType boolean
+RA.isNotSet({}); // $ExpectType boolean
+RA.isNotSet([]); // $ExpectType boolean
+RA.isNotSet(() => {}); // $ExpectType boolean
+RA.isNotSet('string'); // $ExpectType boolean
+RA.isNotSet(1); // $ExpectType boolean
+RA.isNotSet(Object()); // $ExpectType boolean
+RA.isNotSet(Object(5)); // $ExpectType boolean
+RA.isNotSet(new Map()); // $ExpectType boolean