From d3192beced61d575f7fe970e604633110e5230c7 Mon Sep 17 00:00:00 2001 From: King Date: Sat, 10 Feb 2018 11:44:16 -0500 Subject: [PATCH 01/54] update tomorrow.md --- snippets/tomorrow.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/snippets/tomorrow.md b/snippets/tomorrow.md index fd7c4dfa1..021d563fa 100644 --- a/snippets/tomorrow.md +++ b/snippets/tomorrow.md @@ -7,12 +7,12 @@ Use `new Date()` to get today's date, adding one day using `Date.getDate()` and const tomorrow = () => { let t = new Date(); t.setDate(t.getDate() + 1); - return `${t.getFullYear()}-${String(t.getMonth() + 1).padStart(2, '0')}-${String( + return `${String(t.getMonth() + 1).padStart(2, '0')}-${String( t.getDate() - ).padStart(2, '0')}`; + ).padStart(2, '0')}-${t.getFullYear()}`; }; ``` ```js -tomorrow(); // 2017-12-27 (if current date is 2017-12-26) +tomorrow(); // 12-27-2017 (if current date is 12-26-2017) ``` From dbcc11c9435d2d9d013ee253160c2625d8eff1cd Mon Sep 17 00:00:00 2001 From: King Date: Sat, 10 Feb 2018 11:45:04 -0500 Subject: [PATCH 02/54] ran npm tester --- test/tomorrow/tomorrow.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/tomorrow/tomorrow.js b/test/tomorrow/tomorrow.js index 6cac1913e..81595a444 100644 --- a/test/tomorrow/tomorrow.js +++ b/test/tomorrow/tomorrow.js @@ -1,8 +1,8 @@ const tomorrow = () => { let t = new Date(); t.setDate(t.getDate() + 1); -return `${t.getFullYear()}-${String(t.getMonth() + 1).padStart(2, '0')}-${String( +return `${String(t.getMonth() + 1).padStart(2, '0')}-${String( t.getDate() -).padStart(2, '0')}`; +).padStart(2, '0')}-${t.getFullYear()}`; }; module.exports = tomorrow; \ No newline at end of file From 2c42bc0269df0cafc8301347e692e25eecb91452 Mon Sep 17 00:00:00 2001 From: King Date: Mon, 12 Feb 2018 16:33:02 -0500 Subject: [PATCH 03/54] add permueAll.md --- snippets/permuteAll.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 snippets/permuteAll.md diff --git a/snippets/permuteAll.md b/snippets/permuteAll.md new file mode 100644 index 000000000..d6555210b --- /dev/null +++ b/snippets/permuteAll.md @@ -0,0 +1,42 @@ +### permuteAll + +Uses recursion and `Array.push()` to return all the permutations of the given input in an array. + +```js +const permuteAll = (input) => { + const result = []; + let inputState = input; + + if (typeof input === 'string') { + inputState = input.split(''); + } else if (typeof input === 'number') { + inputState = (input).toString().split(''); + } + + const permute = (arr, m = []) => { + if (arr.length === 0) { + result.push(m) + } else { + for (let i = 0; i < arr.length; i++) { + let curr = arr.slice(); + let next = curr.splice(i, 1); + permute(curr.slice(), m.concat(next)) + } + } + } + + permute(inputState); + + return (typeof input === 'string') + ? result.map(variant => variant.join('')) + : (typeof input === 'number') + ? result.map(variant => parseFloat(variant.join(''))) + : result; +} +``` + +```js +permuteAll('sun') // [ 'sun', 'snu', 'usn', 'uns', 'nsu', 'nus' ] +permuteAll([1, 33, 5]) // [ [ 1, 33, 5 ], [ 1, 5, 33 ], [ 33, 1, 5 ], [ 33, 5, 1 ], [ 5, 1, 33 ], [ 5, 33, 1 ] ] +permuteAll(345) // [ 345, 354, 435, 453, 534, 543 ] +``` From 1ec390d724991a20ef583c6e6df90dff0ab39f04 Mon Sep 17 00:00:00 2001 From: King Date: Mon, 12 Feb 2018 16:36:32 -0500 Subject: [PATCH 04/54] ran npm run tagger & added advanced,array,string,utlilty --- tag_database | 1 + 1 file changed, 1 insertion(+) diff --git a/tag_database b/tag_database index ab6f57af0..84969ade4 100644 --- a/tag_database +++ b/tag_database @@ -174,6 +174,7 @@ partial:function partialRight:function partition:array,object,function percentile:math +permuteAll:utility,advanced,array,string pick:object,array pickBy:object,array,function pipeAsyncFunctions:adapter,function,promise From d75bdd9805fc3920dbc3aabd4911c19e9a74c6cf Mon Sep 17 00:00:00 2001 From: King Date: Mon, 12 Feb 2018 16:38:13 -0500 Subject: [PATCH 05/54] ran npm run tester and test files generated --- test/permuteAll/permuteAll.js | 31 ++++++++++++++++++++++++++++++ test/permuteAll/permuteAll.test.js | 13 +++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 test/permuteAll/permuteAll.js create mode 100644 test/permuteAll/permuteAll.test.js diff --git a/test/permuteAll/permuteAll.js b/test/permuteAll/permuteAll.js new file mode 100644 index 000000000..f005c1bd8 --- /dev/null +++ b/test/permuteAll/permuteAll.js @@ -0,0 +1,31 @@ +const permuteAll = (input) => { +const result = []; +let inputState = input; + +if (typeof input === 'string') { +inputState = input.split(''); +} else if (typeof input === 'number') { +inputState = (input).toString().split(''); +} + +const permute = (arr, m = []) => { +if (arr.length === 0) { +result.push(m) +} else { +for (let i = 0; i < arr.length; i++) { +let curr = arr.slice(); +let next = curr.splice(i, 1); +permute(curr.slice(), m.concat(next)) +} +} +} + +permute(inputState); + +return (typeof input === 'string') +? result.map(variant => variant.join('')) +: (typeof input === 'number') +? result.map(variant => parseFloat(variant.join(''))) +: result; +} +module.exports = permuteAll; \ No newline at end of file diff --git a/test/permuteAll/permuteAll.test.js b/test/permuteAll/permuteAll.test.js new file mode 100644 index 000000000..540321748 --- /dev/null +++ b/test/permuteAll/permuteAll.test.js @@ -0,0 +1,13 @@ +const test = require('tape'); +const permuteAll = require('./permuteAll.js'); + +test('Testing permuteAll', (t) => { + //For more information on all the methods supported by tape + //Please go to https://github.com/substack/tape + t.true(typeof permuteAll === 'function', 'permuteAll is a Function'); + //t.deepEqual(permuteAll(args..), 'Expected'); + //t.equal(permuteAll(args..), 'Expected'); + //t.false(permuteAll(args..), 'Expected'); + //t.throws(permuteAll(args..), 'Expected'); + t.end(); +}); \ No newline at end of file From c435f648688cc718933f3ac832fc8a85d68b130c Mon Sep 17 00:00:00 2001 From: King Date: Mon, 12 Feb 2018 16:47:53 -0500 Subject: [PATCH 06/54] refactor snippet reducing the amount of lines --- snippets/permuteAll.md | 7 ++----- test/permuteAll/permuteAll.js | 7 ++----- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/snippets/permuteAll.md b/snippets/permuteAll.md index d6555210b..63cde20da 100644 --- a/snippets/permuteAll.md +++ b/snippets/permuteAll.md @@ -7,11 +7,8 @@ const permuteAll = (input) => { const result = []; let inputState = input; - if (typeof input === 'string') { - inputState = input.split(''); - } else if (typeof input === 'number') { - inputState = (input).toString().split(''); - } + if (typeof input === 'string') inputState = input.split('') + if (typeof input === 'number') inputState = (input).toString().split(''); const permute = (arr, m = []) => { if (arr.length === 0) { diff --git a/test/permuteAll/permuteAll.js b/test/permuteAll/permuteAll.js index f005c1bd8..672c7a094 100644 --- a/test/permuteAll/permuteAll.js +++ b/test/permuteAll/permuteAll.js @@ -2,11 +2,8 @@ const permuteAll = (input) => { const result = []; let inputState = input; -if (typeof input === 'string') { -inputState = input.split(''); -} else if (typeof input === 'number') { -inputState = (input).toString().split(''); -} +if (typeof input === 'string') inputState = input.split('') +if (typeof input === 'number') inputState = (input).toString().split(''); const permute = (arr, m = []) => { if (arr.length === 0) { From 96c37eea5ad82f33cfa3f7dd565eedb909535458 Mon Sep 17 00:00:00 2001 From: King Date: Mon, 12 Feb 2018 19:22:11 -0500 Subject: [PATCH 07/54] ran npm run tester generate js test files and refactored permuteAll --- snippets/permuteAll.md | 20 +++++++++----------- test/permuteAll/permuteAll.js | 16 +++++++--------- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/snippets/permuteAll.md b/snippets/permuteAll.md index 63cde20da..746b964e9 100644 --- a/snippets/permuteAll.md +++ b/snippets/permuteAll.md @@ -7,20 +7,18 @@ const permuteAll = (input) => { const result = []; let inputState = input; - if (typeof input === 'string') inputState = input.split('') + if (typeof input === 'string') inputState = input.split(''); if (typeof input === 'number') inputState = (input).toString().split(''); const permute = (arr, m = []) => { - if (arr.length === 0) { - result.push(m) - } else { - for (let i = 0; i < arr.length; i++) { - let curr = arr.slice(); - let next = curr.splice(i, 1); - permute(curr.slice(), m.concat(next)) - } - } - } + (arr.length === 0) + ? result.push(m) + : arr.forEach((_, i) => { + let curr = arr.slice(); + let next = curr.splice(i, 1); + permute(curr.slice(), m.concat(next)); + }); + }; permute(inputState); diff --git a/test/permuteAll/permuteAll.js b/test/permuteAll/permuteAll.js index 672c7a094..facdd309b 100644 --- a/test/permuteAll/permuteAll.js +++ b/test/permuteAll/permuteAll.js @@ -2,20 +2,18 @@ const permuteAll = (input) => { const result = []; let inputState = input; -if (typeof input === 'string') inputState = input.split('') +if (typeof input === 'string') inputState = input.split(''); if (typeof input === 'number') inputState = (input).toString().split(''); const permute = (arr, m = []) => { -if (arr.length === 0) { -result.push(m) -} else { -for (let i = 0; i < arr.length; i++) { +(arr.length === 0) +? result.push(m) +: arr.forEach((_, i) => { let curr = arr.slice(); let next = curr.splice(i, 1); -permute(curr.slice(), m.concat(next)) -} -} -} +permute(curr.slice(), m.concat(next)); +}); +}; permute(inputState); From 978f8e9ca12b33885d3528a320d4613b6d47e6cf Mon Sep 17 00:00:00 2001 From: King Date: Mon, 12 Feb 2018 22:47:17 -0500 Subject: [PATCH 08/54] add all missing semi colons --- snippets/permuteAll.md | 2 +- test/permuteAll/permuteAll.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/snippets/permuteAll.md b/snippets/permuteAll.md index 746b964e9..16a26cb3b 100644 --- a/snippets/permuteAll.md +++ b/snippets/permuteAll.md @@ -27,7 +27,7 @@ const permuteAll = (input) => { : (typeof input === 'number') ? result.map(variant => parseFloat(variant.join(''))) : result; -} +}; ``` ```js diff --git a/test/permuteAll/permuteAll.js b/test/permuteAll/permuteAll.js index facdd309b..eafd9b30b 100644 --- a/test/permuteAll/permuteAll.js +++ b/test/permuteAll/permuteAll.js @@ -22,5 +22,5 @@ return (typeof input === 'string') : (typeof input === 'number') ? result.map(variant => parseFloat(variant.join(''))) : result; -} +}; module.exports = permuteAll; \ No newline at end of file From b0df93090f73732409b9b18f0f5b6f4fe3668fdd Mon Sep 17 00:00:00 2001 From: Rohit Tanwar <31792358+kriadmin@users.noreply.github.com> Date: Sun, 18 Feb 2018 11:12:51 +0530 Subject: [PATCH 09/54] Update tag_database --- tag_database | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tag_database b/tag_database index d5017cff0..8ecaefa21 100644 --- a/tag_database +++ b/tag_database @@ -284,4 +284,4 @@ xProd:array,math yesNo:utility,regexp zip:array zipObject:array,object -zipWith:uncategorized +zipWith:array,function,advanced From 344014f0778805133bb3a4cde5d372ac3e51cf0d Mon Sep 17 00:00:00 2001 From: Rohit Tanwar <31792358+kriadmin@users.noreply.github.com> Date: Sun, 18 Feb 2018 11:23:43 +0530 Subject: [PATCH 10/54] Add missing semicolon --- test/fuzzySearch/fuzzySearch.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/fuzzySearch/fuzzySearch.js b/test/fuzzySearch/fuzzySearch.js index 22f6c2140..194ef0333 100644 --- a/test/fuzzySearch/fuzzySearch.js +++ b/test/fuzzySearch/fuzzySearch.js @@ -15,5 +15,5 @@ if (patternChar === strChar) } return patternLength !== 0 && strLength !== 0 && patternIdx === patternLength ? true : false; -} -module.exports = fuzzySearch; \ No newline at end of file +}; +module.exports = fuzzySearch; From 0e9a7b5b74364e4d8359a29964243a9f9cbd7dae Mon Sep 17 00:00:00 2001 From: Rohit Tanwar <31792358+kriadmin@users.noreply.github.com> Date: Sun, 18 Feb 2018 11:24:04 +0530 Subject: [PATCH 11/54] Add missing semicolon --- snippets/fuzzySearch.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/snippets/fuzzySearch.md b/snippets/fuzzySearch.md index 7d13e1d39..5c9db6d69 100644 --- a/snippets/fuzzySearch.md +++ b/snippets/fuzzySearch.md @@ -23,11 +23,11 @@ fuzzySearch = (patrn, str) => { } return patternLength !== 0 && strLength !== 0 && patternIdx === patternLength ? true : false; -} +}; ``` ``` js fuzzySearch('rt','Rohit'); // true fuzzySearch('tr','Rohit'); // false -``` \ No newline at end of file +``` From 82688cbdaa04fd7271c864c38e3e008a617a2a85 Mon Sep 17 00:00:00 2001 From: Rohit Tanwar Date: Mon, 19 Feb 2018 18:21:15 +0530 Subject: [PATCH 12/54] update --- snippets/fuzzySearch.md | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/snippets/fuzzySearch.md b/snippets/fuzzySearch.md index 5c9db6d69..9760f5279 100644 --- a/snippets/fuzzySearch.md +++ b/snippets/fuzzySearch.md @@ -6,20 +6,15 @@ Loops through `str` and determines if it contains all characters of `patrn` and Taken from [here](https://github.com/forrestthewoods/lib_fts/blob/80f3f8c52db53428247e741b9efe2cde9667050c/code/fts_fuzzy_match.js#L18). ``` js -fuzzySearch = (patrn, str) => { - const pattern = patrn; - const string = str; - let patternIdx = 0; - let strIdx = 0; +fuzzySearch = (pattern, string) => { let patternLength = pattern.length; let strLength = string.length; - while (patternIdx !== patternLength && strIdx !== strLength) { + for (var patternIdx = 0, strIdx = 0;patternIdx !== patternLength && strIdx !== strLength;strIdx++){ let patternChar = pattern[patternIdx].toLowerCase(); let strChar = string[strIdx].toLowerCase(); if (patternChar === strChar) ++patternIdx; - ++strIdx; } return patternLength !== 0 && strLength !== 0 && patternIdx === patternLength ? true : false; From 7c8181970590f41de925e27717e6b0725d577049 Mon Sep 17 00:00:00 2001 From: Angelos Chalaris Date: Mon, 19 Feb 2018 15:21:16 +0200 Subject: [PATCH 13/54] Update tag_database --- tag_database | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tag_database b/tag_database index 8ecaefa21..412941ddb 100644 --- a/tag_database +++ b/tag_database @@ -284,4 +284,4 @@ xProd:array,math yesNo:utility,regexp zip:array zipObject:array,object -zipWith:array,function,advanced +zipWith:array,function,advanced From cd4fcb1776ae48b73a9e992f22d793c20a1371e6 Mon Sep 17 00:00:00 2001 From: Angelos Chalaris Date: Mon, 19 Feb 2018 15:47:47 +0200 Subject: [PATCH 14/54] Implemented suggesting improvements --- snippets/anagrams.md | 27 - snippets/isAnagram.md | 16 + snippets/permutations.md | 30 + snippets/permuteAll.md | 37 - snippets/stringPermutations.md | 27 + tag_database | 5 +- test/anagrams/anagrams.js | 11 - test/anagrams/anagrams.test.js | 16 - test/isAnagram/isAnagram.js | 5 + test/isAnagram/isAnagram.test.js | 17 + test/permutations/permutations.js | 14 + test/permutations/permutations.test.js | 14 + test/permuteAll/permuteAll.js | 26 - test/permuteAll/permuteAll.test.js | 13 - test/stringPermutations/stringPermutations.js | 11 + .../stringPermutations.test.js | 16 + test/testlog | 1933 +++++++++-------- 17 files changed, 1126 insertions(+), 1092 deletions(-) delete mode 100644 snippets/anagrams.md create mode 100644 snippets/isAnagram.md create mode 100644 snippets/permutations.md delete mode 100644 snippets/permuteAll.md create mode 100644 snippets/stringPermutations.md delete mode 100644 test/anagrams/anagrams.js delete mode 100644 test/anagrams/anagrams.test.js create mode 100644 test/isAnagram/isAnagram.js create mode 100644 test/isAnagram/isAnagram.test.js create mode 100644 test/permutations/permutations.js create mode 100644 test/permutations/permutations.test.js delete mode 100644 test/permuteAll/permuteAll.js delete mode 100644 test/permuteAll/permuteAll.test.js create mode 100644 test/stringPermutations/stringPermutations.js create mode 100644 test/stringPermutations/stringPermutations.test.js diff --git a/snippets/anagrams.md b/snippets/anagrams.md deleted file mode 100644 index ae7284a0b..000000000 --- a/snippets/anagrams.md +++ /dev/null @@ -1,27 +0,0 @@ -### anagrams - -⚠️ **WARNING**: This function's execution time increases exponentially with each character. Anything more than 8 to 10 characters will cause your browser to hang as it tries to solve all the different combinations. - -Generates all anagrams of a string (contains duplicates). - -Use recursion. -For each letter in the given string, create all the partial anagrams for the rest of its letters. -Use `Array.map()` to combine the letter with each partial anagram, then `Array.reduce()` to combine all anagrams in one array. -Base cases are for string `length` equal to `2` or `1`. - -```js -const anagrams = str => { - if (str.length <= 2) return str.length === 2 ? [str, str[1] + str[0]] : [str]; - return str - .split('') - .reduce( - (acc, letter, i) => - acc.concat(anagrams(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)), - [] - ); -}; -``` - -```js -anagrams('abc'); // ['abc','acb','bac','bca','cab','cba'] -``` diff --git a/snippets/isAnagram.md b/snippets/isAnagram.md new file mode 100644 index 000000000..492f54988 --- /dev/null +++ b/snippets/isAnagram.md @@ -0,0 +1,16 @@ +### isAnagram + +Checks if a string is an anagram of another string (case-insensitive, ignores spaces, punctuation and special characters). + +Use `String.toLowerCase()`, `String.replace()` with an appropriate regular expression to remove unnecessary characters, `String.split('')`, `Array.sort()` and `Array.join('')` on both strings to normalize them, then check if their normalized forms are equal. + +```js +const isAnagram = (str1, str2) => { + const normalize = str => str.toLowerCase().replace(/[^a-z0-9]/gi, '').split('').sort().join(''); + return normalize(str1) === normalize(str2); +} +``` + +```js +isAnagram('iceman', 'cinema'); // true +``` diff --git a/snippets/permutations.md b/snippets/permutations.md new file mode 100644 index 000000000..42168724e --- /dev/null +++ b/snippets/permutations.md @@ -0,0 +1,30 @@ +### permutations + +⚠️ **WARNING**: This function's execution time increases exponentially with each array element. Anything more than 8 to 10 entries will cause your browser to hang as it tries to solve all the different combinations. + +Generates all permutations of an array's elements (contains duplicates). + +Use recursion. +For each element in the given array, create all the partial permutations for the rest of its elements. +Use `Array.map()` to combine the element with each partial permutation, then `Array.reduce()` to combine all permutations in one array. +Base cases are for array `length` equal to `2` or `1`. + +```js +const permutations = arr => { + if (arr.length <= 2) return arr.length === 2 ? [arr, [arr[1], arr[0]]] : arr; + return arr.reduce( + (acc, item, i) => + acc.concat( + permutations([...arr.slice(0, i), ...arr.slice(i + 1)]).map(val => [ + item, + ...val, + ]) + ), + [] + ); +}; +``` + +```js +permutations([1, 33, 5]) // [ [ 1, 33, 5 ], [ 1, 5, 33 ], [ 33, 1, 5 ], [ 33, 5, 1 ], [ 5, 1, 33 ], [ 5, 33, 1 ] ] +``` diff --git a/snippets/permuteAll.md b/snippets/permuteAll.md deleted file mode 100644 index 16a26cb3b..000000000 --- a/snippets/permuteAll.md +++ /dev/null @@ -1,37 +0,0 @@ -### permuteAll - -Uses recursion and `Array.push()` to return all the permutations of the given input in an array. - -```js -const permuteAll = (input) => { - const result = []; - let inputState = input; - - if (typeof input === 'string') inputState = input.split(''); - if (typeof input === 'number') inputState = (input).toString().split(''); - - const permute = (arr, m = []) => { - (arr.length === 0) - ? result.push(m) - : arr.forEach((_, i) => { - let curr = arr.slice(); - let next = curr.splice(i, 1); - permute(curr.slice(), m.concat(next)); - }); - }; - - permute(inputState); - - return (typeof input === 'string') - ? result.map(variant => variant.join('')) - : (typeof input === 'number') - ? result.map(variant => parseFloat(variant.join(''))) - : result; -}; -``` - -```js -permuteAll('sun') // [ 'sun', 'snu', 'usn', 'uns', 'nsu', 'nus' ] -permuteAll([1, 33, 5]) // [ [ 1, 33, 5 ], [ 1, 5, 33 ], [ 33, 1, 5 ], [ 33, 5, 1 ], [ 5, 1, 33 ], [ 5, 33, 1 ] ] -permuteAll(345) // [ 345, 354, 435, 453, 534, 543 ] -``` diff --git a/snippets/stringPermutations.md b/snippets/stringPermutations.md new file mode 100644 index 000000000..dee086afa --- /dev/null +++ b/snippets/stringPermutations.md @@ -0,0 +1,27 @@ +### stringPermutations + +⚠️ **WARNING**: This function's execution time increases exponentially with each character. Anything more than 8 to 10 characters will cause your browser to hang as it tries to solve all the different combinations. + +Generates all permutations of a string (contains duplicates). + +Use recursion. +For each letter in the given string, create all the partial permutations for the rest of its letters. +Use `Array.map()` to combine the letter with each partial permutation, then `Array.reduce()` to combine all permutations in one array. +Base cases are for string `length` equal to `2` or `1`. + +```js +const stringPermutations = str => { + if (str.length <= 2) return str.length === 2 ? [str, str[1] + str[0]] : [str]; + return str + .split('') + .reduce( + (acc, letter, i) => + acc.concat(stringPermutations(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)), + [] + ); +}; +``` + +```js +stringPermutations('abc'); // ['abc','acb','bac','bca','cab','cba'] +``` diff --git a/tag_database b/tag_database index 84969ade4..10cc1708a 100644 --- a/tag_database +++ b/tag_database @@ -1,4 +1,3 @@ -anagrams:string,recursion arrayToHtmlList:browser,array ary:adapter,function atob:node,string,utility @@ -110,6 +109,7 @@ intersectionWith:array,function invertKeyValues:object,function is:type,array,regexp isAbsoluteURL:string,utility,browser,url +isAnagram:string,regexp isArrayLike:type,array isBoolean:type isDivisible:math @@ -174,7 +174,7 @@ partial:function partialRight:function partition:array,object,function percentile:math -permuteAll:utility,advanced,array,string +permutations:array,recursion pick:object,array pickBy:object,array,function pipeAsyncFunctions:adapter,function,promise @@ -225,6 +225,7 @@ sortedLastIndexBy:array,math,function splitLines:string spreadOver:adapter standardDeviation:math,array +stringPermutations:string,recursion stripHTMLTags:string,utility,regexp sum:math,array sumBy:math,array,function diff --git a/test/anagrams/anagrams.js b/test/anagrams/anagrams.js deleted file mode 100644 index 86b0f4f45..000000000 --- a/test/anagrams/anagrams.js +++ /dev/null @@ -1,11 +0,0 @@ -const anagrams = str => { -if (str.length <= 2) return str.length === 2 ? [str, str[1] + str[0]] : [str]; -return str -.split('') -.reduce( -(acc, letter, i) => -acc.concat(anagrams(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)), -[] -); -}; -module.exports = anagrams; \ No newline at end of file diff --git a/test/anagrams/anagrams.test.js b/test/anagrams/anagrams.test.js deleted file mode 100644 index a7987d63f..000000000 --- a/test/anagrams/anagrams.test.js +++ /dev/null @@ -1,16 +0,0 @@ -const test = require('tape'); -const anagrams = require('./anagrams.js'); - -test('Testing anagrams', (t) => { - //For more information on all the methods supported by tape - //Please go to https://github.com/substack/tape - t.true(typeof anagrams === 'function', 'anagrams is a Function'); - t.deepEqual(anagrams('abc'), ['abc','acb','bac','bca','cab','cba'], "Generates all anagrams of a string"); - t.deepEqual(anagrams('a'), ['a'], "Works for single-letter strings"); - t.deepEqual(anagrams(''), [''], "Works for empty strings"); - //t.deepEqual(anagrams(args..), 'Expected'); - //t.equal(anagrams(args..), 'Expected'); - //t.false(anagrams(args..), 'Expected'); - //t.throws(anagrams(args..), 'Expected'); - t.end(); -}); diff --git a/test/isAnagram/isAnagram.js b/test/isAnagram/isAnagram.js new file mode 100644 index 000000000..762ce25f8 --- /dev/null +++ b/test/isAnagram/isAnagram.js @@ -0,0 +1,5 @@ +const isAnagram = (str1, str2) => { +const normalize = str => str.toLowerCase().replace(/[^a-z0-9]/gi, '').split('').sort().join(''); +return normalize(str1) === normalize(str2); +} +module.exports = isAnagram; \ No newline at end of file diff --git a/test/isAnagram/isAnagram.test.js b/test/isAnagram/isAnagram.test.js new file mode 100644 index 000000000..915d14aba --- /dev/null +++ b/test/isAnagram/isAnagram.test.js @@ -0,0 +1,17 @@ +const test = require('tape'); +const isAnagram = require('./isAnagram.js'); + +test('Testing isAnagram', (t) => { + //For more information on all the methods supported by tape + //Please go to https://github.com/substack/tape + t.true(typeof isAnagram === 'function', 'isAnagram is a Function'); + t.true(isAnagram('iceman', 'cinema'), 'Checks valid anagram'); + t.true(isAnagram('rail safety', 'fairy tales'), 'Works with spaces'); + t.true(isAnagram('roast beef', 'eat for BSE'), 'Ignores case'); + t.true(isAnagram('Regera Dowdy', 'E. G. Deadworry'), 'Ignores special characters'); + //t.deepEqual(isAnagram(args..), 'Expected'); + //t.equal(isAnagram(args..), 'Expected'); + //t.false(isAnagram(args..), 'Expected'); + //t.throws(isAnagram(args..), 'Expected'); + t.end(); +}); diff --git a/test/permutations/permutations.js b/test/permutations/permutations.js new file mode 100644 index 000000000..165b38dc9 --- /dev/null +++ b/test/permutations/permutations.js @@ -0,0 +1,14 @@ +const permutations = arr => { +if (arr.length <= 2) return arr.length === 2 ? [arr, [arr[1], arr[0]]] : arr; +return arr.reduce( +(acc, item, i) => +acc.concat( +permutations([...arr.slice(0, i), ...arr.slice(i + 1)]).map(val => [ +item, +...val, +]) +), +[] +); +}; +module.exports = permutations; \ No newline at end of file diff --git a/test/permutations/permutations.test.js b/test/permutations/permutations.test.js new file mode 100644 index 000000000..fe9b08e46 --- /dev/null +++ b/test/permutations/permutations.test.js @@ -0,0 +1,14 @@ +const test = require('tape'); +const permutations = require('./permutations.js'); + +test('Testing permutations', (t) => { + //For more information on all the methods supported by tape + //Please go to https://github.com/substack/tape + t.true(typeof permutations === 'function', 'permutations is a Function'); + t.deepEqual(permutations([1, 33, 5]), [ [ 1, 33, 5 ], [ 1, 5, 33 ], [ 33, 1, 5 ], [ 33, 5, 1 ], [ 5, 1, 33 ], [ 5, 33, 1 ] ], 'Generates all permutations of an array'); + //t.deepEqual(permuteAll(args..), 'Expected'); + //t.equal(permuteAll(args..), 'Expected'); + //t.false(permuteAll(args..), 'Expected'); + //t.throws(permuteAll(args..), 'Expected'); + t.end(); +}); diff --git a/test/permuteAll/permuteAll.js b/test/permuteAll/permuteAll.js deleted file mode 100644 index eafd9b30b..000000000 --- a/test/permuteAll/permuteAll.js +++ /dev/null @@ -1,26 +0,0 @@ -const permuteAll = (input) => { -const result = []; -let inputState = input; - -if (typeof input === 'string') inputState = input.split(''); -if (typeof input === 'number') inputState = (input).toString().split(''); - -const permute = (arr, m = []) => { -(arr.length === 0) -? result.push(m) -: arr.forEach((_, i) => { -let curr = arr.slice(); -let next = curr.splice(i, 1); -permute(curr.slice(), m.concat(next)); -}); -}; - -permute(inputState); - -return (typeof input === 'string') -? result.map(variant => variant.join('')) -: (typeof input === 'number') -? result.map(variant => parseFloat(variant.join(''))) -: result; -}; -module.exports = permuteAll; \ No newline at end of file diff --git a/test/permuteAll/permuteAll.test.js b/test/permuteAll/permuteAll.test.js deleted file mode 100644 index 540321748..000000000 --- a/test/permuteAll/permuteAll.test.js +++ /dev/null @@ -1,13 +0,0 @@ -const test = require('tape'); -const permuteAll = require('./permuteAll.js'); - -test('Testing permuteAll', (t) => { - //For more information on all the methods supported by tape - //Please go to https://github.com/substack/tape - t.true(typeof permuteAll === 'function', 'permuteAll is a Function'); - //t.deepEqual(permuteAll(args..), 'Expected'); - //t.equal(permuteAll(args..), 'Expected'); - //t.false(permuteAll(args..), 'Expected'); - //t.throws(permuteAll(args..), 'Expected'); - t.end(); -}); \ No newline at end of file diff --git a/test/stringPermutations/stringPermutations.js b/test/stringPermutations/stringPermutations.js new file mode 100644 index 000000000..47bb27da4 --- /dev/null +++ b/test/stringPermutations/stringPermutations.js @@ -0,0 +1,11 @@ +const stringPermutations = str => { +if (str.length <= 2) return str.length === 2 ? [str, str[1] + str[0]] : [str]; +return str +.split('') +.reduce( +(acc, letter, i) => +acc.concat(stringPermutations(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)), +[] +); +}; +module.exports = stringPermutations; \ No newline at end of file diff --git a/test/stringPermutations/stringPermutations.test.js b/test/stringPermutations/stringPermutations.test.js new file mode 100644 index 000000000..6b5bb11ad --- /dev/null +++ b/test/stringPermutations/stringPermutations.test.js @@ -0,0 +1,16 @@ +const test = require('tape'); +const stringPermutations = require('./stringPermutations.js'); + +test('Testing stringPermutations', (t) => { + //For more information on all the methods supported by tape + //Please go to https://github.com/substack/tape + t.true(typeof stringPermutations === 'function', 'stringPermutations is a Function'); + t.deepEqual(stringPermutations('abc'), ['abc','acb','bac','bca','cab','cba'], "Generates all stringPermutations of a string"); + t.deepEqual(stringPermutations('a'), ['a'], "Works for single-letter strings"); + t.deepEqual(stringPermutations(''), [''], "Works for empty strings"); + //t.deepEqual(anagrams(args..), 'Expected'); + //t.equal(anagrams(args..), 'Expected'); + //t.false(anagrams(args..), 'Expected'); + //t.throws(anagrams(args..), 'Expected'); + t.end(); +}); diff --git a/test/testlog b/test/testlog index 061f9c12b..0139bd3ae 100644 --- a/test/testlog +++ b/test/testlog @@ -1,1810 +1,1823 @@ -Test log for: Mon Feb 12 2018 20:20:58 GMT+0000 (UTC) +Test log for: Mon Feb 19 2018 15:47:32 GMT+0200 (GTB Standard Time) -> 30-seconds-of-code@0.0.1 test /home/travis/build/Chalarangelo/30-seconds-of-code +> 30-seconds-of-code@0.0.1 test G:\My Files\git Repositories\30-seconds-of-code > tape test/**/*.test.js | tap-spec - Testing JSONToDate - - ✔ JSONToDate is a Function - - Testing JSONToFile - - ✔ JSONToFile is a Function - ✔ Tested on 09/02/2018 by @chalarangelo - - Testing RGBToHex - - ✔ RGBToHex is a Function - ✔ Converts the values of RGB components to a color code. - - Testing URLJoin - - ✔ URLJoin is a Function - ✔ Returns proper URL - ✔ Returns proper URL - - Testing UUIDGeneratorBrowser - - ✔ UUIDGeneratorBrowser is a Function - ✔ Tested 09/02/2018 by @chalarangelo - - Testing UUIDGeneratorNode - - ✔ UUIDGeneratorNode is a Function - ✔ Contains dashes in the proper places - ✔ Only contains hexadecimal digits - - Testing anagrams - - ✔ anagrams is a Function - ✔ Generates all anagrams of a string - ✔ Works for single-letter strings - ✔ Works for empty strings - Testing arrayToHtmlList - ✔ arrayToHtmlList is a Function + √ arrayToHtmlList is a Function Testing ary - ✔ ary is a Function - ✔ Discards arguments with index >=n + √ ary is a Function + √ Discards arguments with index >=n Testing atob - ✔ atob is a Function - ✔ atob("Zm9vYmFy") equals "foobar" - ✔ atob("Z") returns "" + √ atob is a Function + √ atob("Zm9vYmFy") equals "foobar" + √ atob("Z") returns "" Testing attempt - ✔ attempt is a Function - ✔ Returns a value - ✔ Returns an error + √ attempt is a Function + √ Returns a value + √ Returns an error Testing average - ✔ average is a Function - ✔ average(true) returns 0 - ✔ average(false) returns 1 - ✔ average(9, 1) returns 5 - ✔ average(153, 44, 55, 64, 71, 1122, 322774, 2232, 23423, 234, 3631) returns 32163.909090909092 - ✔ average(1, 2, 3) returns 2 - ✔ average(null) returns 0 - ✔ average(1, 2, 3) returns NaN - ✔ average(String) returns NaN - ✔ average({ a: 123}) returns NaN - ✔ average([undefined, 0, string]) returns NaN - ✔ head([1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 1122, 32124, 23232]) takes less than 2s to run + √ average is a Function + √ average(true) returns 0 + √ average(false) returns 1 + √ average(9, 1) returns 5 + √ average(153, 44, 55, 64, 71, 1122, 322774, 2232, 23423, 234, 3631) returns 32163.909090909092 + √ average(1, 2, 3) returns 2 + √ average(null) returns 0 + √ average(1, 2, 3) returns NaN + √ average(String) returns NaN + √ average({ a: 123}) returns NaN + √ average([undefined, 0, string]) returns NaN + √ head([1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 1122, 32124, 23232]) takes less than 2s to run Testing averageBy - ✔ averageBy is a Function - ✔ Produces the right result with a function - ✔ Produces the right result with a property name + √ averageBy is a Function + √ Produces the right result with a function + √ Produces the right result with a property name Testing binarySearch - ✔ binarySearch is a Function - ✔ Finds item in array - ✔ Returns -1 when not found - ✔ Works with empty arrays - ✔ Works for one element arrays + √ binarySearch is a Function + √ Finds item in array + √ Returns -1 when not found + √ Works with empty arrays + √ Works for one element arrays Testing bind - ✔ bind is a Function - ✔ Binds to an object context + √ bind is a Function + √ Binds to an object context Testing bindAll - ✔ bindAll is a Function - ✔ Binds to an object context + √ bindAll is a Function + √ Binds to an object context Testing bindKey - ✔ bindKey is a Function - ✔ Binds function to an object context + √ bindKey is a Function + √ Binds function to an object context Testing bottomVisible - ✔ bottomVisible is a Function - ✔ Tested on 09/02/2018 by @chalarangelo + √ bottomVisible is a Function + √ Tested on 09/02/2018 by @chalarangelo Testing btoa - ✔ btoa is a Function - ✔ btoa("foobar") equals "Zm9vYmFy" + √ btoa is a Function + √ btoa("foobar") equals "Zm9vYmFy" Testing byteSize - ✔ byteSize is a Function - ✔ Works for a single letter - ✔ Works for a common string - ✔ Works for emoji + √ byteSize is a Function + √ Works for a single letter + √ Works for a common string + √ Works for emoji Testing call - ✔ call is a Function - ✔ Calls function on given object + √ call is a Function + √ Calls function on given object Testing capitalize - ✔ capitalize is a Function - ✔ Capitalizes the first letter of a string - ✔ Capitalizes the first letter of a string - ✔ Works with characters - ✔ Works with single character words + √ capitalize is a Function + √ Capitalizes the first letter of a string + √ Capitalizes the first letter of a string + √ Works with characters + √ Works with single character words Testing capitalizeEveryWord - ✔ capitalizeEveryWord is a Function - ✔ Capitalizes the first letter of every word in a string - ✔ Works with characters - ✔ Works with one word string + √ capitalizeEveryWord is a Function + √ Capitalizes the first letter of every word in a string + √ Works with characters + √ Works with one word string Testing castArray - ✔ castArray is a Function - ✔ Works for single values - ✔ Works for arrays with one value - ✔ Works for arrays with multiple value - ✔ Works for strings - ✔ Works for objects + √ castArray is a Function + √ Works for single values + √ Works for arrays with one value + √ Works for arrays with multiple value + √ Works for strings + √ Works for objects Testing chainAsync - ✔ chainAsync is a Function + √ chainAsync is a Function Testing chunk - ✔ chunk is a Function - ✔ chunk([1, 2, 3, 4, 5], 2) returns [[1,2],[3,4],[5]] - ✔ chunk([]) returns [] - ✔ chunk(123) returns [] - ✔ chunk({ a: 123}) returns [] - ✔ chunk(string, 2) returns [ st, ri, ng ] - ✔ chunk() throws an error - ✔ chunk(undefined) throws an error - ✔ chunk(null) throws an error - ✔ chunk(This is a string, 2) takes less than 2s to run + √ chunk is a Function + √ chunk([1, 2, 3, 4, 5], 2) returns [[1,2],[3,4],[5]] + √ chunk([]) returns [] + √ chunk(123) returns [] + √ chunk({ a: 123}) returns [] + √ chunk(string, 2) returns [ st, ri, ng ] + √ chunk() throws an error + √ chunk(undefined) throws an error + √ chunk(null) throws an error + √ chunk(This is a string, 2) takes less than 2s to run Testing clampNumber - ✔ clampNumber is a Function - ✔ Clamps num within the inclusive range specified by the boundary values a and b + √ clampNumber is a Function + √ Clamps num within the inclusive range specified by the boundary values a and b Testing cleanObj - ✔ cleanObj is a Function - ✔ Removes any properties except the ones specified from a JSON object + √ cleanObj is a Function + √ Removes any properties except the ones specified from a JSON object Testing cloneRegExp - ✔ cloneRegExp is a Function - ✔ Clones regular expressions properly + √ cloneRegExp is a Function + √ Clones regular expressions properly Testing coalesce - ✔ coalesce is a Function - ✔ Returns the first non-null/undefined argument + √ coalesce is a Function + √ Returns the first non-null/undefined argument Testing coalesceFactory - ✔ coalesceFactory is a Function - ✔ Returns a customized coalesce function + √ coalesceFactory is a Function + √ Returns a customized coalesce function Testing collatz - ✔ collatz is a Function - ✔ When n is even, divide by 2 - ✔ When n is odd, times by 3 and add 1 - ✔ Eventually reaches 1 + √ collatz is a Function + √ When n is even, divide by 2 + √ When n is odd, times by 3 and add 1 + √ Eventually reaches 1 Testing collectInto - ✔ collectInto is a Function + √ collectInto is a Function Testing colorize - ✔ colorize is a Function - ✔ Tested on 09/02/2018 by @chalarangelo + √ colorize is a Function + √ Tested on 09/02/2018 by @chalarangelo Testing compact - ✔ compact is a Function - ✔ Removes falsey values from an array + √ compact is a Function + √ Removes falsey values from an array Testing compose - ✔ compose is a Function - ✔ Performs right-to-left function composition + √ compose is a Function + √ Performs right-to-left function composition Testing composeRight - ✔ composeRight is a Function - ✔ Performs left-to-right function composition + √ composeRight is a Function + √ Performs left-to-right function composition Testing converge - ✔ converge is a Function - ✔ Produces the average of the array - ✔ Produces the strange concatenation + √ converge is a Function + √ Produces the average of the array + √ Produces the strange concatenation Testing copyToClipboard - ✔ copyToClipboard is a Function - ✔ Tested on 09/02/2018 by @chalarangelo + √ copyToClipboard is a Function + √ Tested on 09/02/2018 by @chalarangelo Testing countBy - ✔ countBy is a Function - ✔ Works for functions - ✔ Works for property names + √ countBy is a Function + √ Works for functions + √ Works for property names Testing countOccurrences - ✔ countOccurrences is a Function - ✔ Counts the occurrences of a value in an array + √ countOccurrences is a Function + √ Counts the occurrences of a value in an array Testing countVowels - ✔ countVowels is a Function + √ countVowels is a Function Testing createElement - ✔ createElement is a Function + √ createElement is a Function Testing createEventHub - ✔ createEventHub is a Function + √ createEventHub is a Function Testing currentURL - ✔ currentURL is a Function + √ currentURL is a Function Testing curry - ✔ curry is a Function - ✔ curries a Math.pow - ✔ curries a Math.min + √ curry is a Function + √ curries a Math.pow + √ curries a Math.min Testing debounce - ✔ debounce is a Function + √ debounce is a Function Testing decapitalize - ✔ decapitalize is a Function - ✔ Works with default parameter - ✔ Works with second parameter set to true + √ decapitalize is a Function + √ Works with default parameter + √ Works with second parameter set to true Testing deepClone - ✔ deepClone is a Function - ✔ Shallow cloning works - ✔ Deep cloning works + √ deepClone is a Function + √ Shallow cloning works + √ Deep cloning works Testing deepFlatten - ✔ deepFlatten is a Function - ✔ Deep flattens an array + √ deepFlatten is a Function + √ Deep flattens an array Testing defaults - ✔ defaults is a Function + √ defaults is a Function Testing defer - ✔ defer is a Function + √ defer is a Function Testing delay - ✔ delay is a Function + √ delay is a Function Testing detectDeviceType - ✔ detectDeviceType is a Function - ✔ Tested on 09/02/2018 by @chalarangelo + √ detectDeviceType is a Function + √ Tested on 09/02/2018 by @chalarangelo Testing difference - ✔ difference is a Function - ✔ Returns the difference between two arrays + √ difference is a Function + √ Returns the difference between two arrays Testing differenceBy - ✔ differenceBy is a Function - ✔ Works using a native function and numbers - ✔ Works with arrow function and objects + √ differenceBy is a Function + √ Works using a native function and numbers + √ Works with arrow function and objects Testing differenceWith - ✔ differenceWith is a Function - ✔ Filters out all values from an array + √ differenceWith is a Function + √ Filters out all values from an array Testing digitize - ✔ digitize is a Function - ✔ Converts a number to an array of digits + √ digitize is a Function + √ Converts a number to an array of digits Testing distance - ✔ distance is a Function - ✔ Calculates the distance between two points + √ distance is a Function + √ Calculates the distance between two points Testing drop - ✔ drop is a Function - ✔ Works without the last argument - ✔ Removes appropriate element count as specified - ✔ Empties array given a count greater than length + √ drop is a Function + √ Works without the last argument + √ Removes appropriate element count as specified + √ Empties array given a count greater than length Testing dropRight - ✔ dropRight is a Function - ✔ Returns a new array with n elements removed from the right - ✔ Returns a new array with n elements removed from the right - ✔ Returns a new array with n elements removed from the right + √ dropRight is a Function + √ Returns a new array with n elements removed from the right + √ Returns a new array with n elements removed from the right + √ Returns a new array with n elements removed from the right Testing dropRightWhile - ✔ dropRightWhile is a Function - ✔ Removes elements from the end of an array until the passed function returns true. + √ dropRightWhile is a Function + √ Removes elements from the end of an array until the passed function returns true. Testing dropWhile - ✔ dropWhile is a Function - ✔ Removes elements in an array until the passed function returns true. + √ dropWhile is a Function + √ Removes elements in an array until the passed function returns true. Testing elementIsVisibleInViewport - ✔ elementIsVisibleInViewport is a Function - ✔ Tested on 09/02/2018 by @chalarangelo + √ elementIsVisibleInViewport is a Function + √ Tested on 09/02/2018 by @chalarangelo Testing elo - ✔ elo is a Function - ✔ Standard 1v1s - ✔ should be equivalent - ✔ 4 player FFA, all same rank + √ elo is a Function + √ Standard 1v1s + √ should be equivalent + √ 4 player FFA, all same rank Testing equals - ✔ equals is a Function - ✔ { a: [2, {e: 3}], b: [4], c: 'foo' } is equal to { a: [2, {e: 3}], b: [4], c: 'foo' } - ✔ [1,2,3] is equal to [1,2,3] - ✔ { a: [2, 3], b: [4] } is not equal to { a: [2, 3], b: [6] } - ✔ [1,2,3] is not equal to [1,2,4] - ✔ [1, 2, 3] should be equal to { 0: 1, 1: 2, 2: 3 }) - type is different, but their enumerable properties match. + √ equals is a Function + √ { a: [2, {e: 3}], b: [4], c: 'foo' } is equal to { a: [2, {e: 3}], b: [4], c: 'foo' } + √ [1,2,3] is equal to [1,2,3] + √ { a: [2, 3], b: [4] } is not equal to { a: [2, 3], b: [6] } + √ [1,2,3] is not equal to [1,2,4] + √ [1, 2, 3] should be equal to { 0: 1, 1: 2, 2: 3 }) - type is different, but their enumerable properties match. Testing escapeHTML - ✔ escapeHTML is a Function - ✔ Escapes a string for use in HTML + √ escapeHTML is a Function + √ Escapes a string for use in HTML Testing escapeRegExp - ✔ escapeRegExp is a Function - ✔ Escapes a string to use in a regular expression + √ escapeRegExp is a Function + √ Escapes a string to use in a regular expression Testing everyNth - ✔ everyNth is a Function - ✔ Returns every nth element in an array + √ everyNth is a Function + √ Returns every nth element in an array Testing extendHex - ✔ extendHex is a Function - ✔ Extends a 3-digit color code to a 6-digit color code - ✔ Extends a 3-digit color code to a 6-digit color code + √ extendHex is a Function + √ Extends a 3-digit color code to a 6-digit color code + √ Extends a 3-digit color code to a 6-digit color code Testing factorial - ✔ factorial is a Function - ✔ Calculates the factorial of 720 - ✔ Calculates the factorial of 0 - ✔ Calculates the factorial of 1 - ✔ Calculates the factorial of 4 - ✔ Calculates the factorial of 10 + √ factorial is a Function + √ Calculates the factorial of 720 + √ Calculates the factorial of 0 + √ Calculates the factorial of 1 + √ Calculates the factorial of 4 + √ Calculates the factorial of 10 Testing factors - ✔ factors is a Function + √ factors is a Function Testing fibonacci - ✔ fibonacci is a Function - ✔ Generates an array, containing the Fibonacci sequence + √ fibonacci is a Function + √ Generates an array, containing the Fibonacci sequence Testing fibonacciCountUntilNum - ✔ fibonacciCountUntilNum is a Function + √ fibonacciCountUntilNum is a Function Testing fibonacciUntilNum - ✔ fibonacciUntilNum is a Function + √ fibonacciUntilNum is a Function Testing filterNonUnique - ✔ filterNonUnique is a Function - ✔ Filters out the non-unique values in an array + √ filterNonUnique is a Function + √ Filters out the non-unique values in an array Testing findKey - ✔ findKey is a Function - ✔ Returns the appropriate key + √ findKey is a Function + √ Returns the appropriate key Testing findLast - ✔ findLast is a Function - ✔ Finds last element for which the given function returns true + √ findLast is a Function + √ Finds last element for which the given function returns true Testing findLastIndex - ✔ findLastIndex is a Function - ✔ Finds last index for which the given function returns true + √ findLastIndex is a Function + √ Finds last index for which the given function returns true Testing findLastKey - ✔ findLastKey is a Function - ✔ Returns the appropriate key + √ findLastKey is a Function + √ Returns the appropriate key Testing flatten - ✔ flatten is a Function - ✔ Flattens an array - ✔ Flattens an array + √ flatten is a Function + √ Flattens an array + √ Flattens an array Testing flattenObject - ✔ flattenObject is a Function - ✔ Flattens an object with the paths for keys - ✔ Works with arrays + √ flattenObject is a Function + √ Flattens an object with the paths for keys + √ Works with arrays Testing flip - ✔ flip is a Function - ✔ Flips argument order + √ flip is a Function + √ Flips argument order Testing forEachRight - ✔ forEachRight is a Function - ✔ Iterates over the array in reverse - - Testing forOwn - - ✔ forOwn is a Function - ✔ Iterates over an element's key-value pairs - - Testing forOwnRight - - ✔ forOwnRight is a Function - ✔ Iterates over an element's key-value pairs in reverse + √ forEachRight is a Function + √ Iterates over the array in reverse Testing formatDuration - ✔ formatDuration is a Function - ✔ Returns the human readable format of the given number of milliseconds - ✔ Returns the human readable format of the given number of milliseconds + √ formatDuration is a Function + √ Returns the human readable format of the given number of milliseconds + √ Returns the human readable format of the given number of milliseconds + + Testing forOwn + + √ forOwn is a Function + √ Iterates over an element's key-value pairs + + Testing forOwnRight + + √ forOwnRight is a Function + √ Iterates over an element's key-value pairs in reverse Testing fromCamelCase - ✔ fromCamelCase is a Function - ✔ Converts a string from camelcase - ✔ Converts a string from camelcase - ✔ Converts a string from camelcase + √ fromCamelCase is a Function + √ Converts a string from camelcase + √ Converts a string from camelcase + √ Converts a string from camelcase Testing functionName - ✔ functionName is a Function - ✔ Works for native functions - ✔ Works for functions - ✔ Works for arrow functions + √ functionName is a Function + √ Works for native functions + √ Works for functions + √ Works for arrow functions Testing functions - ✔ functions is a Function - ✔ Returns own methods - ✔ Returns own and inherited methods + √ functions is a Function + √ Returns own methods + √ Returns own and inherited methods Testing gcd - ✔ gcd is a Function - ✔ Calculates the greatest common divisor between two or more numbers/arrays - ✔ Calculates the greatest common divisor between two or more numbers/arrays + √ gcd is a Function + √ Calculates the greatest common divisor between two or more numbers/arrays + √ Calculates the greatest common divisor between two or more numbers/arrays Testing geometricProgression - ✔ geometricProgression is a Function - ✔ Initializes an array containing the numbers in the specified range - ✔ Initializes an array containing the numbers in the specified range - ✔ Initializes an array containing the numbers in the specified range + √ geometricProgression is a Function + √ Initializes an array containing the numbers in the specified range + √ Initializes an array containing the numbers in the specified range + √ Initializes an array containing the numbers in the specified range Testing get - ✔ get is a Function - ✔ Retrieve a property indicated by the selector from an object. + √ get is a Function + √ Retrieve a property indicated by the selector from an object. Testing getColonTimeFromDate - ✔ getColonTimeFromDate is a Function + √ getColonTimeFromDate is a Function Testing getDaysDiffBetweenDates - ✔ getDaysDiffBetweenDates is a Function - ✔ Returns the difference in days between two dates + √ getDaysDiffBetweenDates is a Function + √ Returns the difference in days between two dates Testing getMeridiemSuffixOfInteger - ✔ getMeridiemSuffixOfInteger is a Function + √ getMeridiemSuffixOfInteger is a Function Testing getScrollPosition - ✔ getScrollPosition is a Function + √ getScrollPosition is a Function Testing getStyle - ✔ getStyle is a Function + √ getStyle is a Function Testing getType - ✔ getType is a Function - ✔ Returns the native type of a value + √ getType is a Function + √ Returns the native type of a value Testing getURLParameters - ✔ getURLParameters is a Function - ✔ Returns an object containing the parameters of the current URL + √ getURLParameters is a Function + √ Returns an object containing the parameters of the current URL Testing groupBy - ✔ groupBy is a Function - ✔ Groups the elements of an array based on the given function - ✔ Groups the elements of an array based on the given function + √ groupBy is a Function + √ Groups the elements of an array based on the given function + √ Groups the elements of an array based on the given function Testing hammingDistance - ✔ hammingDistance is a Function - ✔ retuns hamming disance between 2 values + √ hammingDistance is a Function + √ retuns hamming disance between 2 values Testing hasClass - ✔ hasClass is a Function + √ hasClass is a Function Testing hasFlags - ✔ hasFlags is a Function + √ hasFlags is a Function Testing hashBrowser - ✔ hashBrowser is a Function + √ hashBrowser is a Function Testing hashNode - ✔ hashNode is a Function + √ hashNode is a Function Testing head - ✔ head is a Function - ✔ head({ a: 1234}) returns undefined - ✔ head([1, 2, 3]) returns 1 - ✔ head({ 0: false}) returns false - ✔ head(String) returns S - ✔ head(null) throws an Error - ✔ head(undefined) throws an Error - ✔ head() throws an Error - ✔ head([1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 1122, 32124, 23232]) takes less than 2s to run + √ head is a Function + √ head({ a: 1234}) returns undefined + √ head([1, 2, 3]) returns 1 + √ head({ 0: false}) returns false + √ head(String) returns S + √ head(null) throws an Error + √ head(undefined) throws an Error + √ head() throws an Error + √ head([1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 1122, 32124, 23232]) takes less than 2s to run Testing hexToRGB - ✔ hexToRGB is a Function - ✔ Converts a color code to a rgb() or rgba() string - ✔ Converts a color code to a rgb() or rgba() string - ✔ Converts a color code to a rgb() or rgba() string + √ hexToRGB is a Function + √ Converts a color code to a rgb() or rgba() string + √ Converts a color code to a rgb() or rgba() string + √ Converts a color code to a rgb() or rgba() string Testing hide - ✔ hide is a Function + √ hide is a Function Testing howManyTimes - ✔ howManyTimes is a Function + √ howManyTimes is a Function Testing httpDelete - ✔ httpDelete is a Function + √ httpDelete is a Function Testing httpGet - ✔ httpGet is a Function + √ httpGet is a Function Testing httpPost - ✔ httpPost is a Function + √ httpPost is a Function Testing httpPut - ✔ httpPut is a Function + √ httpPut is a Function Testing httpsRedirect - ✔ httpsRedirect is a Function - ✔ Tested on 09/02/2018 by @chalarangelo - - Testing inRange - - ✔ inRange is a Function - ✔ The given number falls within the given range - ✔ The given number falls within the given range - ✔ The given number does not falls within the given range - ✔ The given number does not falls within the given range + √ httpsRedirect is a Function + √ Tested on 09/02/2018 by @chalarangelo Testing indexOfAll - ✔ indexOfAll is a Function - ✔ Returns all indices of val in an array - ✔ Returns all indices of val in an array + √ indexOfAll is a Function + √ Returns all indices of val in an array + √ Returns all indices of val in an array Testing initial - ✔ initial is a Function - ✔ Returns all the elements of an array except the last one + √ initial is a Function + √ Returns all the elements of an array except the last one Testing initialize2DArray - ✔ initialize2DArray is a Function - ✔ Initializes a 2D array of given width and height and value + √ initialize2DArray is a Function + √ Initializes a 2D array of given width and height and value Testing initializeArrayWithRange - ✔ initializeArrayWithRange is a Function - ✔ Initializes an array containing the numbers in the specified range + √ initializeArrayWithRange is a Function + √ Initializes an array containing the numbers in the specified range Testing initializeArrayWithRangeRight - ✔ initializeArrayWithRangeRight is a Function + √ initializeArrayWithRangeRight is a Function Testing initializeArrayWithValues - ✔ initializeArrayWithValues is a Function - ✔ Initializes and fills an array with the specified values + √ initializeArrayWithValues is a Function + √ Initializes and fills an array with the specified values + + Testing inRange + + √ inRange is a Function + √ The given number falls within the given range + √ The given number falls within the given range + √ The given number does not falls within the given range + √ The given number does not falls within the given range Testing intersection - ✔ intersection is a Function - ✔ Returns a list of elements that exist in both arrays + √ intersection is a Function + √ Returns a list of elements that exist in both arrays Testing intersectionBy - ✔ intersectionBy is a Function - ✔ Returns a list of elements that exist in both arrays, after applying the provided function to each array element of both + √ intersectionBy is a Function + √ Returns a list of elements that exist in both arrays, after applying the provided function to each array element of both Testing intersectionWith - ✔ intersectionWith is a Function - ✔ Returns a list of elements that exist in both arrays, using a provided comparator function + √ intersectionWith is a Function + √ Returns a list of elements that exist in both arrays, using a provided comparator function Testing invertKeyValues - ✔ invertKeyValues is a Function - ✔ invertKeyValues({ a: 1, b: 2, c: 1 }) returns { 1: [ 'a', 'c' ], 2: [ 'b' ] } - ✔ invertKeyValues({ a: 1, b: 2, c: 1 }, value => 'group' + value) returns { group1: [ 'a', 'c' ], group2: [ 'b' ] } + √ invertKeyValues is a Function + √ invertKeyValues({ a: 1, b: 2, c: 1 }) returns { 1: [ 'a', 'c' ], 2: [ 'b' ] } + √ invertKeyValues({ a: 1, b: 2, c: 1 }, value => 'group' + value) returns { group1: [ 'a', 'c' ], group2: [ 'b' ] } Testing is - ✔ is is a Function - ✔ Works for arrays with data - ✔ Works for empty arrays - ✔ Works for arrays, not objects - ✔ Works for objects - ✔ Works for maps - ✔ Works for regular expressions - ✔ Works for sets - ✔ Works for weak maps - ✔ Works for weak sets - ✔ Works for strings - returns false for primitive - ✔ Works for strings - returns true when using constructor - ✔ Works for numbers - returns false for primitive - ✔ Works for numbers - returns true when using constructor - ✔ Works for booleans - returns false for primitive - ✔ Works for booleans - returns true when using constructor - ✔ Works for functions + √ is is a Function + √ Works for arrays with data + √ Works for empty arrays + √ Works for arrays, not objects + √ Works for objects + √ Works for maps + √ Works for regular expressions + √ Works for sets + √ Works for weak maps + √ Works for weak sets + √ Works for strings - returns false for primitive + √ Works for strings - returns true when using constructor + √ Works for numbers - returns false for primitive + √ Works for numbers - returns true when using constructor + √ Works for booleans - returns false for primitive + √ Works for booleans - returns true when using constructor + √ Works for functions Testing isAbsoluteURL - ✔ isAbsoluteURL is a Function - ✔ Given string is an absolute URL - ✔ Given string is an absolute URL - ✔ Given string is not an absolute URL + √ isAbsoluteURL is a Function + √ Given string is an absolute URL + √ Given string is an absolute URL + √ Given string is not an absolute URL + + Testing isAnagram + + √ isAnagram is a Function + √ Checks valid anagram + √ Works with spaces + √ Ignores case + √ Ignores special characters Testing isArmstrongNumber - ✔ isArmstrongNumber is a Function + √ isArmstrongNumber is a Function Testing isArray - ✔ isArray is a Function - ✔ passed value is an array - ✔ passed value is not an array + √ isArray is a Function + √ passed value is an array + √ passed value is not an array Testing isArrayBuffer - ✔ isArrayBuffer is a Function + √ isArrayBuffer is a Function Testing isArrayLike - ✔ isArrayLike is a Function - ✔ Returns true for a string - ✔ Returns true for an array - ✔ Returns false for null + √ isArrayLike is a Function + √ Returns true for a string + √ Returns true for an array + √ Returns false for null Testing isBoolean - ✔ isBoolean is a Function - ✔ passed value is not a boolean - ✔ passed value is not a boolean + √ isBoolean is a Function + √ passed value is not a boolean + √ passed value is not a boolean Testing isDivisible - ✔ isDivisible is a Function - ✔ The number 6 is divisible by 3 + √ isDivisible is a Function + √ The number 6 is divisible by 3 Testing isEmpty - ✔ isEmpty is a Function - ✔ Returns true for empty Map - ✔ Returns true for empty Set - ✔ Returns true for empty array - ✔ Returns true for empty object - ✔ Returns true for empty string - ✔ Returns false for non-empty array - ✔ Returns false for non-empty object - ✔ Returns false for non-empty string - ✔ Returns true - type is not considered a collection - ✔ Returns true - type is not considered a collection + √ isEmpty is a Function + √ Returns true for empty Map + √ Returns true for empty Set + √ Returns true for empty array + √ Returns true for empty object + √ Returns true for empty string + √ Returns false for non-empty array + √ Returns false for non-empty object + √ Returns false for non-empty string + √ Returns true - type is not considered a collection + √ Returns true - type is not considered a collection Testing isEven - ✔ isEven is a Function - ✔ 4 is even number - ✔ undefined + √ isEven is a Function + √ 4 is even number + √ undefined Testing isFunction - ✔ isFunction is a Function - ✔ passed value is a function - ✔ passed value is not a function + √ isFunction is a Function + √ passed value is a function + √ passed value is not a function Testing isLowerCase - ✔ isLowerCase is a Function - ✔ passed string is a lowercase - ✔ passed string is a lowercase - ✔ passed value is not a lowercase + √ isLowerCase is a Function + √ passed string is a lowercase + √ passed string is a lowercase + √ passed value is not a lowercase Testing isMap - ✔ isMap is a Function + √ isMap is a Function Testing isNil - ✔ isNil is a Function - ✔ Returns true for null - ✔ Returns true for undefined - ✔ Returns false for an empty string + √ isNil is a Function + √ Returns true for null + √ Returns true for undefined + √ Returns false for an empty string Testing isNull - ✔ isNull is a Function - ✔ passed argument is a null - ✔ passed argument is a null + √ isNull is a Function + √ passed argument is a null + √ passed argument is a null Testing isNumber - ✔ isNumber is a Function - ✔ passed argument is a number - ✔ passed argument is not a number + √ isNumber is a Function + √ passed argument is a number + √ passed argument is not a number Testing isObject - ✔ isObject is a Function - ✔ isObject([1, 2, 3, 4]) is a object - ✔ isObject([]) is a object - ✔ isObject({ a:1 }) is a object - ✔ isObject(true) is not a object + √ isObject is a Function + √ isObject([1, 2, 3, 4]) is a object + √ isObject([]) is a object + √ isObject({ a:1 }) is a object + √ isObject(true) is not a object Testing isObjectLike - ✔ isObjectLike is a Function - ✔ Returns true for an object - ✔ Returns true for an array - ✔ Returns false for a function - ✔ Returns false for null + √ isObjectLike is a Function + √ Returns true for an object + √ Returns true for an array + √ Returns false for a function + √ Returns false for null Testing isPlainObject - ✔ isPlainObject is a Function - ✔ Returns true for a plain object - ✔ Returns false for a Map (example of non-plain object) + √ isPlainObject is a Function + √ Returns true for a plain object + √ Returns false for a Map (example of non-plain object) Testing isPrime - ✔ isPrime is a Function - ✔ passed number is a prime + √ isPrime is a Function + √ passed number is a prime Testing isPrimitive - ✔ isPrimitive is a Function - ✔ isPrimitive(null) is primitive - ✔ isPrimitive(undefined) is primitive - ✔ isPrimitive(string) is primitive - ✔ isPrimitive(true) is primitive - ✔ isPrimitive(50) is primitive - ✔ isPrimitive('Hello') is primitive - ✔ isPrimitive(false) is primitive - ✔ isPrimitive(Symbol()) is primitive - ✔ isPrimitive([1, 2, 3]) is not primitive - ✔ isPrimitive({ a: 123 }) is not primitive - ✔ isPrimitive({ a: 123 }) takes less than 2s to run + √ isPrimitive is a Function + √ isPrimitive(null) is primitive + √ isPrimitive(undefined) is primitive + √ isPrimitive(string) is primitive + √ isPrimitive(true) is primitive + √ isPrimitive(50) is primitive + √ isPrimitive('Hello') is primitive + √ isPrimitive(false) is primitive + √ isPrimitive(Symbol()) is primitive + √ isPrimitive([1, 2, 3]) is not primitive + √ isPrimitive({ a: 123 }) is not primitive + √ isPrimitive({ a: 123 }) takes less than 2s to run Testing isPromiseLike - ✔ isPromiseLike is a Function - ✔ Returns true for a promise-like object - ✔ Returns false for null - ✔ Returns false for an empty object + √ isPromiseLike is a Function + √ Returns true for a promise-like object + √ Returns false for null + √ Returns false for an empty object Testing isRegExp - ✔ isRegExp is a Function + √ isRegExp is a Function Testing isSet - ✔ isSet is a Function + √ isSet is a Function Testing isSorted - ✔ isSorted is a Function - ✔ Array is sorted in ascending order - ✔ Array is sorted in descending order - ✔ Array is not sorted, direction changed in array + √ isSorted is a Function + √ Array is sorted in ascending order + √ Array is sorted in descending order + √ Array is not sorted, direction changed in array Testing isString - ✔ isString is a Function - ✔ foo is a string - ✔ "10" is a string - ✔ Empty string is a string - ✔ 10 is not a string - ✔ true is not string + √ isString is a Function + √ foo is a string + √ "10" is a string + √ Empty string is a string + √ 10 is not a string + √ true is not string Testing isSymbol - ✔ isSymbol is a Function - ✔ Checks if the given argument is a symbol + √ isSymbol is a Function + √ Checks if the given argument is a symbol Testing isTravisCI - ✔ isTravisCI is a Function - ✔ Running on Travis, correctly evaluates + √ isTravisCI is a Function + √ Not running on Travis, correctly evaluates Testing isTypedArray - ✔ isTypedArray is a Function + √ isTypedArray is a Function Testing isUndefined - ✔ isUndefined is a Function - ✔ Returns true for undefined + √ isUndefined is a Function + √ Returns true for undefined Testing isUpperCase - ✔ isUpperCase is a Function - ✔ ABC is all upper case - ✔ abc is not all upper case - ✔ A3@$ is all uppercase + √ isUpperCase is a Function + √ ABC is all upper case + √ abc is not all upper case + √ A3@$ is all uppercase Testing isValidJSON - ✔ isValidJSON is a Function - ✔ {"name":"Adam","age":20} is a valid JSON - ✔ {"name":"Adam",age:"20"} is not a valid JSON - ✔ null is a valid JSON + √ isValidJSON is a Function + √ {"name":"Adam","age":20} is a valid JSON + √ {"name":"Adam",age:"20"} is not a valid JSON + √ null is a valid JSON Testing isWeakMap - ✔ isWeakMap is a Function + √ isWeakMap is a Function Testing isWeakSet - ✔ isWeakSet is a Function + √ isWeakSet is a Function Testing join - ✔ join is a Function - ✔ Joins all elements of an array into a string and returns this string - ✔ Joins all elements of an array into a string and returns this string - ✔ Joins all elements of an array into a string and returns this string + √ join is a Function + √ Joins all elements of an array into a string and returns this string + √ Joins all elements of an array into a string and returns this string + √ Joins all elements of an array into a string and returns this string + + Testing JSONToDate + + √ JSONToDate is a Function + + Testing JSONToFile + + √ JSONToFile is a Function + √ Tested on 09/02/2018 by @chalarangelo Testing last - ✔ last is a Function - ✔ last({ a: 1234}) returns undefined - ✔ last([1, 2, 3]) returns 3 - ✔ last({ 0: false}) returns undefined - ✔ last(String) returns g - ✔ last(null) throws an Error - ✔ last(undefined) throws an Error - ✔ last() throws an Error - ✔ last([1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 1122, 32124, 23232]) takes less than 2s to run + √ last is a Function + √ last({ a: 1234}) returns undefined + √ last([1, 2, 3]) returns 3 + √ last({ 0: false}) returns undefined + √ last(String) returns g + √ last(null) throws an Error + √ last(undefined) throws an Error + √ last() throws an Error + √ last([1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 1122, 32124, 23232]) takes less than 2s to run Testing lcm - ✔ lcm is a Function - ✔ Returns the least common multiple of two or more numbers. - ✔ Returns the least common multiple of two or more numbers. + √ lcm is a Function + √ Returns the least common multiple of two or more numbers. + √ Returns the least common multiple of two or more numbers. Testing longestItem - ✔ longestItem is a Function - ✔ Returns the longest object + √ longestItem is a Function + √ Returns the longest object Testing lowercaseKeys - ✔ lowercaseKeys is a Function - ✔ Lowercases object keys - ✔ Does not mutate original object + √ lowercaseKeys is a Function + √ Lowercases object keys + √ Does not mutate original object Testing luhnCheck - ✔ luhnCheck is a Function - ✔ validates identification number - ✔ validates identification number - ✔ validates identification number + √ luhnCheck is a Function + √ validates identification number + √ validates identification number + √ validates identification number Testing mapKeys - ✔ mapKeys is a Function - ✔ Maps keys + √ mapKeys is a Function + √ Maps keys Testing mapObject - ✔ mapObject is a Function - ✔ mapObject([1, 2, 3], a => a * a) returns { 1: 1, 2: 4, 3: 9 } - ✔ mapObject([1, 2, 3, 4], (a, b) => b - a) returns { 1: -1, 2: -1, 3: -1, 4: -1 } - ✔ mapObject([1, 2, 3, 4], (a, b) => a - b) returns { 1: 1, 2: 1, 3: 1, 4: 1 } + √ mapObject is a Function + √ mapObject([1, 2, 3], a => a * a) returns { 1: 1, 2: 4, 3: 9 } + √ mapObject([1, 2, 3, 4], (a, b) => b - a) returns { 1: -1, 2: -1, 3: -1, 4: -1 } + √ mapObject([1, 2, 3, 4], (a, b) => a - b) returns { 1: 1, 2: 1, 3: 1, 4: 1 } Testing mapValues - ✔ mapValues is a Function - ✔ Maps values + √ mapValues is a Function + √ Maps values Testing mask - ✔ mask is a Function - ✔ Replaces all but the last num of characters with the specified mask character - ✔ Replaces all but the last num of characters with the specified mask character - ✔ Replaces all but the last num of characters with the specified mask character + √ mask is a Function + √ Replaces all but the last num of characters with the specified mask character + √ Replaces all but the last num of characters with the specified mask character + √ Replaces all but the last num of characters with the specified mask character Testing matches - ✔ matches is a Function - ✔ Matches returns true for two similar objects - ✔ Matches returns false for two non-similar objects + √ matches is a Function + √ Matches returns true for two similar objects + √ Matches returns false for two non-similar objects Testing matchesWith - ✔ matchesWith is a Function - ✔ Returns true for two objects with similar values, based on the provided function + √ matchesWith is a Function + √ Returns true for two objects with similar values, based on the provided function Testing maxBy - ✔ maxBy is a Function - ✔ Produces the right result with a function - ✔ Produces the right result with a property name + √ maxBy is a Function + √ Produces the right result with a function + √ Produces the right result with a property name Testing maxN - ✔ maxN is a Function - ✔ Returns the n maximum elements from the provided array - ✔ Returns the n maximum elements from the provided array + √ maxN is a Function + √ Returns the n maximum elements from the provided array + √ Returns the n maximum elements from the provided array Testing median - ✔ median is a Function - ✔ Returns the median of an array of numbers - ✔ Returns the median of an array of numbers + √ median is a Function + √ Returns the median of an array of numbers + √ Returns the median of an array of numbers Testing memoize - ✔ memoize is a Function - ✔ Function works properly - ✔ Function works properly - ✔ Cache stores values + √ memoize is a Function + √ Function works properly + √ Function works properly + √ Cache stores values Testing merge - ✔ merge is a Function - ✔ Merges two objects + √ merge is a Function + √ Merges two objects Testing minBy - ✔ minBy is a Function - ✔ Produces the right result with a function - ✔ Produces the right result with a property name + √ minBy is a Function + √ Produces the right result with a function + √ Produces the right result with a property name Testing minN - ✔ minN is a Function - ✔ Returns the n minimum elements from the provided array - ✔ Returns the n minimum elements from the provided array + √ minN is a Function + √ Returns the n minimum elements from the provided array + √ Returns the n minimum elements from the provided array Testing negate - ✔ negate is a Function - ✔ Negates a predicate function + √ negate is a Function + √ Negates a predicate function Testing nthArg - ✔ nthArg is a Function - ✔ Returns the nth argument - ✔ Returns undefined if arguments too few - ✔ Works for negative values + √ nthArg is a Function + √ Returns the nth argument + √ Returns undefined if arguments too few + √ Works for negative values Testing nthElement - ✔ nthElement is a Function - ✔ Returns the nth element of an array. - ✔ Returns the nth element of an array. + √ nthElement is a Function + √ Returns the nth element of an array. + √ Returns the nth element of an array. Testing objectFromPairs - ✔ objectFromPairs is a Function - ✔ Creates an object from the given key-value pairs. + √ objectFromPairs is a Function + √ Creates an object from the given key-value pairs. Testing objectToPairs - ✔ objectToPairs is a Function - ✔ Creates an array of key-value pair arrays from an object. + √ objectToPairs is a Function + √ Creates an array of key-value pair arrays from an object. Testing observeMutations - ✔ observeMutations is a Function - ✔ Tested on 09/02/2018 by @chalarangelo + √ observeMutations is a Function + √ Tested on 09/02/2018 by @chalarangelo Testing off - ✔ off is a Function + √ off is a Function Testing omit - ✔ omit is a Function - ✔ Omits the key-value pairs corresponding to the given keys from an object + √ omit is a Function + √ Omits the key-value pairs corresponding to the given keys from an object Testing omitBy - ✔ omitBy is a Function - ✔ Creates an object composed of the properties the given function returns falsey for + √ omitBy is a Function + √ Creates an object composed of the properties the given function returns falsey for Testing on - ✔ on is a Function - - Testing onUserInputChange - - ✔ onUserInputChange is a Function + √ on is a Function Testing once - ✔ once is a Function + √ once is a Function + + Testing onUserInputChange + + √ onUserInputChange is a Function Testing orderBy - ✔ orderBy is a Function - ✔ Returns a sorted array of objects ordered by properties and orders. - ✔ Returns a sorted array of objects ordered by properties and orders. + √ orderBy is a Function + √ Returns a sorted array of objects ordered by properties and orders. + √ Returns a sorted array of objects ordered by properties and orders. Testing over - ✔ over is a Function - ✔ Applies given functions over multiple arguments + √ over is a Function + √ Applies given functions over multiple arguments Testing overArgs - ✔ overArgs is a Function - ✔ Invokes the provided function with its arguments transformed + √ overArgs is a Function + √ Invokes the provided function with its arguments transformed Testing palindrome - ✔ palindrome is a Function - ✔ Given string is a palindrome - ✔ Given string is not a palindrome + √ palindrome is a Function + √ Given string is a palindrome + √ Given string is not a palindrome Testing parseCookie - ✔ parseCookie is a Function - ✔ Parses the cookie + √ parseCookie is a Function + √ Parses the cookie Testing partial - ✔ partial is a Function - ✔ Prepends arguments + √ partial is a Function + √ Prepends arguments Testing partialRight - ✔ partialRight is a Function - ✔ Appends arguments + √ partialRight is a Function + √ Appends arguments Testing partition - ✔ partition is a Function - ✔ Groups the elements into two arrays, depending on the provided function's truthiness for each element. + √ partition is a Function + √ Groups the elements into two arrays, depending on the provided function's truthiness for each element. Testing percentile - ✔ percentile is a Function - ✔ Uses the percentile formula to calculate how many numbers in the given array are less or equal to the given value. + √ percentile is a Function + √ Uses the percentile formula to calculate how many numbers in the given array are less or equal to the given value. + + Testing permutations + + √ permutations is a Function + √ Generates all permutations of an array Testing pick - ✔ pick is a Function - ✔ Picks the key-value pairs corresponding to the given keys from an object. + √ pick is a Function + √ Picks the key-value pairs corresponding to the given keys from an object. Testing pickBy - ✔ pickBy is a Function - ✔ Creates an object composed of the properties the given function returns truthy for. + √ pickBy is a Function + √ Creates an object composed of the properties the given function returns truthy for. Testing pipeAsyncFunctions - ✔ pipeAsyncFunctions is a Function - ✔ Produces the appropriate hash - ✔ pipeAsyncFunctions result should be 15 + √ pipeAsyncFunctions is a Function + √ Produces the appropriate hash + √ pipeAsyncFunctions result should be 15 Testing pipeFunctions - ✔ pipeFunctions is a Function - ✔ Performs left-to-right function composition + √ pipeFunctions is a Function + √ Performs left-to-right function composition Testing pluralize - ✔ pluralize is a Function - ✔ Produces the plural of the word - ✔ Produces the singular of the word - ✔ Produces the plural of the word - ✔ Prodices the defined plural of the word - ✔ Works with a dictionary + √ pluralize is a Function + √ Produces the plural of the word + √ Produces the singular of the word + √ Produces the plural of the word + √ Prodices the defined plural of the word + √ Works with a dictionary Testing powerset - ✔ powerset is a Function - ✔ Returns the powerset of a given array of numbers. + √ powerset is a Function + √ Returns the powerset of a given array of numbers. Testing prettyBytes - ✔ prettyBytes is a Function - ✔ Converts a number in bytes to a human-readable string. - ✔ Converts a number in bytes to a human-readable string. - ✔ Converts a number in bytes to a human-readable string. + √ prettyBytes is a Function + √ Converts a number in bytes to a human-readable string. + √ Converts a number in bytes to a human-readable string. + √ Converts a number in bytes to a human-readable string. Testing primes - ✔ primes is a Function - ✔ Generates primes up to a given number, using the Sieve of Eratosthenes. + √ primes is a Function + √ Generates primes up to a given number, using the Sieve of Eratosthenes. Testing promisify - ✔ promisify is a Function - ✔ Returns a promise + √ promisify is a Function + √ Returns a promise Testing pull - ✔ pull is a Function - ✔ Pulls the specified values + √ pull is a Function + √ Pulls the specified values Testing pullAtIndex - ✔ pullAtIndex is a Function - ✔ Pulls the given values - ✔ Pulls the given values + √ pullAtIndex is a Function + √ Pulls the given values + √ Pulls the given values Testing pullAtValue - ✔ pullAtValue is a Function - ✔ Pulls the specified values - ✔ Pulls the specified values + √ pullAtValue is a Function + √ Pulls the specified values + √ Pulls the specified values Testing pullBy - ✔ pullBy is a Function - ✔ Pulls the specified values + √ pullBy is a Function + √ Pulls the specified values Testing quickSort - ✔ quickSort is a Function - ✔ quickSort([5, 6, 4, 3, 1, 2]) returns [1, 2, 3, 4, 5, 6] - ✔ quickSort([-1, 0, -2]) returns [-2, -1, 0] - ✔ quickSort() throws an error - ✔ quickSort(123) throws an error - ✔ quickSort({ 234: string}) throws an error - ✔ quickSort(null) throws an error - ✔ quickSort(undefined) throws an error - ✔ quickSort([11, 1, 324, 23232, -1, 53, 2, 524, 32, 13, 156, 133, 62, 12, 4]) takes less than 2s to run + √ quickSort is a Function + √ quickSort([5, 6, 4, 3, 1, 2]) returns [1, 2, 3, 4, 5, 6] + √ quickSort([-1, 0, -2]) returns [-2, -1, 0] + √ quickSort() throws an error + √ quickSort(123) throws an error + √ quickSort({ 234: string}) throws an error + √ quickSort(null) throws an error + √ quickSort(undefined) throws an error + √ quickSort([11, 1, 324, 23232, -1, 53, 2, 524, 32, 13, 156, 133, 62, 12, 4]) takes less than 2s to run Testing randomHexColorCode - ✔ randomHexColorCode is a Function - ✔ should be equal + √ randomHexColorCode is a Function + √ should be equal Testing randomIntArrayInRange - ✔ randomIntArrayInRange is a Function - ✔ The returned array contains only integers - ✔ The returned array has the proper length - ✔ The returned array's values lie between provided lowerLimit and upperLimit (both inclusive). + √ randomIntArrayInRange is a Function + √ The returned array contains only integers + √ The returned array has the proper length + √ The returned array's values lie between provided lowerLimit and upperLimit (both inclusive). Testing randomIntegerInRange - ✔ randomIntegerInRange is a Function - ✔ The returned value is an integer - ✔ The returned value lies between provided lowerLimit and upperLimit (both inclusive). + √ randomIntegerInRange is a Function + √ The returned value is an integer + √ The returned value lies between provided lowerLimit and upperLimit (both inclusive). Testing randomNumberInRange - ✔ randomNumberInRange is a Function - ✔ The returned value is a number - ✔ The returned value lies between provided lowerLimit and upperLimit (both inclusive). + √ randomNumberInRange is a Function + √ The returned value is a number + √ The returned value lies between provided lowerLimit and upperLimit (both inclusive). Testing readFileLines - ✔ readFileLines is a Function - ✔ Tested on 09/02/2018 by @chalarangelo + √ readFileLines is a Function + √ Tested on 09/02/2018 by @chalarangelo Testing rearg - ✔ rearg is a Function - ✔ Reorders arguments in invoked function + √ rearg is a Function + √ Reorders arguments in invoked function Testing redirect - ✔ redirect is a Function - ✔ Tested on 09/02/2018 by @chalarangelo - - Testing reduceSuccessive - - ✔ reduceSuccessive is a Function - ✔ Returns the array of successively reduced values - - Testing reduceWhich - - ✔ reduceWhich is a Function - ✔ Returns the minimum of an array - ✔ Returns the maximum of an array - ✔ Returns the object with the minimum specified value in an array + √ redirect is a Function + √ Tested on 09/02/2018 by @chalarangelo Testing reducedFilter - ✔ reducedFilter is a Function - ✔ Filter an array of objects based on a condition while also filtering out unspecified keys. + √ reducedFilter is a Function + √ Filter an array of objects based on a condition while also filtering out unspecified keys. + + Testing reduceSuccessive + + √ reduceSuccessive is a Function + √ Returns the array of successively reduced values + + Testing reduceWhich + + √ reduceWhich is a Function + √ Returns the minimum of an array + √ Returns the maximum of an array + √ Returns the object with the minimum specified value in an array Testing remove - ✔ remove is a Function - ✔ Removes elements from an array for which the given function returns false + √ remove is a Function + √ Removes elements from an array for which the given function returns false Testing removeNonASCII - ✔ removeNonASCII is a Function - ✔ Removes non-ASCII characters + √ removeNonASCII is a Function + √ Removes non-ASCII characters Testing removeVowels - ✔ removeVowels is a Function + √ removeVowels is a Function Testing reverseString - ✔ reverseString is a Function - ✔ Reverses a string. + √ reverseString is a Function + √ Reverses a string. + + Testing RGBToHex + + √ RGBToHex is a Function + √ Converts the values of RGB components to a color code. Testing round - ✔ round is a Function - ✔ round(1.005, 2) returns 1.01 - ✔ round(123.3423345345345345344, 11) returns 123.34233453453 - ✔ round(3.342, 11) returns 3.342 - ✔ round(1.005) returns 1 - ✔ round([1.005, 2]) returns NaN - ✔ round(string) returns NaN - ✔ round() returns NaN - ✔ round(132, 413, 4134) returns NaN - ✔ round({a: 132}, 413) returns NaN - ✔ round(123.3423345345345345344, 11) takes less than 2s to run + √ round is a Function + √ round(1.005, 2) returns 1.01 + √ round(123.3423345345345345344, 11) returns 123.34233453453 + √ round(3.342, 11) returns 3.342 + √ round(1.005) returns 1 + √ round([1.005, 2]) returns NaN + √ round(string) returns NaN + √ round() returns NaN + √ round(132, 413, 4134) returns NaN + √ round({a: 132}, 413) returns NaN + √ round(123.3423345345345345344, 11) takes less than 2s to run Testing runAsync - ✔ runAsync is a Function - ✔ Tested on 09/02/2018 by @chalarangelo + √ runAsync is a Function + √ Tested on 09/02/2018 by @chalarangelo Testing runPromisesInSeries - ✔ runPromisesInSeries is a Function + √ runPromisesInSeries is a Function Testing sample - ✔ sample is a Function - ✔ Returns a random element from the array - ✔ Works for single-element arrays - ✔ Returns undefined for empty array + √ sample is a Function + √ Returns a random element from the array + √ Works for single-element arrays + √ Returns undefined for empty array Testing sampleSize - ✔ sampleSize is a Function - ✔ Returns a single element without n specified - ✔ Returns a random sample of specified size from an array - ✔ Returns all elements in an array if n >= length - ✔ Returns an empty array if original array is empty - ✔ Returns an empty array if n = 0 + √ sampleSize is a Function + √ Returns a single element without n specified + √ Returns a random sample of specified size from an array + √ Returns all elements in an array if n >= length + √ Returns an empty array if original array is empty + √ Returns an empty array if n = 0 Testing scrollToTop - ✔ scrollToTop is a Function - ✔ Tested on 09/02/2018 by @chalarangelo + √ scrollToTop is a Function + √ Tested on 09/02/2018 by @chalarangelo Testing sdbm - ✔ sdbm is a Function - ✔ Hashes the input string into a whole number. + √ sdbm is a Function + √ Hashes the input string into a whole number. Testing serializeCookie - ✔ serializeCookie is a Function - ✔ Serializes the cookie + √ serializeCookie is a Function + √ Serializes the cookie Testing setStyle - ✔ setStyle is a Function + √ setStyle is a Function Testing shallowClone - ✔ shallowClone is a Function - ✔ Shallow cloning works - ✔ Does not clone deeply + √ shallowClone is a Function + √ Shallow cloning works + √ Does not clone deeply Testing show - ✔ show is a Function + √ show is a Function Testing shuffle - ✔ shuffle is a Function - ✔ Shuffles the array - ✔ New array contains all original elements - ✔ Works for empty arrays - ✔ Works for single-element arrays + √ shuffle is a Function + √ Shuffles the array + √ New array contains all original elements + √ Works for empty arrays + √ Works for single-element arrays Testing similarity - ✔ similarity is a Function - ✔ Returns an array of elements that appear in both arrays. + √ similarity is a Function + √ Returns an array of elements that appear in both arrays. Testing size - ✔ size is a Function - ✔ Get size of arrays, objects or strings. - ✔ Get size of arrays, objects or strings. + √ size is a Function + √ Get size of arrays, objects or strings. + √ Get size of arrays, objects or strings. Testing sleep - ✔ sleep is a Function + √ sleep is a Function Testing solveRPN - ✔ solveRPN is a Function + √ solveRPN is a Function Testing sortCharactersInString - ✔ sortCharactersInString is a Function - ✔ Alphabetically sorts the characters in a string. + √ sortCharactersInString is a Function + √ Alphabetically sorts the characters in a string. Testing sortedIndex - ✔ sortedIndex is a Function - ✔ Returns the lowest index at which value should be inserted into array in order to maintain its sort order. - ✔ Returns the lowest index at which value should be inserted into array in order to maintain its sort order. + √ sortedIndex is a Function + √ Returns the lowest index at which value should be inserted into array in order to maintain its sort order. + √ Returns the lowest index at which value should be inserted into array in order to maintain its sort order. Testing sortedIndexBy - ✔ sortedIndexBy is a Function - ✔ Returns the lowest index to insert the element without messing up the list order + √ sortedIndexBy is a Function + √ Returns the lowest index to insert the element without messing up the list order Testing sortedLastIndex - ✔ sortedLastIndex is a Function - ✔ Returns the highest index to insert the element without messing up the list order + √ sortedLastIndex is a Function + √ Returns the highest index to insert the element without messing up the list order Testing sortedLastIndexBy - ✔ sortedLastIndexBy is a Function - ✔ Returns the highest index to insert the element without messing up the list order + √ sortedLastIndexBy is a Function + √ Returns the highest index to insert the element without messing up the list order Testing speechSynthesis - ✔ speechSynthesis is a Function + √ speechSynthesis is a Function Testing splitLines - ✔ splitLines is a Function - ✔ Splits a multiline string into an array of lines. + √ splitLines is a Function + √ Splits a multiline string into an array of lines. Testing spreadOver - ✔ spreadOver is a Function - ✔ Takes a variadic function and returns a closure that accepts an array of arguments to map to the inputs of the function. + √ spreadOver is a Function + √ Takes a variadic function and returns a closure that accepts an array of arguments to map to the inputs of the function. Testing standardDeviation - ✔ standardDeviation is a Function - ✔ Returns the standard deviation of an array of numbers - ✔ Returns the standard deviation of an array of numbers + √ standardDeviation is a Function + √ Returns the standard deviation of an array of numbers + √ Returns the standard deviation of an array of numbers + + Testing stringPermutations + + √ stringPermutations is a Function + √ Generates all stringPermutations of a string + √ Works for single-letter strings + √ Works for empty strings Testing stripHTMLTags - ✔ stripHTMLTags is a Function - ✔ Removes HTML tags + √ stripHTMLTags is a Function + √ Removes HTML tags Testing sum - ✔ sum is a Function - ✔ Returns the sum of two or more numbers/arrays. + √ sum is a Function + √ Returns the sum of two or more numbers/arrays. Testing sumBy - ✔ sumBy is a Function + √ sumBy is a Function Testing sumPower - ✔ sumPower is a Function - ✔ Returns the sum of the powers of all the numbers from start to end - ✔ Returns the sum of the powers of all the numbers from start to end - ✔ Returns the sum of the powers of all the numbers from start to end + √ sumPower is a Function + √ Returns the sum of the powers of all the numbers from start to end + √ Returns the sum of the powers of all the numbers from start to end + √ Returns the sum of the powers of all the numbers from start to end Testing symmetricDifference - ✔ symmetricDifference is a Function - ✔ Returns the symmetric difference between two arrays. + √ symmetricDifference is a Function + √ Returns the symmetric difference between two arrays. Testing symmetricDifferenceBy - ✔ symmetricDifferenceBy is a Function - ✔ Returns the symmetric difference between two arrays, after applying the provided function to each array element of both + √ symmetricDifferenceBy is a Function + √ Returns the symmetric difference between two arrays, after applying the provided function to each array element of both Testing symmetricDifferenceWith - ✔ symmetricDifferenceWith is a Function - ✔ Returns the symmetric difference between two arrays, using a provided function as a comparator + √ symmetricDifferenceWith is a Function + √ Returns the symmetric difference between two arrays, using a provided function as a comparator Testing tail - ✔ tail is a Function - ✔ Returns tail - ✔ Returns tail + √ tail is a Function + √ Returns tail + √ Returns tail Testing take - ✔ take is a Function - ✔ Returns an array with n elements removed from the beginning. - ✔ Returns an array with n elements removed from the beginning. + √ take is a Function + √ Returns an array with n elements removed from the beginning. + √ Returns an array with n elements removed from the beginning. Testing takeRight - ✔ takeRight is a Function - ✔ Returns an array with n elements removed from the end - ✔ Returns an array with n elements removed from the end + √ takeRight is a Function + √ Returns an array with n elements removed from the end + √ Returns an array with n elements removed from the end Testing takeRightWhile - ✔ takeRightWhile is a Function - ✔ Removes elements until the function returns true + √ takeRightWhile is a Function + √ Removes elements until the function returns true Testing takeWhile - ✔ takeWhile is a Function - ✔ Removes elements until the function returns true + √ takeWhile is a Function + √ Removes elements until the function returns true Testing throttle - ✔ throttle is a Function - - Testing timeTaken - - ✔ timeTaken is a Function + √ throttle is a Function Testing times - ✔ times is a Function - ✔ Runs a function the specified amount of times + √ times is a Function + √ Runs a function the specified amount of times + + Testing timeTaken + + √ timeTaken is a Function Testing toCamelCase - ✔ toCamelCase is a Function - ✔ toCamelCase('some_database_field_name') returns someDatabaseFieldName - ✔ toCamelCase('Some label that needs to be camelized') returns someLabelThatNeedsToBeCamelized - ✔ toCamelCase('some-javascript-property') return someJavascriptProperty - ✔ toCamelCase('some-mixed_string with spaces_underscores-and-hyphens') returns someMixedStringWithSpacesUnderscoresAndHyphens - ✔ toCamelCase() throws a error - ✔ toCamelCase([]) throws a error - ✔ toCamelCase({}) throws a error - ✔ toCamelCase(123) throws a error - ✔ toCamelCase(some-mixed_string with spaces_underscores-and-hyphens) takes less than 2s to run + √ toCamelCase is a Function + √ toCamelCase('some_database_field_name') returns someDatabaseFieldName + √ toCamelCase('Some label that needs to be camelized') returns someLabelThatNeedsToBeCamelized + √ toCamelCase('some-javascript-property') return someJavascriptProperty + √ toCamelCase('some-mixed_string with spaces_underscores-and-hyphens') returns someMixedStringWithSpacesUnderscoresAndHyphens + √ toCamelCase() throws a error + √ toCamelCase([]) throws a error + √ toCamelCase({}) throws a error + √ toCamelCase(123) throws a error + √ toCamelCase(some-mixed_string with spaces_underscores-and-hyphens) takes less than 2s to run Testing toCurrency - ✔ toCurrency is a Function - ✔ currency: Euro | currencyLangFormat: Local - ✔ currency: US Dollar | currencyLangFormat: English (United States) - ✔ currency: Japanese Yen | currencyLangFormat: Local + √ toCurrency is a Function + √ currency: Euro | currencyLangFormat: Local + √ currency: US Dollar | currencyLangFormat: English (United States) + √ currency: Japanese Yen | currencyLangFormat: Local Testing toDecimalMark - ✔ toDecimalMark is a Function - ✔ convert a float-point arithmetic to the Decimal mark form - - Testing toKebabCase - - ✔ toKebabCase is a Function - ✔ toKebabCase('camelCase') returns camel-case - ✔ toKebabCase('some text') returns some-text - ✔ toKebabCase('some-mixed-string With spaces-underscores-and-hyphens') returns some-mixed-string-with-spaces-underscores-and-hyphens - ✔ toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') returns i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-some-xml-and-html - ✔ toKebabCase() return undefined - ✔ toKebabCase([]) throws an error - ✔ toKebabCase({}) throws an error - ✔ toKebabCase(123) throws an error - ✔ toKebabCase(IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML) takes less than 2s to run - - Testing toOrdinalSuffix - - ✔ toOrdinalSuffix is a Function - ✔ Adds an ordinal suffix to a number - ✔ Adds an ordinal suffix to a number - ✔ Adds an ordinal suffix to a number - ✔ Adds an ordinal suffix to a number - - Testing toSafeInteger - - ✔ toSafeInteger is a Function - ✔ Number(toSafeInteger(3.2)) is a number - ✔ Converts a value to a safe integer - ✔ toSafeInteger('4.2') returns 4 - ✔ toSafeInteger(4.6) returns 5 - ✔ toSafeInteger([]) returns 0 - ✔ isNaN(toSafeInteger([1.5, 3124])) is true - ✔ isNaN(toSafeInteger('string')) is true - ✔ isNaN(toSafeInteger({})) is true - ✔ isNaN(toSafeInteger()) is true - ✔ toSafeInteger(Infinity) returns 9007199254740991 - ✔ toSafeInteger(3.2) takes less than 2s to run - - Testing toSnakeCase - - ✔ toSnakeCase is a Function - ✔ toSnakeCase('camelCase') returns camel_case - ✔ toSnakeCase('some text') returns some_text - ✔ toSnakeCase('some-mixed_string With spaces_underscores-and-hyphens') returns some_mixed_string_with_spaces_underscores_and_hyphens - ✔ toSnakeCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') returns i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html - ✔ toSnakeCase() returns undefined - ✔ toSnakeCase([]) throws an error - ✔ toSnakeCase({}) throws an error - ✔ toSnakeCase(123) throws an error - ✔ toSnakeCase(IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML) takes less than 2s to run + √ toDecimalMark is a Function + √ convert a float-point arithmetic to the Decimal mark form Testing toggleClass - ✔ toggleClass is a Function + √ toggleClass is a Function + + Testing toKebabCase + + √ toKebabCase is a Function + √ toKebabCase('camelCase') returns camel-case + √ toKebabCase('some text') returns some-text + √ toKebabCase('some-mixed-string With spaces-underscores-and-hyphens') returns some-mixed-string-with-spaces-underscores-and-hyphens + √ toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') returns i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-some-xml-and-html + √ toKebabCase() return undefined + √ toKebabCase([]) throws an error + √ toKebabCase({}) throws an error + √ toKebabCase(123) throws an error + √ toKebabCase(IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML) takes less than 2s to run Testing tomorrow - ✔ tomorrow is a Function - ✔ Returns the correct year - ✔ Returns the correct month - ✔ Returns the correct date + √ tomorrow is a Function + √ Returns the correct year + √ Returns the correct month + √ Returns the correct date + + Testing toOrdinalSuffix + + √ toOrdinalSuffix is a Function + √ Adds an ordinal suffix to a number + √ Adds an ordinal suffix to a number + √ Adds an ordinal suffix to a number + √ Adds an ordinal suffix to a number + + Testing toSafeInteger + + √ toSafeInteger is a Function + √ Number(toSafeInteger(3.2)) is a number + √ Converts a value to a safe integer + √ toSafeInteger('4.2') returns 4 + √ toSafeInteger(4.6) returns 5 + √ toSafeInteger([]) returns 0 + √ isNaN(toSafeInteger([1.5, 3124])) is true + √ isNaN(toSafeInteger('string')) is true + √ isNaN(toSafeInteger({})) is true + √ isNaN(toSafeInteger()) is true + √ toSafeInteger(Infinity) returns 9007199254740991 + √ toSafeInteger(3.2) takes less than 2s to run + + Testing toSnakeCase + + √ toSnakeCase is a Function + √ toSnakeCase('camelCase') returns camel_case + √ toSnakeCase('some text') returns some_text + √ toSnakeCase('some-mixed_string With spaces_underscores-and-hyphens') returns some_mixed_string_with_spaces_underscores_and_hyphens + √ toSnakeCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') returns i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html + √ toSnakeCase() returns undefined + √ toSnakeCase([]) throws an error + √ toSnakeCase({}) throws an error + √ toSnakeCase(123) throws an error + √ toSnakeCase(IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML) takes less than 2s to run Testing transform - ✔ transform is a Function - ✔ Transforms an object + √ transform is a Function + √ Transforms an object Testing truncateString - ✔ truncateString is a Function - ✔ Truncates a "boomerang" up to a specified length. + √ truncateString is a Function + √ Truncates a "boomerang" up to a specified length. Testing truthCheckCollection - ✔ truthCheckCollection is a Function - ✔ second argument is truthy on all elements of a collection + √ truthCheckCollection is a Function + √ second argument is truthy on all elements of a collection Testing unary - ✔ unary is a Function - ✔ Discards arguments after the first one + √ unary is a Function + √ Discards arguments after the first one Testing unescapeHTML - ✔ unescapeHTML is a Function - ✔ Unescapes escaped HTML characters. + √ unescapeHTML is a Function + √ Unescapes escaped HTML characters. Testing unflattenObject - ✔ unflattenObject is a Function - ✔ Unflattens an object with the paths for keys + √ unflattenObject is a Function + √ Unflattens an object with the paths for keys Testing unfold - ✔ unfold is a Function - ✔ Works with a given function, producing an array + √ unfold is a Function + √ Works with a given function, producing an array Testing union - ✔ union is a Function - ✔ union([1, 2, 3], [4, 3, 2]) returns [1, 2, 3, 4] - ✔ union('str', 'asd') returns [ 's', 't', 'r', 'a', 'd' ] - ✔ union([[], {}], [1, 2, 3]) returns [[], {}, 1, 2, 3] - ✔ union([], []) returns [] - ✔ union() throws an error - ✔ union(true, str) throws an error - ✔ union(false, true) throws an error - ✔ union(123, {}) throws an error - ✔ union([], {}) throws an error - ✔ union(undefined, null) throws an error - ✔ union([1, 2, 3], [4, 3, 2]) takes less than 2s to run + √ union is a Function + √ union([1, 2, 3], [4, 3, 2]) returns [1, 2, 3, 4] + √ union('str', 'asd') returns [ 's', 't', 'r', 'a', 'd' ] + √ union([[], {}], [1, 2, 3]) returns [[], {}, 1, 2, 3] + √ union([], []) returns [] + √ union() throws an error + √ union(true, str) throws an error + √ union(false, true) throws an error + √ union(123, {}) throws an error + √ union([], {}) throws an error + √ union(undefined, null) throws an error + √ union([1, 2, 3], [4, 3, 2]) takes less than 2s to run Testing unionBy - ✔ unionBy is a Function - ✔ Produces the appropriate results + √ unionBy is a Function + √ Produces the appropriate results Testing unionWith - ✔ unionWith is a Function - ✔ Produces the appropriate results + √ unionWith is a Function + √ Produces the appropriate results Testing uniqueElements - ✔ uniqueElements is a Function - ✔ uniqueElements([1, 2, 2, 3, 4, 4, 5]) returns [1,2,3,4,5] - ✔ uniqueElements([1, 23, 53]) returns [1, 23, 53] - ✔ uniqueElements([true, 0, 1, false, false, undefined, null, '']) returns [true, 0, 1, false, false, undefined, null, ''] - ✔ uniqueElements() returns [] - ✔ uniqueElements(null) returns [] - ✔ uniqueElements(undefined) returns [] - ✔ uniqueElements('strt') returns ['s', 't', 'r'] - ✔ uniqueElements(1, 1, 2543, 534, 5) throws an error - ✔ uniqueElements({}) throws an error - ✔ uniqueElements(true) throws an error - ✔ uniqueElements(false) throws an error - ✔ uniqueElements([true, 0, 1, false, false, undefined, null]) takes less than 2s to run + √ uniqueElements is a Function + √ uniqueElements([1, 2, 2, 3, 4, 4, 5]) returns [1,2,3,4,5] + √ uniqueElements([1, 23, 53]) returns [1, 23, 53] + √ uniqueElements([true, 0, 1, false, false, undefined, null, '']) returns [true, 0, 1, false, false, undefined, null, ''] + √ uniqueElements() returns [] + √ uniqueElements(null) returns [] + √ uniqueElements(undefined) returns [] + √ uniqueElements('strt') returns ['s', 't', 'r'] + √ uniqueElements(1, 1, 2543, 534, 5) throws an error + √ uniqueElements({}) throws an error + √ uniqueElements(true) throws an error + √ uniqueElements(false) throws an error + √ uniqueElements([true, 0, 1, false, false, undefined, null]) takes less than 2s to run Testing untildify - ✔ untildify is a Function - ✔ Contains no tildes - ✔ Does not alter the rest of the path - ✔ Does not alter paths without tildes + √ untildify is a Function + √ Contains no tildes + √ Does not alter the rest of the path + √ Does not alter paths without tildes Testing unzip - ✔ unzip is a Function - ✔ unzip([['a', 1, true], ['b', 2, false]]) equals [['a', 'b'], [1, 2], [true, false]] - ✔ unzip([['a', 1, true], ['b', 2]]) equals [['a', 'b'], [1, 2], [true]] + √ unzip is a Function + √ unzip([['a', 1, true], ['b', 2, false]]) equals [['a', 'b'], [1, 2], [true, false]] + √ unzip([['a', 1, true], ['b', 2]]) equals [['a', 'b'], [1, 2], [true]] Testing unzipWith - ✔ unzipWith is a Function - ✔ unzipWith([[1, 10, 100], [2, 20, 200]], (...args) => args.reduce((acc, v) => acc + v, 0)) equals [3, 30, 300] + √ unzipWith is a Function + √ unzipWith([[1, 10, 100], [2, 20, 200]], (...args) => args.reduce((acc, v) => acc + v, 0)) equals [3, 30, 300] + + Testing URLJoin + + √ URLJoin is a Function + √ Returns proper URL + √ Returns proper URL + + Testing UUIDGeneratorBrowser + + √ UUIDGeneratorBrowser is a Function + √ Tested 09/02/2018 by @chalarangelo + + Testing UUIDGeneratorNode + + √ UUIDGeneratorNode is a Function + √ Contains dashes in the proper places + √ Only contains hexadecimal digits Testing validateNumber - ✔ validateNumber is a Function - ✔ validateNumber(9) returns true - ✔ validateNumber(234asd.slice(0, 2)) returns true - ✔ validateNumber(1232) returns true - ✔ validateNumber(1232 + 13423) returns true - ✔ validateNumber(1232 * 2342 * 123) returns true - ✔ validateNumber(1232.23423536) returns true - ✔ validateNumber(234asd) returns false - ✔ validateNumber(e234d) returns false - ✔ validateNumber(false) returns false - ✔ validateNumber(true) returns false - ✔ validateNumber(null) returns false - ✔ validateNumber(123 * asd) returns false + √ validateNumber is a Function + √ validateNumber(9) returns true + √ validateNumber(234asd.slice(0, 2)) returns true + √ validateNumber(1232) returns true + √ validateNumber(1232 + 13423) returns true + √ validateNumber(1232 * 2342 * 123) returns true + √ validateNumber(1232.23423536) returns true + √ validateNumber(234asd) returns false + √ validateNumber(e234d) returns false + √ validateNumber(false) returns false + √ validateNumber(true) returns false + √ validateNumber(null) returns false + √ validateNumber(123 * asd) returns false Testing without - ✔ without is a Function - ✔ without([2, 1, 2, 3], 1, 2) returns [3] - ✔ without([]) returns [] - ✔ without([3, 1, true, '3', true], '3', true) returns [3, 1] - ✔ without('string'.split(''), 's', 't', 'g') returns ['r', 'i', 'n'] - ✔ without() throws an error - ✔ without(null) throws an error - ✔ without(undefined) throws an error - ✔ without() throws an error - ✔ without({}) throws an error + √ without is a Function + √ without([2, 1, 2, 3], 1, 2) returns [3] + √ without([]) returns [] + √ without([3, 1, true, '3', true], '3', true) returns [3, 1] + √ without('string'.split(''), 's', 't', 'g') returns ['r', 'i', 'n'] + √ without() throws an error + √ without(null) throws an error + √ without(undefined) throws an error + √ without() throws an error + √ without({}) throws an error Testing words - ✔ words is a Function - ✔ words('I love javaScript!!') returns [I, love, javaScript] - ✔ words('python, javaScript & coffee') returns [python, javaScript, coffee] - ✔ words(I love javaScript!!) returns an array - ✔ words() throws a error - ✔ words(null) throws a error - ✔ words(undefined) throws a error - ✔ words({}) throws a error - ✔ words([]) throws a error - ✔ words(1234) throws a error + √ words is a Function + √ words('I love javaScript!!') returns [I, love, javaScript] + √ words('python, javaScript & coffee') returns [python, javaScript, coffee] + √ words(I love javaScript!!) returns an array + √ words() throws a error + √ words(null) throws a error + √ words(undefined) throws a error + √ words({}) throws a error + √ words([]) throws a error + √ words(1234) throws a error Testing xProd - ✔ xProd is a Function - ✔ xProd([1, 2], ['a', 'b']) returns [[1, 'a'], [1, 'b'], [2, 'a'], [2, 'b']] + √ xProd is a Function + √ xProd([1, 2], ['a', 'b']) returns [[1, 'a'], [1, 'b'], [2, 'a'], [2, 'b']] Testing yesNo - ✔ yesNo is a Function - ✔ yesNo(Y) returns true - ✔ yesNo(yes) returns true - ✔ yesNo(foo, true) returns true - ✔ yesNo(No) returns false - ✔ yesNo() returns false - ✔ yesNo(null) returns false - ✔ yesNo(undefined) returns false - ✔ yesNo([123, null]) returns false - ✔ yesNo([Yes, No]) returns false - ✔ yesNo({ 2: Yes }) returns false - ✔ yesNo([Yes, No], true) returns true - ✔ yesNo({ 2: Yes }, true) returns true + √ yesNo is a Function + √ yesNo(Y) returns true + √ yesNo(yes) returns true + √ yesNo(foo, true) returns true + √ yesNo(No) returns false + √ yesNo() returns false + √ yesNo(null) returns false + √ yesNo(undefined) returns false + √ yesNo([123, null]) returns false + √ yesNo([Yes, No]) returns false + √ yesNo({ 2: Yes }) returns false + √ yesNo([Yes, No], true) returns true + √ yesNo({ 2: Yes }, true) returns true Testing zip - ✔ zip is a Function - ✔ zip([a, b], [1, 2], [true, false]) returns [[a, 1, true], [b, 2, false]] - ✔ zip([a], [1, 2], [true, false]) returns [[a, 1, true], [undefined, 2, false]] - ✔ zip([]) returns [] - ✔ zip(123) returns [] - ✔ zip([a, b], [1, 2], [true, false]) returns an Array - ✔ zip([a], [1, 2], [true, false]) returns an Array - ✔ zip(null) throws an error - ✔ zip(undefined) throws an error + √ zip is a Function + √ zip([a, b], [1, 2], [true, false]) returns [[a, 1, true], [b, 2, false]] + √ zip([a], [1, 2], [true, false]) returns [[a, 1, true], [undefined, 2, false]] + √ zip([]) returns [] + √ zip(123) returns [] + √ zip([a, b], [1, 2], [true, false]) returns an Array + √ zip([a], [1, 2], [true, false]) returns an Array + √ zip(null) throws an error + √ zip(undefined) throws an error Testing zipObject - ✔ zipObject is a Function - ✔ zipObject([a, b, c], [1, 2]) returns {a: 1, b: 2, c: undefined} - ✔ zipObject([a, b], [1, 2, 3]) returns {a: 1, b: 2} - ✔ zipObject([a, b, c], string) returns { a: s, b: t, c: r } - ✔ zipObject([a], string) returns { a: s } - ✔ zipObject() throws an error - ✔ zipObject([string], null) throws an error - ✔ zipObject(null, [1]) throws an error - ✔ zipObject(string) throws an error - ✔ zipObject(test, string) throws an error + √ zipObject is a Function + √ zipObject([a, b, c], [1, 2]) returns {a: 1, b: 2, c: undefined} + √ zipObject([a, b], [1, 2, 3]) returns {a: 1, b: 2} + √ zipObject([a, b, c], string) returns { a: s, b: t, c: r } + √ zipObject([a], string) returns { a: s } + √ zipObject() throws an error + √ zipObject([string], null) throws an error + √ zipObject(null, [1]) throws an error + √ zipObject(string) throws an error + √ zipObject(test, string) throws an error Testing zipWith - ✔ zipWith is a Function - ✔ Sends a GET request - ✔ Sends a POST request - ✔ Runs the function provided - ✔ Runs promises in series - ✔ Works with multiple promises + √ zipWith is a Function + √ Runs the function provided + √ Sends a GET request + √ Runs promises in series + √ Sends a POST request + √ Works with multiple promises - total: 901 - passing: 901 - duration: 2.3s + total: 908 + passing: 908 + duration: 2.4s From 6f2fafce59a103ae10bf7ac09c5ea2c8649ef6c0 Mon Sep 17 00:00:00 2001 From: Angelos Chalaris Date: Mon, 19 Feb 2018 15:53:50 +0200 Subject: [PATCH 15/54] Code quality improvement --- snippets/isAnagram.md | 2 +- test/isAnagram/isAnagram.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/snippets/isAnagram.md b/snippets/isAnagram.md index 492f54988..2cf9cc3cf 100644 --- a/snippets/isAnagram.md +++ b/snippets/isAnagram.md @@ -8,7 +8,7 @@ Use `String.toLowerCase()`, `String.replace()` with an appropriate regular expre const isAnagram = (str1, str2) => { const normalize = str => str.toLowerCase().replace(/[^a-z0-9]/gi, '').split('').sort().join(''); return normalize(str1) === normalize(str2); -} +}; ``` ```js diff --git a/test/isAnagram/isAnagram.js b/test/isAnagram/isAnagram.js index 762ce25f8..df206c4b9 100644 --- a/test/isAnagram/isAnagram.js +++ b/test/isAnagram/isAnagram.js @@ -1,5 +1,5 @@ const isAnagram = (str1, str2) => { const normalize = str => str.toLowerCase().replace(/[^a-z0-9]/gi, '').split('').sort().join(''); return normalize(str1) === normalize(str2); -} -module.exports = isAnagram; \ No newline at end of file +}; +module.exports = isAnagram; From 3dece3420d69ad05e4a1bf54c4c15b1c3acaddfd Mon Sep 17 00:00:00 2001 From: 30secondsofcode <30secondsofcode@gmail.com> Date: Mon, 19 Feb 2018 13:57:10 +0000 Subject: [PATCH 16/54] Travis build: 1702 --- README.md | 143 +++++++++++++++++++++++++++++---------- docs/index.html | 48 +++++++++---- snippets/isAnagram.md | 8 ++- snippets/permutations.md | 7 +- 4 files changed, 150 insertions(+), 56 deletions(-) diff --git a/README.md b/README.md index bddfc47cd..7e34acf9e 100644 --- a/README.md +++ b/README.md @@ -141,6 +141,7 @@ average(1, 2, 3); * [`none`](#none) * [`nthElement`](#nthelement) * [`partition`](#partition) +* [`permutations`](#permutations) * [`pull`](#pull) * [`pullAtIndex`](#pullatindex) * [`pullAtValue`](#pullatvalue) @@ -363,7 +364,6 @@ average(1, 2, 3);
View contents -* [`anagrams`](#anagrams) * [`byteSize`](#bytesize) * [`capitalize`](#capitalize) * [`capitalizeEveryWord`](#capitalizeeveryword) @@ -372,6 +372,7 @@ average(1, 2, 3); * [`escapeRegExp`](#escaperegexp) * [`fromCamelCase`](#fromcamelcase) * [`isAbsoluteURL`](#isabsoluteurl) +* [`isAnagram`](#isanagram) * [`isLowerCase`](#islowercase) * [`isUpperCase`](#isuppercase) * [`mask`](#mask) @@ -381,6 +382,7 @@ average(1, 2, 3); * [`reverseString`](#reversestring) * [`sortCharactersInString`](#sortcharactersinstring) * [`splitLines`](#splitlines) +* [`stringPermutations`](#stringpermutations) * [`stripHTMLTags`](#striphtmltags) * [`toCamelCase`](#tocamelcase) * [`toKebabCase`](#tokebabcase) @@ -1851,6 +1853,42 @@ partition(users, o => o.active); // [[{ 'user': 'fred', 'age': 40, 'active':
[⬆ Back to top](#table-of-contents) +### permutations + +⚠️ **WARNING**: This function's execution time increases exponentially with each array element. Anything more than 8 to 10 entries will cause your browser to hang as it tries to solve all the different combinations. + +Generates all permutations of an array's elements (contains duplicates). + +Use recursion. +For each element in the given array, create all the partial permutations for the rest of its elements. +Use `Array.map()` to combine the element with each partial permutation, then `Array.reduce()` to combine all permutations in one array. +Base cases are for array `length` equal to `2` or `1`. + +```js +const permutations = arr => { + if (arr.length <= 2) return arr.length === 2 ? [arr, [arr[1], arr[0]]] : arr; + return arr.reduce( + (acc, item, i) => + acc.concat( + permutations([...arr.slice(0, i), ...arr.slice(i + 1)]).map(val => [item, ...val]) + ), + [] + ); +}; +``` + +
+Examples + +```js +permutations([1, 33, 5]); // [ [ 1, 33, 5 ], [ 1, 5, 33 ], [ 33, 1, 5 ], [ 33, 5, 1 ], [ 5, 1, 33 ], [ 5, 33, 1 ] ] +``` + +
+ +
[⬆ Back to top](#table-of-contents) + + ### pull Mutates the original array to filter out the values specified. @@ -6549,42 +6587,6 @@ unflattenObject({ 'a.b.c': 1, d: 1 }); // { a: { b: { c: 1 } }, d: 1 } --- ## 📜 String -### anagrams - -⚠️ **WARNING**: This function's execution time increases exponentially with each character. Anything more than 8 to 10 characters will cause your browser to hang as it tries to solve all the different combinations. - -Generates all anagrams of a string (contains duplicates). - -Use recursion. -For each letter in the given string, create all the partial anagrams for the rest of its letters. -Use `Array.map()` to combine the letter with each partial anagram, then `Array.reduce()` to combine all anagrams in one array. -Base cases are for string `length` equal to `2` or `1`. - -```js -const anagrams = str => { - if (str.length <= 2) return str.length === 2 ? [str, str[1] + str[0]] : [str]; - return str - .split('') - .reduce( - (acc, letter, i) => - acc.concat(anagrams(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)), - [] - ); -}; -``` - -
-Examples - -```js -anagrams('abc'); // ['abc','acb','bac','bca','cab','cba'] -``` - -
- -
[⬆ Back to top](#table-of-contents) - - ### byteSize Returns the length of a string in bytes. @@ -6788,6 +6790,37 @@ isAbsoluteURL('/foo/bar'); // false
[⬆ Back to top](#table-of-contents) +### isAnagram + +Checks if a string is an anagram of another string (case-insensitive, ignores spaces, punctuation and special characters). + +Use `String.toLowerCase()`, `String.replace()` with an appropriate regular expression to remove unnecessary characters, `String.split('')`, `Array.sort()` and `Array.join('')` on both strings to normalize them, then check if their normalized forms are equal. + +```js +const isAnagram = (str1, str2) => { + const normalize = str => + str + .toLowerCase() + .replace(/[^a-z0-9]/gi, '') + .split('') + .sort() + .join(''); + return normalize(str1) === normalize(str2); +}; +``` + +
+Examples + +```js +isAnagram('iceman', 'cinema'); // true +``` + +
+ +
[⬆ Back to top](#table-of-contents) + + ### isLowerCase Checks if a string is lower case. @@ -7023,6 +7056,42 @@ splitLines('This\nis a\nmultiline\nstring.\n'); // ['This', 'is a', 'multiline',
[⬆ Back to top](#table-of-contents) +### stringPermutations + +⚠️ **WARNING**: This function's execution time increases exponentially with each character. Anything more than 8 to 10 characters will cause your browser to hang as it tries to solve all the different combinations. + +Generates all permutations of a string (contains duplicates). + +Use recursion. +For each letter in the given string, create all the partial permutations for the rest of its letters. +Use `Array.map()` to combine the letter with each partial permutation, then `Array.reduce()` to combine all permutations in one array. +Base cases are for string `length` equal to `2` or `1`. + +```js +const stringPermutations = str => { + if (str.length <= 2) return str.length === 2 ? [str, str[1] + str[0]] : [str]; + return str + .split('') + .reduce( + (acc, letter, i) => + acc.concat(stringPermutations(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)), + [] + ); +}; +``` + +
+Examples + +```js +stringPermutations('abc'); // ['abc','acb','bac','bca','cab','cba'] +``` + +
+ +
[⬆ Back to top](#table-of-contents) + + ### stripHTMLTags Removes HTML/XML tags from string. diff --git a/docs/index.html b/docs/index.html index d8b48804d..cb0c65ff9 100644 --- a/docs/index.html +++ b/docs/index.html @@ -50,7 +50,7 @@ scrollToTop(); } }, false); - }

logo 30 seconds of code Curated collection of useful JavaScript snippets that you can understand in 30 seconds or less.

 

Adapter

ary

Creates a function that accepts up to n arguments, ignoring any additional arguments.

Call the provided function, fn, with up to n arguments, using Array.slice(0,n) and the spread operator (...).

const ary = (fn, n) => (...args) => fn(...args.slice(0, n));
+      }

logo 30 seconds of code Curated collection of useful JavaScript snippets that you can understand in 30 seconds or less.

 

Adapter

ary

Creates a function that accepts up to n arguments, ignoring any additional arguments.

Call the provided function, fn, with up to n arguments, using Array.slice(0,n) and the spread operator (...).

const ary = (fn, n) => (...args) => fn(...args.slice(0, n));
 
const firstTwoMax = ary(Math.max, 2);
 [[2, 6, 'a'], [8, 4, 6], [10]].map(x => firstTwoMax(...x)); // [6, 8, 10]
 

call

Given a key and a set of arguments, call them when given a context. Primarily useful in composition.

Use a closure to call a stored key with stored arguments.

const call = (key, ...args) => context => context[key](...args);
@@ -311,6 +311,17 @@ Object.assig
   );
 
const users = [{ user: 'barney', age: 36, active: false }, { user: 'fred', age: 40, active: true }];
 partition(users, o => o.active); // [[{ 'user': 'fred',    'age': 40, 'active': true }],[{ 'user': 'barney',  'age': 36, 'active': false }]]
+

permutations

⚠️ WARNING: This function's execution time increases exponentially with each array element. Anything more than 8 to 10 entries will cause your browser to hang as it tries to solve all the different combinations.

Generates all permutations of an array's elements (contains duplicates).

Use recursion. For each element in the given array, create all the partial permutations for the rest of its elements. Use Array.map() to combine the element with each partial permutation, then Array.reduce() to combine all permutations in one array. Base cases are for array length equal to 2 or 1.

const permutations = arr => {
+  if (arr.length <= 2) return arr.length === 2 ? [arr, [arr[1], arr[0]]] : arr;
+  return arr.reduce(
+    (acc, item, i) =>
+      acc.concat(
+        permutations([...arr.slice(0, i), ...arr.slice(i + 1)]).map(val => [item, ...val])
+      ),
+    []
+  );
+};
+
permutations([1, 33, 5]); // [ [ 1, 33, 5 ], [ 1, 5, 33 ], [ 33, 1, 5 ], [ 33, 5, 1 ], [ 5, 1, 33 ], [ 5, 33, 1 ] ]
 

pull

Mutates the original array to filter out the values specified.

Use Array.filter() and Array.includes() to pull out the values that are not needed. Use Array.length = 0 to mutate the passed in an array by resetting it's length to zero and Array.push() to re-populate it with only the pulled values.

(For a snippet that does not mutate the original array see without)

const pull = (arr, ...args) => {
   let argState = Array.isArray(args[0]) ? args[0] : args;
   let pulled = arr.filter((v, i) => !argState.includes(v));
@@ -1516,18 +1527,7 @@ Foo.prototypereturn acc;
   }, {});
 
unflattenObject({ 'a.b.c': 1, d: 1 }); // { a: { b: { c: 1 } }, d: 1 }
-

String

anagrams

⚠️ WARNING: This function's execution time increases exponentially with each character. Anything more than 8 to 10 characters will cause your browser to hang as it tries to solve all the different combinations.

Generates all anagrams of a string (contains duplicates).

Use recursion. For each letter in the given string, create all the partial anagrams for the rest of its letters. Use Array.map() to combine the letter with each partial anagram, then Array.reduce() to combine all anagrams in one array. Base cases are for string length equal to 2 or 1.

const anagrams = str => {
-  if (str.length <= 2) return str.length === 2 ? [str, str[1] + str[0]] : [str];
-  return str
-    .split('')
-    .reduce(
-      (acc, letter, i) =>
-        acc.concat(anagrams(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)),
-      []
-    );
-};
-
anagrams('abc'); // ['abc','acb','bac','bca','cab','cba']
-

byteSize

Returns the length of a string in bytes.

Convert a given string to a Blob Object and find its size.

const byteSize = str => new Blob([str]).size;
+

String

byteSize

Returns the length of a string in bytes.

Convert a given string to a Blob Object and find its size.

const byteSize = str => new Blob([str]).size;
 
byteSize('😀'); // 4
 byteSize('Hello World'); // 11
 

capitalize

Capitalizes the first letter of a string.

Use array destructuring and String.toUpperCase() to capitalize first letter, ...rest to get array of characters after first letter and then Array.join('') to make it a string again. Omit the lowerRest parameter to keep the rest of the string intact, or set it to true to convert to lowercase.

const capitalize = ([first, ...rest], lowerRest = false) =>
@@ -1567,6 +1567,17 @@ Foo.prototypeShow examples
isAbsoluteURL('https://google.com'); // true
 isAbsoluteURL('ftp://www.myserver.net'); // true
 isAbsoluteURL('/foo/bar'); // false
+

isAnagram

Checks if a string is an anagram of another string (case-insensitive, ignores spaces, punctuation and special characters).

Use String.toLowerCase(), String.replace() with an appropriate regular expression to remove unnecessary characters, String.split(''), Array.sort() and Array.join('') on both strings to normalize them, then check if their normalized forms are equal.

const isAnagram = (str1, str2) => {
+  const normalize = str =>
+    str
+      .toLowerCase()
+      .replace(/[^a-z0-9]/gi, '')
+      .split('')
+      .sort()
+      .join('');
+  return normalize(str1) === normalize(str2);
+};
+
isAnagram('iceman', 'cinema'); // true
 

isLowerCase

Checks if a string is lower case.

Convert the given string to lower case, using String.toLowerCase() and compare it to the original.

const isLowerCase = str => str === str.toLowerCase();
 
isLowerCase('abc'); // true
 isLowerCase('a3@$'); // true
@@ -1616,6 +1627,17 @@ Foo.prototypeShow examples
sortCharactersInString('cabbage'); // 'aabbceg'
 

splitLines

Splits a multiline string into an array of lines.

Use String.split() and a regular expression to match line breaks and create an array.

const splitLines = str => str.split(/\r?\n/);
 
splitLines('This\nis a\nmultiline\nstring.\n'); // ['This', 'is a', 'multiline', 'string.' , '']
+

stringPermutations

⚠️ WARNING: This function's execution time increases exponentially with each character. Anything more than 8 to 10 characters will cause your browser to hang as it tries to solve all the different combinations.

Generates all permutations of a string (contains duplicates).

Use recursion. For each letter in the given string, create all the partial permutations for the rest of its letters. Use Array.map() to combine the letter with each partial permutation, then Array.reduce() to combine all permutations in one array. Base cases are for string length equal to 2 or 1.

const stringPermutations = str => {
+  if (str.length <= 2) return str.length === 2 ? [str, str[1] + str[0]] : [str];
+  return str
+    .split('')
+    .reduce(
+      (acc, letter, i) =>
+        acc.concat(stringPermutations(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)),
+      []
+    );
+};
+
stringPermutations('abc'); // ['abc','acb','bac','bca','cab','cba']
 

stripHTMLTags

Removes HTML/XML tags from string.

Use a regular expression to remove HTML/XML tags from a string.

const stripHTMLTags = str => str.replace(/<[^>]*>/g, '');
 
stripHTMLTags('<p><em>lorem</em> <strong>ipsum</strong></p>'); // 'lorem ipsum'
 

toCamelCase

Converts a string to camelcase.

Break the string into words and combine them capitalizing the first letter of each word, using a regexp.

const toCamelCase = str => {
diff --git a/snippets/isAnagram.md b/snippets/isAnagram.md
index 2cf9cc3cf..81045764a 100644
--- a/snippets/isAnagram.md
+++ b/snippets/isAnagram.md
@@ -6,7 +6,13 @@ Use `String.toLowerCase()`, `String.replace()` with an appropriate regular expre
 
 ```js
 const isAnagram = (str1, str2) => {
-  const normalize = str => str.toLowerCase().replace(/[^a-z0-9]/gi, '').split('').sort().join('');
+  const normalize = str =>
+    str
+      .toLowerCase()
+      .replace(/[^a-z0-9]/gi, '')
+      .split('')
+      .sort()
+      .join('');
   return normalize(str1) === normalize(str2);
 };
 ```
diff --git a/snippets/permutations.md b/snippets/permutations.md
index 42168724e..44ec508ce 100644
--- a/snippets/permutations.md
+++ b/snippets/permutations.md
@@ -15,10 +15,7 @@ const permutations = arr => {
   return arr.reduce(
     (acc, item, i) =>
       acc.concat(
-        permutations([...arr.slice(0, i), ...arr.slice(i + 1)]).map(val => [
-          item,
-          ...val,
-        ])
+        permutations([...arr.slice(0, i), ...arr.slice(i + 1)]).map(val => [item, ...val])
       ),
     []
   );
@@ -26,5 +23,5 @@ const permutations = arr => {
 ```
 
 ```js
-permutations([1, 33, 5]) // [ [ 1, 33, 5 ], [ 1, 5, 33 ], [ 33, 1, 5 ], [ 33, 5, 1 ], [ 5, 1, 33 ], [ 5, 33, 1 ] ]
+permutations([1, 33, 5]); // [ [ 1, 33, 5 ], [ 1, 5, 33 ], [ 33, 1, 5 ], [ 33, 5, 1 ], [ 5, 1, 33 ], [ 5, 33, 1 ] ]
 ```

From 47191e811eb3b815ae5db4592ea91917b2c90534 Mon Sep 17 00:00:00 2001
From: Rohit Tanwar <31792358+kriadmin@users.noreply.github.com>
Date: Mon, 19 Feb 2018 21:21:10 +0530
Subject: [PATCH 17/54] Update fuzzySearch

---
 snippets/fuzzySearch.md | 17 ++++-------------
 1 file changed, 4 insertions(+), 13 deletions(-)

diff --git a/snippets/fuzzySearch.md b/snippets/fuzzySearch.md
index 9760f5279..d384e5b41 100644
--- a/snippets/fuzzySearch.md
+++ b/snippets/fuzzySearch.md
@@ -6,19 +6,10 @@ Loops through `str` and determines if it contains all characters of `patrn` and
 
 Taken from [here](https://github.com/forrestthewoods/lib_fts/blob/80f3f8c52db53428247e741b9efe2cde9667050c/code/fts_fuzzy_match.js#L18).
 ``` js
-fuzzySearch = (pattern, string) => { 
-    let patternLength = pattern.length;
-    let strLength = string.length;
-
-    for (var patternIdx = 0, strIdx = 0;patternIdx !== patternLength && strIdx !== strLength;strIdx++){
-        let patternChar = pattern[patternIdx].toLowerCase();
-        let strChar = string[strIdx].toLowerCase();
-        if (patternChar === strChar)
-            ++patternIdx;
-    }
-
-    return patternLength !== 0 && strLength !== 0 && patternIdx === patternLength ? true : false;
-};
+const fuzzySearch = (pattern, str) =>
+	[...str].reduce(
+		(acc, char) => char.toLowerCase() === (pattern[acc]  || '').toLowerCase() ? acc + 1 : acc, 0
+	) === pattern.length ? true : false;
 ```
 
 

From 417ce9bc61fdd68b6e0a84538f194e9eb0181795 Mon Sep 17 00:00:00 2001
From: 30secondsofcode <30secondsofcode@gmail.com>
Date: Mon, 19 Feb 2018 20:25:25 +0000
Subject: [PATCH 18/54] Travis build: 1705 [cron]

---
 dist/_30s.es5.js                  |  134 +-
 dist/_30s.es5.min.js              |    2 +-
 dist/_30s.esm.js                  |   46 +-
 dist/_30s.js                      |   46 +-
 dist/_30s.min.js                  |    2 +-
 test/isAnagram/isAnagram.js       |   10 +-
 test/permutations/permutations.js |    5 +-
 test/testlog                      | 3655 +++++++++++++++--------------
 8 files changed, 2036 insertions(+), 1864 deletions(-)

diff --git a/dist/_30s.es5.js b/dist/_30s.es5.js
index 0bc6ed0a8..2ee4a9491 100644
--- a/dist/_30s.es5.js
+++ b/dist/_30s.es5.js
@@ -39,15 +39,6 @@ var all = function all(arr) {
   return arr.every(fn);
 };
 
-var anagrams = function anagrams(str) {
-  if (str.length <= 2) return str.length === 2 ? [str, str[1] + str[0]] : [str];
-  return str.split('').reduce(function (acc, letter, i) {
-    return acc.concat(anagrams(str.slice(0, i) + str.slice(i + 1)).map(function (val) {
-      return letter + val;
-    }));
-  }, []);
-};
-
 var any = function any(arr) {
   var fn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Boolean;
   return arr.some(fn);
@@ -1027,6 +1018,13 @@ var isAbsoluteURL = function isAbsoluteURL(str) {
   );
 };
 
+var isAnagram = function isAnagram(str1, str2) {
+  var normalize = function normalize(str) {
+    return str.toLowerCase().replace(/[^a-z0-9]/gi, '').split('').sort().join('');
+  };
+  return normalize(str1) === normalize(str2);
+};
+
 function _toConsumableArray$7(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
 var isArrayLike = function isArrayLike(val) {
@@ -1570,6 +1568,17 @@ var percentile = function percentile(arr, val) {
   }, 0) / arr.length;
 };
 
+function _toConsumableArray$16(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+
+var permutations = function permutations(arr) {
+  if (arr.length <= 2) return arr.length === 2 ? [arr, [arr[1], arr[0]]] : arr;
+  return arr.reduce(function (acc, item, i) {
+    return acc.concat(permutations([].concat(_toConsumableArray$16(arr.slice(0, i)), _toConsumableArray$16(arr.slice(i + 1)))).map(function (val) {
+      return [item].concat(_toConsumableArray$16(val));
+    }));
+  }, []);
+};
+
 var pick = function pick(obj, arr) {
   return arr.reduce(function (acc, curr) {
     return curr in obj && (acc[curr] = obj[curr]), acc;
@@ -1765,7 +1774,7 @@ var readFileLines = function readFileLines(filename) {
   return fs$1.readFileSync(filename).toString('UTF8').split('\n');
 };
 
-function _toConsumableArray$16(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+function _toConsumableArray$17(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
 var rearg = function rearg(fn, indexes) {
   return function () {
@@ -1773,7 +1782,7 @@ var rearg = function rearg(fn, indexes) {
       args[_key] = arguments[_key];
     }
 
-    return fn.apply(undefined, _toConsumableArray$16(args.reduce(function (acc, val, i) {
+    return fn.apply(undefined, _toConsumableArray$17(args.reduce(function (acc, val, i) {
       return acc[indexes.indexOf(i)] = val, acc;
     }, Array.from({ length: indexes.length }))));
   };
@@ -1819,10 +1828,10 @@ var removeNonASCII = function removeNonASCII(str) {
   return str.replace(/[^\x20-\x7E]/g, '');
 };
 
-function _toConsumableArray$17(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+function _toConsumableArray$18(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
 var reverseString = function reverseString(str) {
-  return [].concat(_toConsumableArray$17(str)).reverse().join('');
+  return [].concat(_toConsumableArray$18(str)).reverse().join('');
 };
 
 var round = function round(n) {
@@ -1945,10 +1954,10 @@ var sleep = function sleep(ms) {
   });
 };
 
-function _toConsumableArray$18(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+function _toConsumableArray$19(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
 var sortCharactersInString = function sortCharactersInString(str) {
-  return [].concat(_toConsumableArray$18(str)).sort(function (a, b) {
+  return [].concat(_toConsumableArray$19(str)).sort(function (a, b) {
     return a.localeCompare(b);
   }).join('');
 };
@@ -1995,11 +2004,11 @@ var splitLines = function splitLines(str) {
   return str.split(/\r?\n/);
 };
 
-function _toConsumableArray$19(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+function _toConsumableArray$20(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
 var spreadOver = function spreadOver(fn) {
   return function (argsArr) {
-    return fn.apply(undefined, _toConsumableArray$19(argsArr));
+    return fn.apply(undefined, _toConsumableArray$20(argsArr));
   };
 };
 
@@ -2027,6 +2036,15 @@ var standardDeviation = function standardDeviation(arr) {
   }, 0) / (arr.length - (usePopulation ? 0 : 1)));
 };
 
+var stringPermutations = function stringPermutations(str) {
+  if (str.length <= 2) return str.length === 2 ? [str, str[1] + str[0]] : [str];
+  return str.split('').reduce(function (acc, letter, i) {
+    return acc.concat(stringPermutations(str.slice(0, i) + str.slice(i + 1)).map(function (val) {
+      return letter + val;
+    }));
+  }, []);
+};
+
 var stripHTMLTags = function stripHTMLTags(str) {
   return str.replace(/<[^>]*>/g, '');
 };
@@ -2059,19 +2077,19 @@ var sumPower = function sumPower(end) {
   }, 0);
 };
 
-function _toConsumableArray$20(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+function _toConsumableArray$21(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
 var symmetricDifference = function symmetricDifference(a, b) {
   var sA = new Set(a),
       sB = new Set(b);
-  return [].concat(_toConsumableArray$20(a.filter(function (x) {
+  return [].concat(_toConsumableArray$21(a.filter(function (x) {
     return !sB.has(x);
-  })), _toConsumableArray$20(b.filter(function (x) {
+  })), _toConsumableArray$21(b.filter(function (x) {
     return !sA.has(x);
   })));
 };
 
-function _toConsumableArray$21(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+function _toConsumableArray$22(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
 var symmetricDifferenceBy = function symmetricDifferenceBy(a, b, fn) {
   var sA = new Set(a.map(function (v) {
@@ -2080,21 +2098,21 @@ var symmetricDifferenceBy = function symmetricDifferenceBy(a, b, fn) {
       sB = new Set(b.map(function (v) {
     return fn(v);
   }));
-  return [].concat(_toConsumableArray$21(a.filter(function (x) {
+  return [].concat(_toConsumableArray$22(a.filter(function (x) {
     return !sB.has(fn(x));
-  })), _toConsumableArray$21(b.filter(function (x) {
+  })), _toConsumableArray$22(b.filter(function (x) {
     return !sA.has(fn(x));
   })));
 };
 
-function _toConsumableArray$22(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+function _toConsumableArray$23(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
 var symmetricDifferenceWith = function symmetricDifferenceWith(arr, val, comp) {
-  return [].concat(_toConsumableArray$22(arr.filter(function (a) {
+  return [].concat(_toConsumableArray$23(arr.filter(function (a) {
     return val.findIndex(function (b) {
       return comp(a, b);
     }) === -1;
-  })), _toConsumableArray$22(val.filter(function (a) {
+  })), _toConsumableArray$23(val.filter(function (a) {
     return arr.findIndex(function (b) {
       return comp(a, b);
     }) === -1;
@@ -2333,62 +2351,46 @@ var unfold = function unfold(fn, seed) {
   }return result;
 };
 
-function _toConsumableArray$23(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+function _toConsumableArray$24(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
 var union = function union(a, b) {
-  return Array.from(new Set([].concat(_toConsumableArray$23(a), _toConsumableArray$23(b))));
+  return Array.from(new Set([].concat(_toConsumableArray$24(a), _toConsumableArray$24(b))));
 };
 
-function _toConsumableArray$24(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+function _toConsumableArray$25(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
 var unionBy = function unionBy(a, b, fn) {
   var s = new Set(a.map(function (v) {
     return fn(v);
   }));
-  return Array.from(new Set([].concat(_toConsumableArray$24(a), _toConsumableArray$24(b.filter(function (x) {
+  return Array.from(new Set([].concat(_toConsumableArray$25(a), _toConsumableArray$25(b.filter(function (x) {
     return !s.has(fn(x));
   })))));
 };
 
-function _toConsumableArray$25(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+function _toConsumableArray$26(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
 var unionWith = function unionWith(a, b, comp) {
-  return Array.from(new Set([].concat(_toConsumableArray$25(a), _toConsumableArray$25(b.filter(function (x) {
+  return Array.from(new Set([].concat(_toConsumableArray$26(a), _toConsumableArray$26(b.filter(function (x) {
     return a.findIndex(function (y) {
       return comp(x, y);
     }) === -1;
   })))));
 };
 
-function _toConsumableArray$26(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+function _toConsumableArray$27(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
 var uniqueElements = function uniqueElements(arr) {
-  return [].concat(_toConsumableArray$26(new Set(arr)));
+  return [].concat(_toConsumableArray$27(new Set(arr)));
 };
 
 var untildify = function untildify(str) {
   return str.replace(/^~($|\/|\\)/, (typeof require !== "undefined" && require('os').homedir()) + "$1");
 };
 
-function _toConsumableArray$27(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
-
-var unzip = function unzip(arr) {
-  return arr.reduce(function (acc, val) {
-    return val.forEach(function (v, i) {
-      return acc[i].push(v);
-    }), acc;
-  }, Array.from({
-    length: Math.max.apply(Math, _toConsumableArray$27(arr.map(function (x) {
-      return x.length;
-    })))
-  }).map(function (x) {
-    return [];
-  }));
-};
-
 function _toConsumableArray$28(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
-var unzipWith = function unzipWith(arr, fn) {
+var unzip = function unzip(arr) {
   return arr.reduce(function (acc, val) {
     return val.forEach(function (v, i) {
       return acc[i].push(v);
@@ -2399,8 +2401,24 @@ var unzipWith = function unzipWith(arr, fn) {
     })))
   }).map(function (x) {
     return [];
+  }));
+};
+
+function _toConsumableArray$29(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+
+var unzipWith = function unzipWith(arr, fn) {
+  return arr.reduce(function (acc, val) {
+    return val.forEach(function (v, i) {
+      return acc[i].push(v);
+    }), acc;
+  }, Array.from({
+    length: Math.max.apply(Math, _toConsumableArray$29(arr.map(function (x) {
+      return x.length;
+    })))
+  }).map(function (x) {
+    return [];
   })).map(function (val) {
-    return fn.apply(undefined, _toConsumableArray$28(val));
+    return fn.apply(undefined, _toConsumableArray$29(val));
   });
 };
 
@@ -2437,14 +2455,14 @@ var yesNo = function yesNo(val) {
   );
 };
 
-function _toConsumableArray$29(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+function _toConsumableArray$30(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
 var zip = function zip() {
   for (var _len = arguments.length, arrays = Array(_len), _key = 0; _key < _len; _key++) {
     arrays[_key] = arguments[_key];
   }
 
-  var maxLength = Math.max.apply(Math, _toConsumableArray$29(arrays.map(function (x) {
+  var maxLength = Math.max.apply(Math, _toConsumableArray$30(arrays.map(function (x) {
     return x.length;
   })));
   return Array.from({ length: maxLength }).map(function (_, i) {
@@ -2460,7 +2478,7 @@ var zipObject = function zipObject(props, values) {
   }, {});
 };
 
-function _toConsumableArray$30(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+function _toConsumableArray$31(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
 var zipWith = function zipWith() {
   for (var _len = arguments.length, arrays = Array(_len), _key = 0; _key < _len; _key++) {
@@ -2470,7 +2488,7 @@ var zipWith = function zipWith() {
   var length = arrays.length;
   var fn = length > 1 ? arrays[length - 1] : undefined;
   fn = typeof fn == 'function' ? (arrays.pop(), fn) : undefined;
-  var maxLength = Math.max.apply(Math, _toConsumableArray$30(arrays.map(function (x) {
+  var maxLength = Math.max.apply(Math, _toConsumableArray$31(arrays.map(function (x) {
     return x.length;
   })));
   var result = Array.from({ length: maxLength }).map(function (_, i) {
@@ -2479,11 +2497,11 @@ var zipWith = function zipWith() {
     });
   });
   return fn ? result.map(function (arr) {
-    return fn.apply(undefined, _toConsumableArray$30(arr));
+    return fn.apply(undefined, _toConsumableArray$31(arr));
   }) : result;
 };
 
-var imports = { JSONToFile: JSONToFile, RGBToHex: RGBToHex, URLJoin: URLJoin, UUIDGeneratorBrowser: UUIDGeneratorBrowser, UUIDGeneratorNode: UUIDGeneratorNode, all: all, anagrams: anagrams, any: any, approximatelyEqual: approximatelyEqual, arrayToHtmlList: arrayToHtmlList, ary: ary, atob: atob, attempt: attempt, average: average, averageBy: averageBy, bifurcate: bifurcate, bifurcateBy: bifurcateBy, bind: bind, bindAll: bindAll, bindKey: bindKey, binomialCoefficient: binomialCoefficient, bottomVisible: bottomVisible, btoa: btoa, byteSize: byteSize, call: call, capitalize: capitalize, capitalizeEveryWord: capitalizeEveryWord, castArray: castArray, chainAsync: chainAsync, chunk: chunk, clampNumber: clampNumber, cloneRegExp: cloneRegExp, coalesce: coalesce, coalesceFactory: coalesceFactory, collectInto: collectInto, colorize: colorize, compact: compact, compose: compose, composeRight: composeRight, converge: converge, copyToClipboard: copyToClipboard, countBy: countBy, countOccurrences: countOccurrences, createElement: createElement, createEventHub: createEventHub, currentURL: currentURL, curry: curry, debounce: debounce, decapitalize: decapitalize, deepClone: deepClone, deepFlatten: deepFlatten, defaults: defaults, defer: defer, degreesToRads: degreesToRads, delay: delay, detectDeviceType: detectDeviceType, difference: difference, differenceBy: differenceBy, differenceWith: differenceWith, digitize: digitize, distance: distance, drop: drop, dropRight: dropRight, dropRightWhile: dropRightWhile, dropWhile: dropWhile, elementIsVisibleInViewport: elementIsVisibleInViewport, elo: elo, equals: equals, escapeHTML: escapeHTML, escapeRegExp: escapeRegExp, everyNth: everyNth, extendHex: extendHex, factorial: factorial, fibonacci: fibonacci, filterNonUnique: filterNonUnique, findKey: findKey, findLast: findLast, findLastIndex: findLastIndex, findLastKey: findLastKey, flatten: flatten, flattenObject: flattenObject, flip: flip, forEachRight: forEachRight, forOwn: forOwn, forOwnRight: forOwnRight, formatDuration: formatDuration, fromCamelCase: fromCamelCase, functionName: functionName, functions: functions, gcd: gcd, geometricProgression: geometricProgression, get: get, getColonTimeFromDate: getColonTimeFromDate, getDaysDiffBetweenDates: getDaysDiffBetweenDates, getMeridiemSuffixOfInteger: getMeridiemSuffixOfInteger, getScrollPosition: getScrollPosition, getStyle: getStyle, getType: getType, getURLParameters: getURLParameters, groupBy: groupBy, hammingDistance: hammingDistance, hasClass: hasClass, hasFlags: hasFlags, hashBrowser: hashBrowser, hashNode: hashNode, head: head, hexToRGB: hexToRGB, hide: hide, httpGet: httpGet, httpPost: httpPost, httpsRedirect: httpsRedirect, inRange: inRange, indexOfAll: indexOfAll, initial: initial, initialize2DArray: initialize2DArray, initializeArrayWithRange: initializeArrayWithRange, initializeArrayWithRangeRight: initializeArrayWithRangeRight, initializeArrayWithValues: initializeArrayWithValues, intersection: intersection, intersectionBy: intersectionBy, intersectionWith: intersectionWith, invertKeyValues: invertKeyValues, is: is, isAbsoluteURL: isAbsoluteURL, isArrayLike: isArrayLike, isBoolean: isBoolean, isDivisible: isDivisible, isEmpty: isEmpty, isEven: isEven, isFunction: isFunction, isLowerCase: isLowerCase, isNil: isNil, isNull: isNull, isNumber: isNumber, isObject: isObject, isObjectLike: isObjectLike, isPlainObject: isPlainObject, isPrime: isPrime, isPrimitive: isPrimitive, isPromiseLike: isPromiseLike, isSorted: isSorted, isString: isString, isSymbol: isSymbol, isTravisCI: isTravisCI, isUndefined: isUndefined, isUpperCase: isUpperCase, isValidJSON: isValidJSON, join: join, last: last, lcm: lcm, longestItem: longestItem, lowercaseKeys: lowercaseKeys, luhnCheck: luhnCheck, mapKeys: mapKeys, mapObject: mapObject, mapValues: mapValues, mask: mask, matches: matches, matchesWith: matchesWith, maxBy: maxBy, maxN: maxN, median: median, memoize: memoize, merge: merge, minBy: minBy, minN: minN, mostPerformant: mostPerformant, negate: negate, none: none, nthArg: nthArg, nthElement: nthElement, objectFromPairs: objectFromPairs, objectToPairs: objectToPairs, observeMutations: observeMutations, off: off, omit: omit, omitBy: omitBy, on: on, onUserInputChange: onUserInputChange, once: once, orderBy: orderBy, over: over, overArgs: overArgs, palindrome: palindrome, parseCookie: parseCookie, partial: partial, partialRight: partialRight, partition: partition, percentile: percentile, pick: pick, pickBy: pickBy, pipeAsyncFunctions: pipeAsyncFunctions, pipeFunctions: pipeFunctions, pluralize: pluralize, powerset: powerset, prettyBytes: prettyBytes, primes: primes, promisify: promisify, pull: pull, pullAtIndex: pullAtIndex, pullAtValue: pullAtValue, pullBy: pullBy, radsToDegrees: radsToDegrees, randomHexColorCode: randomHexColorCode, randomIntArrayInRange: randomIntArrayInRange, randomIntegerInRange: randomIntegerInRange, randomNumberInRange: randomNumberInRange, readFileLines: readFileLines, rearg: rearg, redirect: redirect, reduceSuccessive: reduceSuccessive, reduceWhich: reduceWhich, reducedFilter: reducedFilter, remove: remove, removeNonASCII: removeNonASCII, reverseString: reverseString, round: round, runAsync: runAsync, runPromisesInSeries: runPromisesInSeries, sample: sample, sampleSize: sampleSize, scrollToTop: scrollToTop, sdbm: sdbm, serializeCookie: serializeCookie, setStyle: setStyle, shallowClone: shallowClone, show: show, shuffle: shuffle, similarity: similarity, size: size, sleep: sleep, sortCharactersInString: sortCharactersInString, sortedIndex: sortedIndex, sortedIndexBy: sortedIndexBy, sortedLastIndex: sortedLastIndex, sortedLastIndexBy: sortedLastIndexBy, splitLines: splitLines, spreadOver: spreadOver, stableSort: stableSort, standardDeviation: standardDeviation, stripHTMLTags: stripHTMLTags, sum: sum, sumBy: sumBy, sumPower: sumPower, symmetricDifference: symmetricDifference, symmetricDifferenceBy: symmetricDifferenceBy, symmetricDifferenceWith: symmetricDifferenceWith, tail: tail, take: take, takeRight: takeRight, takeRightWhile: takeRightWhile, takeWhile: takeWhile, throttle: throttle, timeTaken: timeTaken, times: times, toCamelCase: toCamelCase, toCurrency: toCurrency, toDecimalMark: toDecimalMark, toKebabCase: toKebabCase, toOrdinalSuffix: toOrdinalSuffix, toSafeInteger: toSafeInteger, toSnakeCase: toSnakeCase, toggleClass: toggleClass, tomorrow: tomorrow, transform: transform, truncateString: truncateString, truthCheckCollection: truthCheckCollection, unary: unary, uncurry: uncurry, unescapeHTML: unescapeHTML, unflattenObject: unflattenObject, unfold: unfold, union: union, unionBy: unionBy, unionWith: unionWith, uniqueElements: uniqueElements, untildify: untildify, unzip: unzip, unzipWith: unzipWith, validateNumber: validateNumber, without: without, words: words, xProd: xProd, yesNo: yesNo, zip: zip, zipObject: zipObject, zipWith: zipWith };
+var imports = { JSONToFile: JSONToFile, RGBToHex: RGBToHex, URLJoin: URLJoin, UUIDGeneratorBrowser: UUIDGeneratorBrowser, UUIDGeneratorNode: UUIDGeneratorNode, all: all, any: any, approximatelyEqual: approximatelyEqual, arrayToHtmlList: arrayToHtmlList, ary: ary, atob: atob, attempt: attempt, average: average, averageBy: averageBy, bifurcate: bifurcate, bifurcateBy: bifurcateBy, bind: bind, bindAll: bindAll, bindKey: bindKey, binomialCoefficient: binomialCoefficient, bottomVisible: bottomVisible, btoa: btoa, byteSize: byteSize, call: call, capitalize: capitalize, capitalizeEveryWord: capitalizeEveryWord, castArray: castArray, chainAsync: chainAsync, chunk: chunk, clampNumber: clampNumber, cloneRegExp: cloneRegExp, coalesce: coalesce, coalesceFactory: coalesceFactory, collectInto: collectInto, colorize: colorize, compact: compact, compose: compose, composeRight: composeRight, converge: converge, copyToClipboard: copyToClipboard, countBy: countBy, countOccurrences: countOccurrences, createElement: createElement, createEventHub: createEventHub, currentURL: currentURL, curry: curry, debounce: debounce, decapitalize: decapitalize, deepClone: deepClone, deepFlatten: deepFlatten, defaults: defaults, defer: defer, degreesToRads: degreesToRads, delay: delay, detectDeviceType: detectDeviceType, difference: difference, differenceBy: differenceBy, differenceWith: differenceWith, digitize: digitize, distance: distance, drop: drop, dropRight: dropRight, dropRightWhile: dropRightWhile, dropWhile: dropWhile, elementIsVisibleInViewport: elementIsVisibleInViewport, elo: elo, equals: equals, escapeHTML: escapeHTML, escapeRegExp: escapeRegExp, everyNth: everyNth, extendHex: extendHex, factorial: factorial, fibonacci: fibonacci, filterNonUnique: filterNonUnique, findKey: findKey, findLast: findLast, findLastIndex: findLastIndex, findLastKey: findLastKey, flatten: flatten, flattenObject: flattenObject, flip: flip, forEachRight: forEachRight, forOwn: forOwn, forOwnRight: forOwnRight, formatDuration: formatDuration, fromCamelCase: fromCamelCase, functionName: functionName, functions: functions, gcd: gcd, geometricProgression: geometricProgression, get: get, getColonTimeFromDate: getColonTimeFromDate, getDaysDiffBetweenDates: getDaysDiffBetweenDates, getMeridiemSuffixOfInteger: getMeridiemSuffixOfInteger, getScrollPosition: getScrollPosition, getStyle: getStyle, getType: getType, getURLParameters: getURLParameters, groupBy: groupBy, hammingDistance: hammingDistance, hasClass: hasClass, hasFlags: hasFlags, hashBrowser: hashBrowser, hashNode: hashNode, head: head, hexToRGB: hexToRGB, hide: hide, httpGet: httpGet, httpPost: httpPost, httpsRedirect: httpsRedirect, inRange: inRange, indexOfAll: indexOfAll, initial: initial, initialize2DArray: initialize2DArray, initializeArrayWithRange: initializeArrayWithRange, initializeArrayWithRangeRight: initializeArrayWithRangeRight, initializeArrayWithValues: initializeArrayWithValues, intersection: intersection, intersectionBy: intersectionBy, intersectionWith: intersectionWith, invertKeyValues: invertKeyValues, is: is, isAbsoluteURL: isAbsoluteURL, isAnagram: isAnagram, isArrayLike: isArrayLike, isBoolean: isBoolean, isDivisible: isDivisible, isEmpty: isEmpty, isEven: isEven, isFunction: isFunction, isLowerCase: isLowerCase, isNil: isNil, isNull: isNull, isNumber: isNumber, isObject: isObject, isObjectLike: isObjectLike, isPlainObject: isPlainObject, isPrime: isPrime, isPrimitive: isPrimitive, isPromiseLike: isPromiseLike, isSorted: isSorted, isString: isString, isSymbol: isSymbol, isTravisCI: isTravisCI, isUndefined: isUndefined, isUpperCase: isUpperCase, isValidJSON: isValidJSON, join: join, last: last, lcm: lcm, longestItem: longestItem, lowercaseKeys: lowercaseKeys, luhnCheck: luhnCheck, mapKeys: mapKeys, mapObject: mapObject, mapValues: mapValues, mask: mask, matches: matches, matchesWith: matchesWith, maxBy: maxBy, maxN: maxN, median: median, memoize: memoize, merge: merge, minBy: minBy, minN: minN, mostPerformant: mostPerformant, negate: negate, none: none, nthArg: nthArg, nthElement: nthElement, objectFromPairs: objectFromPairs, objectToPairs: objectToPairs, observeMutations: observeMutations, off: off, omit: omit, omitBy: omitBy, on: on, onUserInputChange: onUserInputChange, once: once, orderBy: orderBy, over: over, overArgs: overArgs, palindrome: palindrome, parseCookie: parseCookie, partial: partial, partialRight: partialRight, partition: partition, percentile: percentile, permutations: permutations, pick: pick, pickBy: pickBy, pipeAsyncFunctions: pipeAsyncFunctions, pipeFunctions: pipeFunctions, pluralize: pluralize, powerset: powerset, prettyBytes: prettyBytes, primes: primes, promisify: promisify, pull: pull, pullAtIndex: pullAtIndex, pullAtValue: pullAtValue, pullBy: pullBy, radsToDegrees: radsToDegrees, randomHexColorCode: randomHexColorCode, randomIntArrayInRange: randomIntArrayInRange, randomIntegerInRange: randomIntegerInRange, randomNumberInRange: randomNumberInRange, readFileLines: readFileLines, rearg: rearg, redirect: redirect, reduceSuccessive: reduceSuccessive, reduceWhich: reduceWhich, reducedFilter: reducedFilter, remove: remove, removeNonASCII: removeNonASCII, reverseString: reverseString, round: round, runAsync: runAsync, runPromisesInSeries: runPromisesInSeries, sample: sample, sampleSize: sampleSize, scrollToTop: scrollToTop, sdbm: sdbm, serializeCookie: serializeCookie, setStyle: setStyle, shallowClone: shallowClone, show: show, shuffle: shuffle, similarity: similarity, size: size, sleep: sleep, sortCharactersInString: sortCharactersInString, sortedIndex: sortedIndex, sortedIndexBy: sortedIndexBy, sortedLastIndex: sortedLastIndex, sortedLastIndexBy: sortedLastIndexBy, splitLines: splitLines, spreadOver: spreadOver, stableSort: stableSort, standardDeviation: standardDeviation, stringPermutations: stringPermutations, stripHTMLTags: stripHTMLTags, sum: sum, sumBy: sumBy, sumPower: sumPower, symmetricDifference: symmetricDifference, symmetricDifferenceBy: symmetricDifferenceBy, symmetricDifferenceWith: symmetricDifferenceWith, tail: tail, take: take, takeRight: takeRight, takeRightWhile: takeRightWhile, takeWhile: takeWhile, throttle: throttle, timeTaken: timeTaken, times: times, toCamelCase: toCamelCase, toCurrency: toCurrency, toDecimalMark: toDecimalMark, toKebabCase: toKebabCase, toOrdinalSuffix: toOrdinalSuffix, toSafeInteger: toSafeInteger, toSnakeCase: toSnakeCase, toggleClass: toggleClass, tomorrow: tomorrow, transform: transform, truncateString: truncateString, truthCheckCollection: truthCheckCollection, unary: unary, uncurry: uncurry, unescapeHTML: unescapeHTML, unflattenObject: unflattenObject, unfold: unfold, union: union, unionBy: unionBy, unionWith: unionWith, uniqueElements: uniqueElements, untildify: untildify, unzip: unzip, unzipWith: unzipWith, validateNumber: validateNumber, without: without, words: words, xProd: xProd, yesNo: yesNo, zip: zip, zipObject: zipObject, zipWith: zipWith };
 
 return imports;
 
diff --git a/dist/_30s.es5.min.js b/dist/_30s.es5.min.js
index 8121c7fea..1e206da34 100644
--- a/dist/_30s.es5.min.js
+++ b/dist/_30s.es5.min.js
@@ -1 +1 @@
-(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e._30s=t()})(this,function(){'use strict';function e(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t>e/4).toString(16)})},UUIDGeneratorNode:function(){return'10000000-1000-4000-8000-100000000000'.replace(/[018]/g,function(e){return(e^$.randomBytes(1)[0]&15>>e/4).toString(16)})},all:function(e){var t=1=t.length?2===t.length?[t,t[1]+t[0]]:[t]:t.split('').reduce(function(n,r,l){return n.concat(e(t.slice(0,l)+t.slice(l+1)).map(function(e){return r+e}))},[])},any:function(e){var t=1'})},ary:function(t,r){return function(){for(var n=arguments.length,i=Array(n),l=0;lt||t>e)return 0;if(0===t||t===e)return 1;if(1===t||t===e-1)return e;e-t=(document.documentElement.scrollHeight||document.documentElement.clientHeight)},btoa:function(e){return new Buffer(e,'binary').toString('base64')},byteSize:function(e){return new Blob([e]).size},call:function(e){for(var t=arguments.length,n=Array(1'"]/g,function(e){return{"&":'&',"<":'<',">":'>',"'":''','"':'"'}[e]||e})},escapeRegExp:function(e){return e.replace(/[.*+?^${}()|[\]\\]/g,'\\$&')},everyNth:function(e,t){return e.filter(function(n,e){return e%t==t-1})},extendHex:function(e){return'#'+e.slice(e.startsWith('#')?1:0).split('').map(function(e){return e+e}).join('')},factorial:function e(t){return 0>t?function(){throw new TypeError('Negative numbers are not allowed!')}():1>=t?1:t*e(t-1)},fibonacci:function(e){return Array.from({length:e}).reduce(function(e,t,n){return e.concat(1e&&(e=-e);var t={day:P(e/8.64e7),hour:P(e/3.6e6)%24,minute:P(e/6e4)%60,second:P(e/1e3)%60,millisecond:P(e)%1e3};return Object.entries(t).filter(function(e){return 0!==e[1]}).map(function(e){return e[1]+' '+(1===e[1]?e[0]:e[0]+'s')}).join(', ')},fromCamelCase:function(e){var t=1e?e%12+'am':e%12+'pm'},getScrollPosition:function(){var e=0>>(t?24:16))+', '+((n&(t?16711680:65280))>>>(t?16:8))+', '+((n&(t?65280:255))>>>(t?8:0))+(t?', '+(255&n):'')+')'},hide:function(){for(var e=arguments.length,t=Array(e),n=0;nn&&(n=t),null==n?0<=e&&e=t&&ee[1]?-1:1,r=!0,l=!1;try{for(var o,a=e.entries()[Symbol.iterator]();!(r=(o=a.next()).done);r=!0){var s=o.value,c=re(s,2),d=c[0],i=c[1];if(d===e.length-1)return n;if(0<(i-e[d+1])*n)return 0}}catch(e){l=!0,t=e}finally{try{!r&&a.return&&a.return()}finally{if(l)throw t}}},isString:function(e){return'string'==typeof e},isSymbol:function(e){return'symbol'===('undefined'==typeof e?'undefined':ie(e))},isTravisCI:function(){return'TRAVIS'in process.env&&'CI'in process.env},isUndefined:function(e){return e===void 0},isUpperCase:function(e){return e===e.toUpperCase()},isValidJSON:function(e){try{return JSON.parse(e),!0}catch(t){return!1}},join:function(e){var t=1i-n&&(t='mouse',e(t),document.removeEventListener('mousemove',r)),n=i};document.addEventListener('touchstart',function(){'touch'==t||(t='touch',e(t),document.addEventListener('mousemove',r))})},once:function(e){var t=!1;return function(){if(!t){t=!0;for(var n=arguments.length,r=Array(n),i=0;ic?1:sG(e))return e+(r?' ':'')+i[0];var l=F(P(Math.log10(0>e?-e:e)/3),i.length-1),o=+((0>e?-e:e)/U(1e3,l)).toPrecision(t);return(0>e?'-':'')+o+(r?' ':'')+i[l]},primes:function(e){var t=Array.from({length:e-1}).map(function(e,t){return t+2}),n=P(z(e)),r=Array.from({length:n-1}).map(function(e,t){return t+2});return r.forEach(function(e){return t=t.filter(function(t){return 0!=t%e||t===e})}),t},promisify:function(e){return function(){for(var t=arguments.length,n=Array(t),r=0;re[e.length-1],r=e.findIndex(function(e){return n?t>=e:t<=e});return-1===r?e.length:r},sortedIndexBy:function(e,t,n){var r=n(e[0])>n(e[e.length-1]),i=n(t),l=e.findIndex(function(e){return r?i>=n(e):i<=n(e)});return-1===l?e.length:l},sortedLastIndex:function(e,t){var n=e[0]>e[e.length-1],r=e.map(function(e,t){return[t,e]}).reverse().findIndex(function(e){return n?t<=e[1]:t>=e[1]});return-1===r?0:e.length-r-1},sortedLastIndexBy:function(e,t,n){var r=n(e[0])>n(e[e.length-1]),i=n(t),l=e.map(function(e,t){return[t,n(e)]}).reverse().findIndex(function(e){return r?i<=e[1]:i>=e[1]});return-1===l?0:e.length-l},splitLines:function(e){return e.split(/\r?\n/)},spreadOver:function(e){return function(t){return e.apply(void 0,C(t))}},stableSort:function(e,t){return e.map(function(e,t){return{item:e,index:t}}).sort(function(e,n){return t(e.item,n.item)||e.index-n.index}).map(function(e){var t=e.item;return t})},standardDeviation:function(e){var t=1]*>/g,'')},sum:function(){for(var e=arguments.length,t=Array(e),n=0;n=t&&(e.apply(l,o),i=Date.now())},t-(Date.now()-i))):(e.apply(l,o),i=Date.now(),n=!0)}},timeTaken:function(e){console.time('timeTaken');var t=e();return console.timeEnd('timeTaken'),t},times:function(e,t){for(var n=2t?e.slice(0,3r.length)throw new RangeError('Arguments too few!');return function(e){return function(t){return t.reduce(function(e,t){return e(t)},e)}}(e)(r.slice(0,t))}},unescapeHTML:function(e){return e.replace(/&|<|>|'|"/g,function(e){return{"&":'&',"<":'<',">":'>',"'":'\'',""":'"'}[e]||e})},unflattenObject:function(e){return Object.keys(e).reduce(function(t,n){if(-1!==n.indexOf('.')){var r=n.split('.');Object.assign(t,JSON.parse('{'+r.map(function(e,t){return t===r.length-1?'"'+e+'":':'"'+e+'":{'}).join('')+e[n]+'}'.repeat(r.length)))}else t[n]=e[n];return t},{})},unfold:function(e,t){for(var n=[],r=[null,t];r=e(r[1]);)n.push(r[0]);return n},union:function(e,t){return Array.from(new Set([].concat(w(e),w(t))))},unionBy:function(e,t,n){var r=new Set(e.map(function(e){return n(e)}));return Array.from(new Set([].concat(L(e),L(t.filter(function(e){return!r.has(n(e))})))))},unionWith:function(e,t,n){return Array.from(new Set([].concat(T(e),T(t.filter(function(t){return-1===e.findIndex(function(e){return n(t,e)})})))))},uniqueElements:function(e){return[].concat(B(new Set(e)))},untildify:function(e){return e.replace(/^~($|\/|\\)/,('undefined'!=typeof require&&require('os').homedir())+'$1')},unzip:function(e){return e.reduce(function(e,t){return t.forEach(function(t,n){return e[n].push(t)}),e},Array.from({length:H.apply(Math,R(e.map(function(e){return e.length})))}).map(function(){return[]}))},unzipWith:function(e,t){return e.reduce(function(e,t){return t.forEach(function(t,n){return e[n].push(t)}),e},Array.from({length:H.apply(Math,O(e.map(function(e){return e.length})))}).map(function(){return[]})).map(function(e){return t.apply(void 0,O(e))})},validateNumber:function(e){return!isNaN(parseFloat(e))&&isFinite(e)&&+e==e},without:function(e){for(var t=arguments.length,n=Array(1>e/4).toString(16)})},UUIDGeneratorNode:function(){return'10000000-1000-4000-8000-100000000000'.replace(/[018]/g,function(e){return(e^K.randomBytes(1)[0]&15>>e/4).toString(16)})},all:function(e){var t=1'})},ary:function(t,r){return function(){for(var n=arguments.length,i=Array(n),l=0;lt||t>e)return 0;if(0===t||t===e)return 1;if(1===t||t===e-1)return e;e-t=(document.documentElement.scrollHeight||document.documentElement.clientHeight)},btoa:function(e){return new Buffer(e,'binary').toString('base64')},byteSize:function(e){return new Blob([e]).size},call:function(e){for(var t=arguments.length,n=Array(1'"]/g,function(e){return{"&":'&',"<":'<',">":'>',"'":''','"':'"'}[e]||e})},escapeRegExp:function(e){return e.replace(/[.*+?^${}()|[\]\\]/g,'\\$&')},everyNth:function(e,t){return e.filter(function(n,e){return e%t==t-1})},extendHex:function(e){return'#'+e.slice(e.startsWith('#')?1:0).split('').map(function(e){return e+e}).join('')},factorial:function e(t){return 0>t?function(){throw new TypeError('Negative numbers are not allowed!')}():1>=t?1:t*e(t-1)},fibonacci:function(e){return Array.from({length:e}).reduce(function(e,t,n){return e.concat(1e&&(e=-e);var t={day:U(e/8.64e7),hour:U(e/3.6e6)%24,minute:U(e/6e4)%60,second:U(e/1e3)%60,millisecond:U(e)%1e3};return Object.entries(t).filter(function(e){return 0!==e[1]}).map(function(e){return e[1]+' '+(1===e[1]?e[0]:e[0]+'s')}).join(', ')},fromCamelCase:function(e){var t=1e?e%12+'am':e%12+'pm'},getScrollPosition:function(){var e=0>>(t?24:16))+', '+((n&(t?16711680:65280))>>>(t?16:8))+', '+((n&(t?65280:255))>>>(t?8:0))+(t?', '+(255&n):'')+')'},hide:function(){for(var e=arguments.length,t=Array(e),n=0;nn&&(n=t),null==n?0<=e&&e=t&&ee[1]?-1:1,r=!0,l=!1;try{for(var o,a=e.entries()[Symbol.iterator]();!(r=(o=a.next()).done);r=!0){var s=o.value,c=ie(s,2),d=c[0],i=c[1];if(d===e.length-1)return n;if(0<(i-e[d+1])*n)return 0}}catch(e){l=!0,t=e}finally{try{!r&&a.return&&a.return()}finally{if(l)throw t}}},isString:function(e){return'string'==typeof e},isSymbol:function(e){return'symbol'===('undefined'==typeof e?'undefined':le(e))},isTravisCI:function(){return'TRAVIS'in process.env&&'CI'in process.env},isUndefined:function(e){return e===void 0},isUpperCase:function(e){return e===e.toUpperCase()},isValidJSON:function(e){try{return JSON.parse(e),!0}catch(t){return!1}},join:function(e){var t=1i-n&&(t='mouse',e(t),document.removeEventListener('mousemove',r)),n=i};document.addEventListener('touchstart',function(){'touch'==t||(t='touch',e(t),document.addEventListener('mousemove',r))})},once:function(e){var t=!1;return function(){if(!t){t=!0;for(var n=arguments.length,r=Array(n),i=0;ic?1:sq(e))return e+(r?' ':'')+i[0];var l=H(U(Math.log10(0>e?-e:e)/3),i.length-1),o=+((0>e?-e:e)/W(1e3,l)).toPrecision(t);return(0>e?'-':'')+o+(r?' ':'')+i[l]},primes:function(e){var t=Array.from({length:e-1}).map(function(e,t){return t+2}),n=U(P(e)),r=Array.from({length:n-1}).map(function(e,t){return t+2});return r.forEach(function(e){return t=t.filter(function(t){return 0!=t%e||t===e})}),t},promisify:function(e){return function(){for(var t=arguments.length,n=Array(t),r=0;re[e.length-1],r=e.findIndex(function(e){return n?t>=e:t<=e});return-1===r?e.length:r},sortedIndexBy:function(e,t,n){var r=n(e[0])>n(e[e.length-1]),i=n(t),l=e.findIndex(function(e){return r?i>=n(e):i<=n(e)});return-1===l?e.length:l},sortedLastIndex:function(e,t){var n=e[0]>e[e.length-1],r=e.map(function(e,t){return[t,e]}).reverse().findIndex(function(e){return n?t<=e[1]:t>=e[1]});return-1===r?0:e.length-r-1},sortedLastIndexBy:function(e,t,n){var r=n(e[0])>n(e[e.length-1]),i=n(t),l=e.map(function(e,t){return[t,n(e)]}).reverse().findIndex(function(e){return r?i<=e[1]:i>=e[1]});return-1===l?0:e.length-l},splitLines:function(e){return e.split(/\r?\n/)},spreadOver:function(e){return function(t){return e.apply(void 0,E(t))}},stableSort:function(e,t){return e.map(function(e,t){return{item:e,index:t}}).sort(function(e,n){return t(e.item,n.item)||e.index-n.index}).map(function(e){var t=e.item;return t})},standardDeviation:function(e){var t=1=t.length?2===t.length?[t,t[1]+t[0]]:[t]:t.split('').reduce(function(n,r,l){return n.concat(e(t.slice(0,l)+t.slice(l+1)).map(function(e){return r+e}))},[])},stripHTMLTags:function(e){return e.replace(/<[^>]*>/g,'')},sum:function(){for(var e=arguments.length,t=Array(e),n=0;n=t&&(e.apply(l,o),i=Date.now())},t-(Date.now()-i))):(e.apply(l,o),i=Date.now(),n=!0)}},timeTaken:function(e){console.time('timeTaken');var t=e();return console.timeEnd('timeTaken'),t},times:function(e,t){for(var n=2t?e.slice(0,3r.length)throw new RangeError('Arguments too few!');return function(e){return function(t){return t.reduce(function(e,t){return e(t)},e)}}(e)(r.slice(0,t))}},unescapeHTML:function(e){return e.replace(/&|<|>|'|"/g,function(e){return{"&":'&',"<":'<',">":'>',"'":'\'',""":'"'}[e]||e})},unflattenObject:function(e){return Object.keys(e).reduce(function(t,n){if(-1!==n.indexOf('.')){var r=n.split('.');Object.assign(t,JSON.parse('{'+r.map(function(e,t){return t===r.length-1?'"'+e+'":':'"'+e+'":{'}).join('')+e[n]+'}'.repeat(r.length)))}else t[n]=e[n];return t},{})},unfold:function(e,t){for(var n=[],r=[null,t];r=e(r[1]);)n.push(r[0]);return n},union:function(e,t){return Array.from(new Set([].concat(w(e),w(t))))},unionBy:function(e,t,n){var r=new Set(e.map(function(e){return n(e)}));return Array.from(new Set([].concat(T(e),T(t.filter(function(e){return!r.has(n(e))})))))},unionWith:function(e,t,n){return Array.from(new Set([].concat(B(e),B(t.filter(function(t){return-1===e.findIndex(function(e){return n(t,e)})})))))},uniqueElements:function(e){return[].concat(R(new Set(e)))},untildify:function(e){return e.replace(/^~($|\/|\\)/,('undefined'!=typeof require&&require('os').homedir())+'$1')},unzip:function(e){return e.reduce(function(e,t){return t.forEach(function(t,n){return e[n].push(t)}),e},Array.from({length:M.apply(Math,O(e.map(function(e){return e.length})))}).map(function(){return[]}))},unzipWith:function(e,t){return e.reduce(function(e,t){return t.forEach(function(t,n){return e[n].push(t)}),e},Array.from({length:M.apply(Math,N(e.map(function(e){return e.length})))}).map(function(){return[]})).map(function(e){return t.apply(void 0,N(e))})},validateNumber:function(e){return!isNaN(parseFloat(e))&&isFinite(e)&&+e==e},without:function(e){for(var t=arguments.length,n=Array(1
 
 const all = (arr, fn = Boolean) => arr.every(fn);
 
-const anagrams = str => {
-  if (str.length <= 2) return str.length === 2 ? [str, str[1] + str[0]] : [str];
-  return str
-    .split('')
-    .reduce(
-      (acc, letter, i) =>
-        acc.concat(anagrams(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)),
-      []
-    );
-};
-
 const any = (arr, fn = Boolean) => arr.some(fn);
 
 const approximatelyEqual = (v1, v2, epsilon = 0.001) => Math.abs(v1 - v2) < epsilon;
@@ -607,6 +596,17 @@ const is = (type, val) => val instanceof type;
 
 const isAbsoluteURL = str => /^[a-z][a-z0-9+.-]*:/.test(str);
 
+const isAnagram = (str1, str2) => {
+  const normalize = str =>
+    str
+      .toLowerCase()
+      .replace(/[^a-z0-9]/gi, '')
+      .split('')
+      .sort()
+      .join('');
+  return normalize(str1) === normalize(str2);
+};
+
 const isArrayLike = val => {
   try {
     return [...val], true;
@@ -910,6 +910,17 @@ const partition = (arr, fn) =>
 const percentile = (arr, val) =>
   100 * arr.reduce((acc, v) => acc + (v < val ? 1 : 0) + (v === val ? 0.5 : 0), 0) / arr.length;
 
+const permutations = arr => {
+  if (arr.length <= 2) return arr.length === 2 ? [arr, [arr[1], arr[0]]] : arr;
+  return arr.reduce(
+    (acc, item, i) =>
+      acc.concat(
+        permutations([...arr.slice(0, i), ...arr.slice(i + 1)]).map(val => [item, ...val])
+      ),
+    []
+  );
+};
+
 const pick = (obj, arr) =>
   arr.reduce((acc, curr) => (curr in obj && (acc[curr] = obj[curr]), acc), {});
 
@@ -1174,6 +1185,17 @@ const standardDeviation = (arr, usePopulation = false) => {
   );
 };
 
+const stringPermutations = str => {
+  if (str.length <= 2) return str.length === 2 ? [str, str[1] + str[0]] : [str];
+  return str
+    .split('')
+    .reduce(
+      (acc, letter, i) =>
+        acc.concat(stringPermutations(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)),
+      []
+    );
+};
+
 const stripHTMLTags = str => str.replace(/<[^>]*>/g, '');
 
 const sum = (...arr) => [...arr].reduce((acc, val) => acc + val, 0);
@@ -1423,6 +1445,6 @@ const zipWith = (...arrays) => {
   return fn ? result.map(arr => fn(...arr)) : result;
 };
 
-var imports = {JSONToFile,RGBToHex,URLJoin,UUIDGeneratorBrowser,UUIDGeneratorNode,all,anagrams,any,approximatelyEqual,arrayToHtmlList,ary,atob,attempt,average,averageBy,bifurcate,bifurcateBy,bind,bindAll,bindKey,binomialCoefficient,bottomVisible,btoa,byteSize,call,capitalize,capitalizeEveryWord,castArray,chainAsync,chunk,clampNumber,cloneRegExp,coalesce,coalesceFactory,collectInto,colorize,compact,compose,composeRight,converge,copyToClipboard,countBy,countOccurrences,createElement,createEventHub,currentURL,curry,debounce,decapitalize,deepClone,deepFlatten,defaults,defer,degreesToRads,delay,detectDeviceType,difference,differenceBy,differenceWith,digitize,distance,drop,dropRight,dropRightWhile,dropWhile,elementIsVisibleInViewport,elo,equals,escapeHTML,escapeRegExp,everyNth,extendHex,factorial,fibonacci,filterNonUnique,findKey,findLast,findLastIndex,findLastKey,flatten,flattenObject,flip,forEachRight,forOwn,forOwnRight,formatDuration,fromCamelCase,functionName,functions,gcd,geometricProgression,get,getColonTimeFromDate,getDaysDiffBetweenDates,getMeridiemSuffixOfInteger,getScrollPosition,getStyle,getType,getURLParameters,groupBy,hammingDistance,hasClass,hasFlags,hashBrowser,hashNode,head,hexToRGB,hide,httpGet,httpPost,httpsRedirect,inRange,indexOfAll,initial,initialize2DArray,initializeArrayWithRange,initializeArrayWithRangeRight,initializeArrayWithValues,intersection,intersectionBy,intersectionWith,invertKeyValues,is,isAbsoluteURL,isArrayLike,isBoolean,isDivisible,isEmpty,isEven,isFunction,isLowerCase,isNil,isNull,isNumber,isObject,isObjectLike,isPlainObject,isPrime,isPrimitive,isPromiseLike,isSorted,isString,isSymbol,isTravisCI,isUndefined,isUpperCase,isValidJSON,join,last,lcm,longestItem,lowercaseKeys,luhnCheck,mapKeys,mapObject,mapValues,mask,matches,matchesWith,maxBy,maxN,median,memoize,merge,minBy,minN,mostPerformant,negate,none,nthArg,nthElement,objectFromPairs,objectToPairs,observeMutations,off,omit,omitBy,on,onUserInputChange,once,orderBy,over,overArgs,palindrome,parseCookie,partial,partialRight,partition,percentile,pick,pickBy,pipeAsyncFunctions,pipeFunctions,pluralize,powerset,prettyBytes,primes,promisify,pull,pullAtIndex,pullAtValue,pullBy,radsToDegrees,randomHexColorCode,randomIntArrayInRange,randomIntegerInRange,randomNumberInRange,readFileLines,rearg,redirect,reduceSuccessive,reduceWhich,reducedFilter,remove,removeNonASCII,reverseString,round,runAsync,runPromisesInSeries,sample,sampleSize,scrollToTop,sdbm,serializeCookie,setStyle,shallowClone,show,shuffle,similarity,size,sleep,sortCharactersInString,sortedIndex,sortedIndexBy,sortedLastIndex,sortedLastIndexBy,splitLines,spreadOver,stableSort,standardDeviation,stripHTMLTags,sum,sumBy,sumPower,symmetricDifference,symmetricDifferenceBy,symmetricDifferenceWith,tail,take,takeRight,takeRightWhile,takeWhile,throttle,timeTaken,times,toCamelCase,toCurrency,toDecimalMark,toKebabCase,toOrdinalSuffix,toSafeInteger,toSnakeCase,toggleClass,tomorrow,transform,truncateString,truthCheckCollection,unary,uncurry,unescapeHTML,unflattenObject,unfold,union,unionBy,unionWith,uniqueElements,untildify,unzip,unzipWith,validateNumber,without,words,xProd,yesNo,zip,zipObject,zipWith,}
+var imports = {JSONToFile,RGBToHex,URLJoin,UUIDGeneratorBrowser,UUIDGeneratorNode,all,any,approximatelyEqual,arrayToHtmlList,ary,atob,attempt,average,averageBy,bifurcate,bifurcateBy,bind,bindAll,bindKey,binomialCoefficient,bottomVisible,btoa,byteSize,call,capitalize,capitalizeEveryWord,castArray,chainAsync,chunk,clampNumber,cloneRegExp,coalesce,coalesceFactory,collectInto,colorize,compact,compose,composeRight,converge,copyToClipboard,countBy,countOccurrences,createElement,createEventHub,currentURL,curry,debounce,decapitalize,deepClone,deepFlatten,defaults,defer,degreesToRads,delay,detectDeviceType,difference,differenceBy,differenceWith,digitize,distance,drop,dropRight,dropRightWhile,dropWhile,elementIsVisibleInViewport,elo,equals,escapeHTML,escapeRegExp,everyNth,extendHex,factorial,fibonacci,filterNonUnique,findKey,findLast,findLastIndex,findLastKey,flatten,flattenObject,flip,forEachRight,forOwn,forOwnRight,formatDuration,fromCamelCase,functionName,functions,gcd,geometricProgression,get,getColonTimeFromDate,getDaysDiffBetweenDates,getMeridiemSuffixOfInteger,getScrollPosition,getStyle,getType,getURLParameters,groupBy,hammingDistance,hasClass,hasFlags,hashBrowser,hashNode,head,hexToRGB,hide,httpGet,httpPost,httpsRedirect,inRange,indexOfAll,initial,initialize2DArray,initializeArrayWithRange,initializeArrayWithRangeRight,initializeArrayWithValues,intersection,intersectionBy,intersectionWith,invertKeyValues,is,isAbsoluteURL,isAnagram,isArrayLike,isBoolean,isDivisible,isEmpty,isEven,isFunction,isLowerCase,isNil,isNull,isNumber,isObject,isObjectLike,isPlainObject,isPrime,isPrimitive,isPromiseLike,isSorted,isString,isSymbol,isTravisCI,isUndefined,isUpperCase,isValidJSON,join,last,lcm,longestItem,lowercaseKeys,luhnCheck,mapKeys,mapObject,mapValues,mask,matches,matchesWith,maxBy,maxN,median,memoize,merge,minBy,minN,mostPerformant,negate,none,nthArg,nthElement,objectFromPairs,objectToPairs,observeMutations,off,omit,omitBy,on,onUserInputChange,once,orderBy,over,overArgs,palindrome,parseCookie,partial,partialRight,partition,percentile,permutations,pick,pickBy,pipeAsyncFunctions,pipeFunctions,pluralize,powerset,prettyBytes,primes,promisify,pull,pullAtIndex,pullAtValue,pullBy,radsToDegrees,randomHexColorCode,randomIntArrayInRange,randomIntegerInRange,randomNumberInRange,readFileLines,rearg,redirect,reduceSuccessive,reduceWhich,reducedFilter,remove,removeNonASCII,reverseString,round,runAsync,runPromisesInSeries,sample,sampleSize,scrollToTop,sdbm,serializeCookie,setStyle,shallowClone,show,shuffle,similarity,size,sleep,sortCharactersInString,sortedIndex,sortedIndexBy,sortedLastIndex,sortedLastIndexBy,splitLines,spreadOver,stableSort,standardDeviation,stringPermutations,stripHTMLTags,sum,sumBy,sumPower,symmetricDifference,symmetricDifferenceBy,symmetricDifferenceWith,tail,take,takeRight,takeRightWhile,takeWhile,throttle,timeTaken,times,toCamelCase,toCurrency,toDecimalMark,toKebabCase,toOrdinalSuffix,toSafeInteger,toSnakeCase,toggleClass,tomorrow,transform,truncateString,truthCheckCollection,unary,uncurry,unescapeHTML,unflattenObject,unfold,union,unionBy,unionWith,uniqueElements,untildify,unzip,unzipWith,validateNumber,without,words,xProd,yesNo,zip,zipObject,zipWith,}
 
 export default imports;
diff --git a/dist/_30s.js b/dist/_30s.js
index b57412c38..5631a8425 100644
--- a/dist/_30s.js
+++ b/dist/_30s.js
@@ -33,17 +33,6 @@ const UUIDGeneratorNode = () =>
 
 const all = (arr, fn = Boolean) => arr.every(fn);
 
-const anagrams = str => {
-  if (str.length <= 2) return str.length === 2 ? [str, str[1] + str[0]] : [str];
-  return str
-    .split('')
-    .reduce(
-      (acc, letter, i) =>
-        acc.concat(anagrams(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)),
-      []
-    );
-};
-
 const any = (arr, fn = Boolean) => arr.some(fn);
 
 const approximatelyEqual = (v1, v2, epsilon = 0.001) => Math.abs(v1 - v2) < epsilon;
@@ -613,6 +602,17 @@ const is = (type, val) => val instanceof type;
 
 const isAbsoluteURL = str => /^[a-z][a-z0-9+.-]*:/.test(str);
 
+const isAnagram = (str1, str2) => {
+  const normalize = str =>
+    str
+      .toLowerCase()
+      .replace(/[^a-z0-9]/gi, '')
+      .split('')
+      .sort()
+      .join('');
+  return normalize(str1) === normalize(str2);
+};
+
 const isArrayLike = val => {
   try {
     return [...val], true;
@@ -916,6 +916,17 @@ const partition = (arr, fn) =>
 const percentile = (arr, val) =>
   100 * arr.reduce((acc, v) => acc + (v < val ? 1 : 0) + (v === val ? 0.5 : 0), 0) / arr.length;
 
+const permutations = arr => {
+  if (arr.length <= 2) return arr.length === 2 ? [arr, [arr[1], arr[0]]] : arr;
+  return arr.reduce(
+    (acc, item, i) =>
+      acc.concat(
+        permutations([...arr.slice(0, i), ...arr.slice(i + 1)]).map(val => [item, ...val])
+      ),
+    []
+  );
+};
+
 const pick = (obj, arr) =>
   arr.reduce((acc, curr) => (curr in obj && (acc[curr] = obj[curr]), acc), {});
 
@@ -1180,6 +1191,17 @@ const standardDeviation = (arr, usePopulation = false) => {
   );
 };
 
+const stringPermutations = str => {
+  if (str.length <= 2) return str.length === 2 ? [str, str[1] + str[0]] : [str];
+  return str
+    .split('')
+    .reduce(
+      (acc, letter, i) =>
+        acc.concat(stringPermutations(str.slice(0, i) + str.slice(i + 1)).map(val => letter + val)),
+      []
+    );
+};
+
 const stripHTMLTags = str => str.replace(/<[^>]*>/g, '');
 
 const sum = (...arr) => [...arr].reduce((acc, val) => acc + val, 0);
@@ -1429,7 +1451,7 @@ const zipWith = (...arrays) => {
   return fn ? result.map(arr => fn(...arr)) : result;
 };
 
-var imports = {JSONToFile,RGBToHex,URLJoin,UUIDGeneratorBrowser,UUIDGeneratorNode,all,anagrams,any,approximatelyEqual,arrayToHtmlList,ary,atob,attempt,average,averageBy,bifurcate,bifurcateBy,bind,bindAll,bindKey,binomialCoefficient,bottomVisible,btoa,byteSize,call,capitalize,capitalizeEveryWord,castArray,chainAsync,chunk,clampNumber,cloneRegExp,coalesce,coalesceFactory,collectInto,colorize,compact,compose,composeRight,converge,copyToClipboard,countBy,countOccurrences,createElement,createEventHub,currentURL,curry,debounce,decapitalize,deepClone,deepFlatten,defaults,defer,degreesToRads,delay,detectDeviceType,difference,differenceBy,differenceWith,digitize,distance,drop,dropRight,dropRightWhile,dropWhile,elementIsVisibleInViewport,elo,equals,escapeHTML,escapeRegExp,everyNth,extendHex,factorial,fibonacci,filterNonUnique,findKey,findLast,findLastIndex,findLastKey,flatten,flattenObject,flip,forEachRight,forOwn,forOwnRight,formatDuration,fromCamelCase,functionName,functions,gcd,geometricProgression,get,getColonTimeFromDate,getDaysDiffBetweenDates,getMeridiemSuffixOfInteger,getScrollPosition,getStyle,getType,getURLParameters,groupBy,hammingDistance,hasClass,hasFlags,hashBrowser,hashNode,head,hexToRGB,hide,httpGet,httpPost,httpsRedirect,inRange,indexOfAll,initial,initialize2DArray,initializeArrayWithRange,initializeArrayWithRangeRight,initializeArrayWithValues,intersection,intersectionBy,intersectionWith,invertKeyValues,is,isAbsoluteURL,isArrayLike,isBoolean,isDivisible,isEmpty,isEven,isFunction,isLowerCase,isNil,isNull,isNumber,isObject,isObjectLike,isPlainObject,isPrime,isPrimitive,isPromiseLike,isSorted,isString,isSymbol,isTravisCI,isUndefined,isUpperCase,isValidJSON,join,last,lcm,longestItem,lowercaseKeys,luhnCheck,mapKeys,mapObject,mapValues,mask,matches,matchesWith,maxBy,maxN,median,memoize,merge,minBy,minN,mostPerformant,negate,none,nthArg,nthElement,objectFromPairs,objectToPairs,observeMutations,off,omit,omitBy,on,onUserInputChange,once,orderBy,over,overArgs,palindrome,parseCookie,partial,partialRight,partition,percentile,pick,pickBy,pipeAsyncFunctions,pipeFunctions,pluralize,powerset,prettyBytes,primes,promisify,pull,pullAtIndex,pullAtValue,pullBy,radsToDegrees,randomHexColorCode,randomIntArrayInRange,randomIntegerInRange,randomNumberInRange,readFileLines,rearg,redirect,reduceSuccessive,reduceWhich,reducedFilter,remove,removeNonASCII,reverseString,round,runAsync,runPromisesInSeries,sample,sampleSize,scrollToTop,sdbm,serializeCookie,setStyle,shallowClone,show,shuffle,similarity,size,sleep,sortCharactersInString,sortedIndex,sortedIndexBy,sortedLastIndex,sortedLastIndexBy,splitLines,spreadOver,stableSort,standardDeviation,stripHTMLTags,sum,sumBy,sumPower,symmetricDifference,symmetricDifferenceBy,symmetricDifferenceWith,tail,take,takeRight,takeRightWhile,takeWhile,throttle,timeTaken,times,toCamelCase,toCurrency,toDecimalMark,toKebabCase,toOrdinalSuffix,toSafeInteger,toSnakeCase,toggleClass,tomorrow,transform,truncateString,truthCheckCollection,unary,uncurry,unescapeHTML,unflattenObject,unfold,union,unionBy,unionWith,uniqueElements,untildify,unzip,unzipWith,validateNumber,without,words,xProd,yesNo,zip,zipObject,zipWith,}
+var imports = {JSONToFile,RGBToHex,URLJoin,UUIDGeneratorBrowser,UUIDGeneratorNode,all,any,approximatelyEqual,arrayToHtmlList,ary,atob,attempt,average,averageBy,bifurcate,bifurcateBy,bind,bindAll,bindKey,binomialCoefficient,bottomVisible,btoa,byteSize,call,capitalize,capitalizeEveryWord,castArray,chainAsync,chunk,clampNumber,cloneRegExp,coalesce,coalesceFactory,collectInto,colorize,compact,compose,composeRight,converge,copyToClipboard,countBy,countOccurrences,createElement,createEventHub,currentURL,curry,debounce,decapitalize,deepClone,deepFlatten,defaults,defer,degreesToRads,delay,detectDeviceType,difference,differenceBy,differenceWith,digitize,distance,drop,dropRight,dropRightWhile,dropWhile,elementIsVisibleInViewport,elo,equals,escapeHTML,escapeRegExp,everyNth,extendHex,factorial,fibonacci,filterNonUnique,findKey,findLast,findLastIndex,findLastKey,flatten,flattenObject,flip,forEachRight,forOwn,forOwnRight,formatDuration,fromCamelCase,functionName,functions,gcd,geometricProgression,get,getColonTimeFromDate,getDaysDiffBetweenDates,getMeridiemSuffixOfInteger,getScrollPosition,getStyle,getType,getURLParameters,groupBy,hammingDistance,hasClass,hasFlags,hashBrowser,hashNode,head,hexToRGB,hide,httpGet,httpPost,httpsRedirect,inRange,indexOfAll,initial,initialize2DArray,initializeArrayWithRange,initializeArrayWithRangeRight,initializeArrayWithValues,intersection,intersectionBy,intersectionWith,invertKeyValues,is,isAbsoluteURL,isAnagram,isArrayLike,isBoolean,isDivisible,isEmpty,isEven,isFunction,isLowerCase,isNil,isNull,isNumber,isObject,isObjectLike,isPlainObject,isPrime,isPrimitive,isPromiseLike,isSorted,isString,isSymbol,isTravisCI,isUndefined,isUpperCase,isValidJSON,join,last,lcm,longestItem,lowercaseKeys,luhnCheck,mapKeys,mapObject,mapValues,mask,matches,matchesWith,maxBy,maxN,median,memoize,merge,minBy,minN,mostPerformant,negate,none,nthArg,nthElement,objectFromPairs,objectToPairs,observeMutations,off,omit,omitBy,on,onUserInputChange,once,orderBy,over,overArgs,palindrome,parseCookie,partial,partialRight,partition,percentile,permutations,pick,pickBy,pipeAsyncFunctions,pipeFunctions,pluralize,powerset,prettyBytes,primes,promisify,pull,pullAtIndex,pullAtValue,pullBy,radsToDegrees,randomHexColorCode,randomIntArrayInRange,randomIntegerInRange,randomNumberInRange,readFileLines,rearg,redirect,reduceSuccessive,reduceWhich,reducedFilter,remove,removeNonASCII,reverseString,round,runAsync,runPromisesInSeries,sample,sampleSize,scrollToTop,sdbm,serializeCookie,setStyle,shallowClone,show,shuffle,similarity,size,sleep,sortCharactersInString,sortedIndex,sortedIndexBy,sortedLastIndex,sortedLastIndexBy,splitLines,spreadOver,stableSort,standardDeviation,stringPermutations,stripHTMLTags,sum,sumBy,sumPower,symmetricDifference,symmetricDifferenceBy,symmetricDifferenceWith,tail,take,takeRight,takeRightWhile,takeWhile,throttle,timeTaken,times,toCamelCase,toCurrency,toDecimalMark,toKebabCase,toOrdinalSuffix,toSafeInteger,toSnakeCase,toggleClass,tomorrow,transform,truncateString,truthCheckCollection,unary,uncurry,unescapeHTML,unflattenObject,unfold,union,unionBy,unionWith,uniqueElements,untildify,unzip,unzipWith,validateNumber,without,words,xProd,yesNo,zip,zipObject,zipWith,}
 
 return imports;
 
diff --git a/dist/_30s.min.js b/dist/_30s.min.js
index acdc95069..958823a81 100644
--- a/dist/_30s.min.js
+++ b/dist/_30s.min.js
@@ -1 +1 @@
-(function(a,b){'object'==typeof exports&&'undefined'!=typeof module?module.exports=b():'function'==typeof define&&define.amd?define(b):a._30s=b()})(this,function(){'use strict';var a=Math.sqrt,b=Math.log,c=Math.floor,d=Math.PI,e=Math.min,g=Math.max,h=Math.ceil,i=Math.round,j=Math.abs;const k='undefined'!=typeof require&&require('fs'),l='undefined'!=typeof require&&require('crypto'),m=(a)=>2>=a.length?2===a.length?[a,a[1]+a[0]]:[a]:a.split('').reduce((b,c,d)=>b.concat(m(a.slice(0,d)+a.slice(d+1)).map((a)=>c+a)),[]),n=(a,b=a.length,...c)=>b<=c.length?a(...c):n.bind(null,a,b,...c),o=(a)=>{let b=Object.assign({},a);return Object.keys(b).forEach((c)=>b[c]='object'==typeof a[c]?o(a[c]):a[c]),b},p=(a)=>[].concat(...a.map((a)=>Array.isArray(a)?p(a):a)),q=([...c],d=32,e)=>{const[g,a]=c,b=(a,b)=>1/(1+10**((b-a)/400)),h=(c,h)=>(e||c)+d*(h-b(h?g:a,h?a:g));if(2===c.length)return[h(g,1),h(a,0)];for(let a,b=0;b{if(c===d)return!0;if(c instanceof Date&&d instanceof Date)return c.getTime()===d.getTime();if(!c||!d||'object'!=typeof c&&'object'!=typeof d)return c===d;if(null===c||void 0===c||null===d||void 0===d)return!1;if(c.prototype!==d.prototype)return!1;let e=Object.keys(c);return!(e.length!==Object.keys(d).length)&&e.every((a)=>r(c[a],d[a]))},s=(a)=>0>a?(()=>{throw new TypeError('Negative numbers are not allowed!')})():1>=a?1:a*s(a-1),t=(a,b=1)=>1===b?a.reduce((b,a)=>b.concat(a),[]):a.reduce((c,a)=>c.concat(Array.isArray(a)?t(a,b-1):a),[]),u=(a,b='')=>Object.keys(a).reduce((c,d)=>{const e=b.length?b+'.':'';return'object'==typeof a[d]?Object.assign(c,u(a[d],e+d)):c[e+d]=a[d],c},{}),v=(...a)=>{const c=(a,b)=>b?v(b,a%b):a;return[...a].reduce((d,a)=>c(d,a))},w='undefined'!=typeof require&&require('crypto'),x='undefined'!=typeof require&&require('fs'),y=()=>{const a=document.documentElement.scrollTop||document.body.scrollTop;0k.writeFile(`${b}.json`,JSON.stringify(a,null,2)),RGBToHex:(a,c,d)=>((a<<16)+(c<<8)+d).toString(16).padStart(6,'0'),URLJoin:(...a)=>a.join('/').replace(/[\/]+/g,'/').replace(/^(.+):\//,'$1://').replace(/^file:/,'file:/').replace(/\/(\?|&|#[^!])/g,'$1').replace(/\?/g,'&').replace('&','?'),UUIDGeneratorBrowser:()=>'10000000-1000-4000-8000-100000000000'.replace(/[018]/g,(a)=>(a^crypto.getRandomValues(new Uint8Array(1))[0]&15>>a/4).toString(16)),UUIDGeneratorNode:()=>'10000000-1000-4000-8000-100000000000'.replace(/[018]/g,(a)=>(a^l.randomBytes(1)[0]&15>>a/4).toString(16)),all:(a,b=Boolean)=>a.every(b),anagrams:m,any:(a,b=Boolean)=>a.some(b),approximatelyEqual:(a,b,c=1e-3)=>j(a-b)a.map((a)=>document.querySelector('#'+b).innerHTML+=`
  • ${a}
  • `),ary:(a,b)=>(...c)=>a(...c.slice(0,b)),atob:(a)=>new Buffer(a,'base64').toString('binary'),attempt:(a,...b)=>{try{return a(b)}catch(a){return a instanceof Error?a:new Error(a)}},average:(...a)=>[...a].reduce((a,b)=>a+b,0)/a.length,averageBy:(a,b)=>a.map('function'==typeof b?b:(a)=>a[b]).reduce((a,b)=>a+b,0)/a.length,bifurcate:(a,b)=>a.reduce((a,c,d)=>(a[b[d]?0:1].push(c),a),[[],[]]),bifurcateBy:(a,b)=>a.reduce((a,c,d)=>(a[b(c,d)?0:1].push(c),a),[[],[]]),bind:(a,b,...c)=>function(){return a.apply(b,c.concat(...arguments))},bindAll:(a,...b)=>b.forEach((b)=>(f=a[b],a[b]=function(){return f.apply(a)})),bindKey:(a,b,...c)=>function(){return a[b].apply(a,c.concat(...arguments))},binomialCoefficient:(a,b)=>{var c=Number.isNaN;if(c(a)||c(b))return NaN;if(0>b||b>a)return 0;if(0===b||b===a)return 1;if(1===b||b===a-1)return a;a-bdocument.documentElement.clientHeight+window.scrollY>=(document.documentElement.scrollHeight||document.documentElement.clientHeight),btoa:(a)=>new Buffer(a,'binary').toString('base64'),byteSize:(a)=>new Blob([a]).size,call:(a,...b)=>(c)=>c[a](...b),capitalize:([a,...b],c=!1)=>a.toUpperCase()+(c?b.join('').toLowerCase():b.join('')),capitalizeEveryWord:(a)=>a.replace(/\b[a-z]/g,(a)=>a.toUpperCase()),castArray:(a)=>Array.isArray(a)?a:[a],chainAsync:(a)=>{let b=0;const c=()=>a[b++](c);c()},chunk:(a,b)=>Array.from({length:h(a.length/b)},(c,d)=>a.slice(d*b,d*b+b)),clampNumber:(c,d,a)=>g(e(c,g(d,a)),e(d,a)),cloneRegExp:(a)=>new RegExp(a.source,a.flags),coalesce:(...a)=>a.find((a)=>![void 0,null].includes(a)),coalesceFactory:(a)=>(...b)=>b.find(a),collectInto:(a)=>(...b)=>a(b),colorize:(...a)=>({black:`\x1b[30m${a.join(' ')}`,red:`\x1b[31m${a.join(' ')}`,green:`\x1b[32m${a.join(' ')}`,yellow:`\x1b[33m${a.join(' ')}`,blue:`\x1b[34m${a.join(' ')}`,magenta:`\x1b[35m${a.join(' ')}`,cyan:`\x1b[36m${a.join(' ')}`,white:`\x1b[37m${a.join(' ')}`,bgBlack:`\x1b[40m${a.join(' ')}\x1b[0m`,bgRed:`\x1b[41m${a.join(' ')}\x1b[0m`,bgGreen:`\x1b[42m${a.join(' ')}\x1b[0m`,bgYellow:`\x1b[43m${a.join(' ')}\x1b[0m`,bgBlue:`\x1b[44m${a.join(' ')}\x1b[0m`,bgMagenta:`\x1b[45m${a.join(' ')}\x1b[0m`,bgCyan:`\x1b[46m${a.join(' ')}\x1b[0m`,bgWhite:`\x1b[47m${a.join(' ')}\x1b[0m`}),compact:(a)=>a.filter(Boolean),compose:(...a)=>a.reduce((a,b)=>(...c)=>a(b(...c))),composeRight:(...a)=>a.reduce((a,b)=>(...c)=>b(a(...c))),converge:(a,b)=>(...c)=>a(...b.map((a)=>a.apply(null,c))),copyToClipboard:(a)=>{const b=document.createElement('textarea');b.value=a,b.setAttribute('readonly',''),b.style.position='absolute',b.style.left='-9999px',document.body.appendChild(b);const c=!!(0a.map('function'==typeof b?b:(a)=>a[b]).reduce((a,b)=>(a[b]=(a[b]||0)+1,a),{}),countOccurrences:(a,b)=>a.reduce((c,a)=>a===b?c+1:c+0,0),createElement:(a)=>{const b=document.createElement('div');return b.innerHTML=a,b.firstElementChild},createEventHub:()=>({hub:Object.create(null),emit(a,b){(this.hub[a]||[]).forEach((a)=>a(b))},on(a,b){this.hub[a]||(this.hub[a]=[]),this.hub[a].push(b)},off(a,b){const c=(this.hub[a]||[]).findIndex((a)=>a===b);-1window.location.href,curry:n,debounce:(a,b=0)=>{let c;return function(...d){clearTimeout(c),c=setTimeout(()=>a.apply(this,d),b)}},decapitalize:([a,...b],c=!1)=>a.toLowerCase()+(c?b.join('').toUpperCase():b.join('')),deepClone:o,deepFlatten:p,defaults:(a,...b)=>Object.assign({},a,...b.reverse(),a),defer:(a,...b)=>setTimeout(a,1,...b),degreesToRads:(a)=>a*d/180,delay:(a,b,...c)=>setTimeout(a,b,...c),detectDeviceType:()=>/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)?'Mobile':'Desktop',difference:(c,a)=>{const b=new Set(a);return c.filter((a)=>!b.has(a))},differenceBy:(c,a,b)=>{const d=new Set(a.map((a)=>b(a)));return c.filter((a)=>!d.has(b(a)))},differenceWith:(a,b,c)=>a.filter((d)=>-1===b.findIndex((a)=>c(d,a))),digitize:(a)=>[...`${a}`].map((a)=>parseInt(a)),distance:(a,b,c,d)=>Math.hypot(c-a,d-b),drop:(a,b=1)=>a.slice(b),dropRight:(a,b=1)=>a.slice(0,-b),dropRightWhile:(a,b)=>{for(;0{for(;0{const{top:c,left:d,bottom:e,right:g}=a.getBoundingClientRect(),{innerHeight:h,innerWidth:i}=window;return b?(0a.replace(/[&<>'"]/g,(a)=>({"&":'&',"<":'<',">":'>',"'":''','"':'"'})[a]||a),escapeRegExp:(a)=>a.replace(/[.*+?^${}()|[\]\\]/g,'\\$&'),everyNth:(a,b)=>a.filter((a,c)=>c%b==b-1),extendHex:(a)=>'#'+a.slice(a.startsWith('#')?1:0).split('').map((a)=>a+a).join(''),factorial:s,fibonacci:(a)=>Array.from({length:a}).reduce((a,b,c)=>a.concat(1a.filter((b)=>a.indexOf(b)===a.lastIndexOf(b)),findKey:(a,b)=>Object.keys(a).find((c)=>b(a[c],c,a)),findLast:(a,b)=>a.filter(b).slice(-1)[0],findLastIndex:(a,b)=>a.map((a,b)=>[b,a]).filter((c)=>b(c[1],c[0],a)).slice(-1)[0][0],findLastKey:(a,b)=>Object.keys(a).reverse().find((c)=>b(a[c],c,a)),flatten:t,flattenObject:u,flip:(a)=>(b,...c)=>a(...c,b),forEachRight:(a,b)=>a.slice(0).reverse().forEach(b),forOwn:(a,b)=>Object.keys(a).forEach((c)=>b(a[c],c,a)),forOwnRight:(a,b)=>Object.keys(a).reverse().forEach((c)=>b(a[c],c,a)),formatDuration:(a)=>{0>a&&(a=-a);const b={day:c(a/8.64e7),hour:c(a/3.6e6)%24,minute:c(a/6e4)%60,second:c(a/1e3)%60,millisecond:c(a)%1e3};return Object.entries(b).filter((a)=>0!==a[1]).map((a)=>a[1]+' '+(1===a[1]?a[0]:a[0]+'s')).join(', ')},fromCamelCase:(a,b='_')=>a.replace(/([a-z\d])([A-Z])/g,'$1'+b+'$2').replace(/([A-Z]+)([A-Z][a-z\d]+)/g,'$1'+b+'$2').toLowerCase(),functionName:(a)=>(console.debug(a.name),a),functions:(a,b=!1)=>(b?[...Object.keys(a),...Object.keys(Object.getPrototypeOf(a))]:Object.keys(a)).filter((b)=>'function'==typeof a[b]),gcd:v,geometricProgression:(a,d=1,e=2)=>Array.from({length:c(b(a/d)/b(e))+1}).map((a,b)=>d*e**b),get:(a,...b)=>[...b].map((b)=>b.replace(/\[([^\[\]]*)\]/g,'.$1.').split('.').filter((a)=>''!==a).reduce((a,b)=>a&&a[b],a)),getColonTimeFromDate:(a)=>a.toTimeString().slice(0,8),getDaysDiffBetweenDates:(a,b)=>(b-a)/86400000,getMeridiemSuffixOfInteger:(a)=>0===a||24===a?'12am':12===a?'12pm':12>a?a%12+'am':a%12+'pm',getScrollPosition:(a=window)=>({x:a.pageXOffset===void 0?a.scrollLeft:a.pageXOffset,y:a.pageYOffset===void 0?a.scrollTop:a.pageYOffset}),getStyle:(a,b)=>getComputedStyle(a)[b],getType:(a)=>a===void 0?'undefined':null===a?'null':a.constructor.name.toLowerCase(),getURLParameters:(a)=>(a.match(/([^?=&]+)(=([^&]*))/g)||[]).reduce((b,a)=>(b[a.slice(0,a.indexOf('='))]=a.slice(a.indexOf('=')+1),b),{}),groupBy:(a,b)=>a.map('function'==typeof b?b:(a)=>a[b]).reduce((b,c,d)=>(b[c]=(b[c]||[]).concat(a[d]),b),{}),hammingDistance:(a,b)=>((a^b).toString(2).match(/1/g)||'').length,hasClass:(a,b)=>a.classList.contains(b),hasFlags:(...a)=>a.every((a)=>process.argv.includes(/^-{1,2}/.test(a)?a:'--'+a)),hashBrowser:(a)=>crypto.subtle.digest('SHA-256',new TextEncoder('utf-8').encode(a)).then((a)=>{let b=[],c=new DataView(a);for(let d=0;dnew Promise((b)=>setTimeout(()=>b(w.createHash('sha256').update(a).digest('hex')),0)),head:(a)=>a[0],hexToRGB:(a)=>{let b=!1,c=a.slice(a.startsWith('#')?1:0);return 3===c.length?c=[...c].map((a)=>a+a).join(''):8===c.length&&(b=!0),c=parseInt(c,16),'rgb'+(b?'a':'')+'('+(c>>>(b?24:16))+', '+((c&(b?16711680:65280))>>>(b?16:8))+', '+((c&(b?65280:255))>>>(b?8:0))+(b?`, ${255&c}`:'')+')'},hide:(...a)=>[...a].forEach((a)=>a.style.display='none'),httpGet:(a,b,c=console.error)=>{const d=new XMLHttpRequest;d.open('GET',a,!0),d.onload=()=>b(d.responseText),d.onerror=()=>c(d),d.send()},httpPost:(a,b,c,d=console.error)=>{const e=new XMLHttpRequest;e.open('POST',a,!0),e.setRequestHeader('Content-type','application/json; charset=utf-8'),e.onload=()=>c(e.responseText),e.onerror=()=>d(e),e.send(b)},httpsRedirect:()=>{'https:'!==location.protocol&&location.replace('https://'+location.href.split('//')[1])},inRange:(a,b,c=null)=>(c&&b>c&&(c=b),null==c?0<=a&&a=b&&a{const c=[];return a.forEach((a,d)=>a===b&&c.push(d)),c},initial:(a)=>a.slice(0,-1),initialize2DArray:(a,b,c=null)=>Array.from({length:b}).map(()=>Array.from({length:a}).fill(c)),initializeArrayWithRange:(a,b=0,c=1)=>Array.from({length:h((a+1-b)/c)}).map((a,d)=>d*c+b),initializeArrayWithRangeRight:(a,b=0,c=1)=>Array.from({length:h((a+1-b)/c)}).map((a,d,e)=>(e.length-d-1)*c+b),initializeArrayWithValues:(a,b=0)=>Array(a).fill(b),intersection:(c,a)=>{const b=new Set(a);return c.filter((a)=>b.has(a))},intersectionBy:(c,a,b)=>{const d=new Set(a.map((a)=>b(a)));return c.filter((a)=>d.has(b(a)))},intersectionWith:(c,a,b)=>c.filter((c)=>-1!==a.findIndex((a)=>b(c,a))),invertKeyValues:(a,b)=>Object.keys(a).reduce((c,d)=>{const e=b?b(a[d]):a[d];return c[e]=c[e]||[],c[e].push(d),c},{}),is:(a,b)=>b instanceof a,isAbsoluteURL:(a)=>/^[a-z][a-z0-9+.-]*:/.test(a),isArrayLike:(a)=>{try{return[...a],!0}catch(a){return!1}},isBoolean:(a)=>'boolean'==typeof a,isDivisible:(a,b)=>0==a%b,isEmpty:(a)=>null==a||!(Object.keys(a)||a).length,isEven:(a)=>0==a%2,isFunction:(a)=>'function'==typeof a,isLowerCase:(a)=>a===a.toLowerCase(),isNil:(a)=>a===void 0||null===a,isNull:(a)=>null===a,isNumber:(a)=>'number'==typeof a,isObject:(a)=>a===Object(a),isObjectLike:(a)=>null!==a&&'object'==typeof a,isPlainObject:(a)=>!!a&&'object'==typeof a&&a.constructor===Object,isPrime:(b)=>{const d=c(a(b));for(var e=2;e<=d;e++)if(0==b%e)return!1;return 2<=b},isPrimitive:(a)=>!['object','function'].includes(typeof a)||null===a,isPromiseLike:(a)=>null!==a&&('object'==typeof a||'function'==typeof a)&&'function'==typeof a.then,isSorted:(a)=>{const b=a[0]>a[1]?-1:1;for(let[c,d]of a.entries()){if(c===a.length-1)return b;if(0<(d-a[c+1])*b)return 0}},isString:(a)=>'string'==typeof a,isSymbol:(a)=>'symbol'==typeof a,isTravisCI:()=>'TRAVIS'in process.env&&'CI'in process.env,isUndefined:(a)=>a===void 0,isUpperCase:(a)=>a===a.toUpperCase(),isValidJSON:(a)=>{try{return JSON.parse(a),!0}catch(a){return!1}},join:(a,b=',',c=b)=>a.reduce((d,e,g)=>g===a.length-2?d+e+c:g===a.length-1?d+e:d+e+b,''),last:(a)=>a[a.length-1],lcm:(...a)=>{const b=(a,c)=>c?b(c,a%c):a,c=(a,c)=>a*c/b(a,c);return[...a].reduce((d,a)=>c(d,a))},longestItem:(...a)=>[...a].sort((c,a)=>a.length-c.length)[0],lowercaseKeys:(a)=>Object.keys(a).reduce((b,c)=>(b[c.toLowerCase()]=a[c],b),{}),luhnCheck:(a)=>{let b=(a+'').split('').reverse().map((a)=>parseInt(a)),c=b.splice(0,1)[0],d=b.reduce((a,b,c)=>0==c%2?a+2*b%9||9:a+b,0);return d+=c,0==d%10},mapKeys:(a,b)=>Object.keys(a).reduce((c,d)=>(c[b(a[d],d,a)]=a[d],c),{}),mapObject:(b,c)=>((d)=>(d=[b,b.map(c)],d[0].reduce((a,b,c)=>(a[b]=d[1][c],a),{})))(),mapValues:(a,b)=>Object.keys(a).reduce((c,d)=>(c[d]=b(a[d],d,a),c),{}),mask:(a,b=4,c='*')=>(''+a).slice(0,-b).replace(/./g,c)+(''+a).slice(-b),matches:(a,b)=>Object.keys(b).every((c)=>a.hasOwnProperty(c)&&a[c]===b[c]),matchesWith:(a,b,c)=>Object.keys(b).every((d)=>a.hasOwnProperty(d)&&c?c(a[d],b[d],d,a,b):a[d]==b[d]),maxBy:(a,b)=>g(...a.map('function'==typeof b?b:(a)=>a[b])),maxN:(a,b=1)=>[...a].sort((c,a)=>a-c).slice(0,b),median:(a)=>{const b=c(a.length/2),d=[...a].sort((c,a)=>c-a);return 0==a.length%2?(d[b-1]+d[b])/2:d[b]},memoize:(a)=>{const b=new Map,c=function(c){return b.has(c)?b.get(c):b.set(c,a.call(this,c))&&b.get(c)};return c.cache=b,c},merge:(...a)=>[...a].reduce((b,c)=>Object.keys(c).reduce((d,a)=>(b[a]=b.hasOwnProperty(a)?[].concat(b[a]).concat(c[a]):c[a],b),{}),{}),minBy:(a,b)=>e(...a.map('function'==typeof b?b:(a)=>a[b])),minN:(a,b=1)=>[...a].sort((c,a)=>c-a).slice(0,b),mostPerformant:(a,b=1e4)=>{const c=a.map((a)=>{const c=performance.now();for(let c=0;c(...b)=>!a(...b),none:(a,b=Boolean)=>!a.some(b),nthArg:(a)=>(...b)=>b.slice(a)[0],nthElement:(a,b=0)=>(0a.reduce((b,a)=>(b[a[0]]=a[1],b),{}),objectToPairs:(a)=>Object.keys(a).map((b)=>[b,a[b]]),observeMutations:(a,b,c)=>{const d=new MutationObserver((a)=>a.forEach((a)=>b(a)));return d.observe(a,Object.assign({childList:!0,attributes:!0,attributeOldValue:!0,characterData:!0,characterDataOldValue:!0,subtree:!0},c)),d},off:(a,b,c,d=!1)=>a.removeEventListener(b,c,d),omit:(a,b)=>Object.keys(a).filter((a)=>!b.includes(a)).reduce((b,c)=>(b[c]=a[c],b),{}),omitBy:(a,b)=>Object.keys(a).filter((c)=>!b(a[c],c)).reduce((b,c)=>(b[c]=a[c],b),{}),on:(a,b,c,d={})=>{const e=(a)=>a.target.matches(d.target)&&c.call(a.target,a);if(a.addEventListener(b,d.target?e:c,d.options||!1),d.target)return e},onUserInputChange:(a)=>{let b='mouse',c=0;const d=()=>{const e=performance.now();20>e-c&&(b='mouse',a(b),document.removeEventListener('mousemove',d)),c=e};document.addEventListener('touchstart',()=>{'touch'==b||(b='touch',a(b),document.addEventListener('mousemove',d))})},once:(a)=>{let b=!1;return function(...c){if(!b)return b=!0,a.apply(this,c)}},orderBy:(a,c,d)=>[...a].sort((e,a)=>c.reduce((b,c,g)=>{if(0===b){const[h,i]=d&&'desc'===d[g]?[a[c],e[c]]:[e[c],a[c]];b=h>i?1:h(...b)=>a.map((a)=>a.apply(null,b)),overArgs:(a,b)=>(...c)=>a(...c.map((a,c)=>b[c](a))),palindrome:(a)=>{const b=a.toLowerCase().replace(/[\W_]/g,'');return b===b.split('').reverse().join('')},parseCookie:(a)=>a.split(';').map((a)=>a.split('=')).reduce((a,b)=>(a[decodeURIComponent(b[0].trim())]=decodeURIComponent(b[1].trim()),a),{}),partial:(a,...b)=>(...c)=>a(...b,...c),partialRight:(a,...b)=>(...c)=>a(...c,...b),partition:(a,b)=>a.reduce((a,c,d,e)=>(a[b(c,d,e)?0:1].push(c),a),[[],[]]),percentile:(a,b)=>100*a.reduce((a,c)=>a+(cb.reduce((b,c)=>(c in a&&(b[c]=a[c]),b),{}),pickBy:(a,b)=>Object.keys(a).filter((c)=>b(a[c],c)).reduce((b,c)=>(b[c]=a[c],b),{}),pipeAsyncFunctions:(...a)=>(b)=>a.reduce((a,b)=>a.then(b),Promise.resolve(b)),pipeFunctions:(...a)=>a.reduce((a,b)=>(...c)=>b(a(...c))),pluralize:(a,b,c=b+'s')=>{const d=(a,b,c=b+'s')=>[1,-1].includes(+a)?b:c;return'object'==typeof a?(b,c)=>d(b,c,a[c]):d(a,b,c)},powerset:(a)=>a.reduce((b,a)=>b.concat(b.map((b)=>[a].concat(b))),[[]]),prettyBytes:(a,b=3,d=!0)=>{const g=['B','KB','MB','GB','TB','PB','EB','ZB','YB'];if(1>j(a))return a+(d?' ':'')+g[0];const h=e(c(Math.log10(0>a?-a:a)/3),g.length-1),i=+((0>a?-a:a)/1e3**h).toPrecision(b);return(0>a?'-':'')+i+(d?' ':'')+g[h]},primes:(b)=>{let d=Array.from({length:b-1}).map((a,b)=>b+2),e=c(a(b)),g=Array.from({length:e-1}).map((a,b)=>b+2);return g.forEach((a)=>d=d.filter((b)=>0!=b%a||b===a)),d},promisify:(a)=>(...b)=>new Promise((c,d)=>a(...b,(a,b)=>a?d(a):c(b))),pull:(a,...b)=>{let c=Array.isArray(b[0])?b[0]:b,d=a.filter((a)=>!c.includes(a));a.length=0,d.forEach((b)=>a.push(b))},pullAtIndex:(a,b)=>{let c=[],d=a.map((a,d)=>b.includes(d)?c.push(a):a).filter((a,c)=>!b.includes(c));return a.length=0,d.forEach((b)=>a.push(b)),c},pullAtValue:(a,b)=>{let c=[],d=a.forEach((a)=>b.includes(a)?c.push(a):a),e=a.filter((a)=>!b.includes(a));return a.length=0,e.forEach((b)=>a.push(b)),c},pullBy:(a,...b)=>{const c=b.length;let d=1d(a)),g=a.filter((a)=>!e.includes(d(a)));a.length=0,g.forEach((b)=>a.push(b))},radsToDegrees:(a)=>180*a/d,randomHexColorCode:()=>{let a=(1e6*(1048575*Math.random())).toString(16);return'#'+a.slice(0,6)},randomIntArrayInRange:(a,b,d=1)=>Array.from({length:d},()=>c(Math.random()*(b-a+1))+a),randomIntegerInRange:(a,b)=>c(Math.random()*(b-a+1))+a,randomNumberInRange:(a,b)=>Math.random()*(b-a)+a,readFileLines:(a)=>x.readFileSync(a).toString('UTF8').split('\n'),rearg:(a,b)=>(...c)=>a(...c.reduce((a,c,d)=>(a[b.indexOf(d)]=c,a),Array.from({length:b.length}))),redirect:(a,b=!0)=>b?window.location.href=a:window.location.replace(a),reduceSuccessive:(a,b,c)=>a.reduce((a,c,d,e)=>(a.push(b(a.slice(-1)[0],c,d,e)),a),[c]),reduceWhich:(a,c=(c,a)=>c-a)=>a.reduce((d,a)=>0<=c(d,a)?a:d),reducedFilter:(a,b,c)=>a.filter(c).map((a)=>b.reduce((b,c)=>(b[c]=a[c],b),{})),remove:(a,b)=>Array.isArray(a)?a.filter(b).reduce((b,c)=>(a.splice(a.indexOf(c),1),b.concat(c)),[]):[],removeNonASCII:(a)=>a.replace(/[^\x20-\x7E]/g,''),reverseString:(a)=>[...a].join(''),round:(a,b=0)=>+`${i(`${a}e${b}`)}e-${b}`,runAsync:(a)=>{const b=new Worker(URL.createObjectURL(new Blob([`postMessage((${a})());`]),{type:'application/javascript; charset=utf-8'}));return new Promise((a,c)=>{b.onmessage=({data:c})=>{a(c),b.terminate()},b.onerror=(a)=>{c(a),b.terminate()}})},runPromisesInSeries:(a)=>a.reduce((a,b)=>a.then(b),Promise.resolve()),sample:(a)=>a[c(Math.random()*a.length)],sampleSize:([...a],b=1)=>{for(let d=a.length;d;){const b=c(Math.random()*d--);[a[d],a[b]]=[a[b],a[d]]}return a.slice(0,b)},scrollToTop:y,sdbm:(a)=>{let b=a.split('');return b.reduce((a,b)=>a=b.charCodeAt(0)+(a<<6)+(a<<16)-a,0)},serializeCookie:(a,b)=>`${encodeURIComponent(a)}=${encodeURIComponent(b)}`,setStyle:(a,b,c)=>a.style[b]=c,shallowClone:(a)=>Object.assign({},a),show:(...a)=>[...a].forEach((a)=>a.style.display=''),shuffle:([...a])=>{for(let b=a.length;b;){const d=c(Math.random()*b--);[a[b],a[d]]=[a[d],a[b]]}return a},similarity:(a,b)=>a.filter((a)=>b.includes(a)),size:(a)=>Array.isArray(a)?a.length:a&&'object'==typeof a?a.size||a.length||Object.keys(a).length:'string'==typeof a?new Blob([a]).size:0,sleep:(a)=>new Promise((b)=>setTimeout(b,a)),sortCharactersInString:(a)=>[...a].sort((c,a)=>c.localeCompare(a)).join(''),sortedIndex:(a,b)=>{const c=a[0]>a[a.length-1],d=a.findIndex((a)=>c?b>=a:b<=a);return-1===d?a.length:d},sortedIndexBy:(a,b,c)=>{const d=c(a[0])>c(a[a.length-1]),e=c(b),g=a.findIndex((a)=>d?e>=c(a):e<=c(a));return-1===g?a.length:g},sortedLastIndex:(a,b)=>{const c=a[0]>a[a.length-1],d=a.map((a,b)=>[b,a]).reverse().findIndex((a)=>c?b<=a[1]:b>=a[1]);return-1===d?0:a.length-d-1},sortedLastIndexBy:(a,b,c)=>{const d=c(a[0])>c(a[a.length-1]),e=c(b),g=a.map((a,b)=>[b,c(a)]).reverse().findIndex((a)=>d?e<=a[1]:e>=a[1]);return-1===g?0:a.length-g},splitLines:(a)=>a.split(/\r?\n/),spreadOver:(a)=>(b)=>a(...b),stableSort:(a,c)=>a.map((a,b)=>({item:a,index:b})).sort((d,a)=>c(d.item,a.item)||d.index-a.index).map(({item:a})=>a),standardDeviation:(b,c=!1)=>{const d=b.reduce((a,b)=>a+b,0)/b.length;return a(b.reduce((a,b)=>a.concat((b-d)**2),[]).reduce((a,b)=>a+b,0)/(b.length-(c?0:1)))},stripHTMLTags:(a)=>a.replace(/<[^>]*>/g,''),sum:(...a)=>[...a].reduce((a,b)=>a+b,0),sumBy:(a,b)=>a.map('function'==typeof b?b:(a)=>a[b]).reduce((a,b)=>a+b,0),sumPower:(a,b=2,c=1)=>Array(a+1-c).fill(0).map((a,d)=>(d+c)**b).reduce((c,a)=>c+a,0),symmetricDifference:(c,a)=>{const b=new Set(c),d=new Set(a);return[...c.filter((a)=>!d.has(a)),...a.filter((a)=>!b.has(a))]},symmetricDifferenceBy:(c,a,b)=>{const d=new Set(c.map((a)=>b(a))),e=new Set(a.map((a)=>b(a)));return[...c.filter((a)=>!e.has(b(a))),...a.filter((a)=>!d.has(b(a)))]},symmetricDifferenceWith:(b,c,d)=>[...b.filter((e)=>-1===c.findIndex((a)=>d(e,a))),...c.filter((c)=>-1===b.findIndex((a)=>d(c,a)))],tail:(a)=>1a.slice(0,b),takeRight:(a,b=1)=>a.slice(a.length-b,a.length),takeRightWhile:(a,b)=>{for(let c of a.reverse().keys())if(b(a[c]))return a.reverse().slice(a.length-c,a.length);return a},takeWhile:(a,b)=>{for(let c of a.keys())if(b(a[c]))return a.slice(0,c);return a},throttle:(a,b)=>{let c,d,e;return function(){const g=this,h=arguments;c?(clearTimeout(d),d=setTimeout(function(){Date.now()-e>=b&&(a.apply(g,h),e=Date.now())},b-(Date.now()-e))):(a.apply(g,h),e=Date.now(),c=!0)}},timeTaken:(a)=>{console.time('timeTaken');const b=a();return console.timeEnd('timeTaken'),b},times:(a,b,c=void 0)=>{for(let d=0;!1!==b.call(c,d)&&++d{let b=a&&a.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g).map((a)=>a.slice(0,1).toUpperCase()+a.slice(1).toLowerCase()).join('');return b.slice(0,1).toLowerCase()+b.slice(1)},toCurrency:(a,b,c=void 0)=>Intl.NumberFormat(c,{style:'currency',currency:b}).format(a),toDecimalMark:(a)=>a.toLocaleString('en-US'),toKebabCase:(a)=>a&&a.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g).map((a)=>a.toLowerCase()).join('-'),toOrdinalSuffix:(a)=>{const b=parseInt(a),c=[b%10,b%100],d=['st','nd','rd','th'];return[1,2,3,4].includes(c[0])&&![11,12,13,14,15,16,17,18,19].includes(c[1])?b+d[c[0]-1]:b+d[3]},toSafeInteger:(a)=>i(g(e(a,Number.MAX_SAFE_INTEGER),Number.MIN_SAFE_INTEGER)),toSnakeCase:(a)=>a&&a.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g).map((a)=>a.toLowerCase()).join('_'),toggleClass:(a,b)=>a.classList.toggle(b),tomorrow:()=>{let a=new Date;return a.setDate(a.getDate()+1),`${a.getFullYear()}-${(a.getMonth()+1+'').padStart(2,'0')}-${(a.getDate()+'').padStart(2,'0')}`},transform:(b,c,a)=>Object.keys(b).reduce((d,a)=>c(d,b[a],a,b),a),truncateString:(a,b)=>a.length>b?a.slice(0,3a.every((a)=>a[b]),unary:(a)=>(b)=>a(b),uncurry:(a,b=1)=>(...c)=>{if(b>c.length)throw new RangeError('Arguments too few!');return((a)=>(b)=>b.reduce((a,b)=>a(b),a))(a)(c.slice(0,b))},unescapeHTML:(a)=>a.replace(/&|<|>|'|"/g,(a)=>({"&":'&',"<":'<',">":'>',"'":'\'',""":'"'})[a]||a),unflattenObject:(a)=>Object.keys(a).reduce((b,c)=>{if(-1!==c.indexOf('.')){const d=c.split('.');Object.assign(b,JSON.parse('{'+d.map((a,b)=>b===d.length-1?`"${a}":`:`"${a}":{`).join('')+a[c]+'}'.repeat(d.length)))}else b[c]=a[c];return b},{}),unfold:(a,b)=>{let c=[],d=[null,b];for(;d=a(d[1]);)c.push(d[0]);return c},union:(c,a)=>Array.from(new Set([...c,...a])),unionBy:(c,a,b)=>{const d=new Set(c.map((a)=>b(a)));return Array.from(new Set([...c,...a.filter((a)=>!d.has(b(a)))]))},unionWith:(c,a,b)=>Array.from(new Set([...c,...a.filter((a)=>-1===c.findIndex((c)=>b(a,c)))])),uniqueElements:(a)=>[...new Set(a)],untildify:(a)=>a.replace(/^~($|\/|\\)/,`${'undefined'!=typeof require&&require('os').homedir()}$1`),unzip:(a)=>a.reduce((a,b)=>(b.forEach((b,c)=>a[c].push(b)),a),Array.from({length:g(...a.map((a)=>a.length))}).map(()=>[])),unzipWith:(a,b)=>a.reduce((a,b)=>(b.forEach((b,c)=>a[c].push(b)),a),Array.from({length:g(...a.map((a)=>a.length))}).map(()=>[])).map((a)=>b(...a)),validateNumber:(a)=>!isNaN(parseFloat(a))&&isFinite(a)&&+a==a,without:(a,...b)=>a.filter((a)=>!b.includes(a)),words:(a,b=/[^a-zA-Z-]+/)=>a.split(b).filter(Boolean),xProd:(c,a)=>c.reduce((b,c)=>b.concat(a.map((a)=>[c,a])),[]),yesNo:(a,b=!1)=>!!/^(y|yes)$/i.test(a)||!/^(n|no)$/i.test(a)&&b,zip:(...a)=>{const b=g(...a.map((a)=>a.length));return Array.from({length:b}).map((b,c)=>Array.from({length:a.length},(b,d)=>a[d][c]))},zipObject:(a,b)=>a.reduce((a,c,d)=>(a[c]=b[d],a),{}),zipWith:(...a)=>{const b=a.length;let c=1a.length)),e=Array.from({length:d}).map((b,c)=>Array.from({length:a.length},(b,d)=>a[d][c]));return c?e.map((a)=>c(...a)):e}}}); +(function(a,b){'object'==typeof exports&&'undefined'!=typeof module?module.exports=b():'function'==typeof define&&define.amd?define(b):a._30s=b()})(this,function(){'use strict';var a=Math.sqrt,b=Math.log,c=Math.floor,d=Math.PI,e=Math.min,g=Math.max,h=Math.ceil,i=Math.round,j=Math.abs;const k='undefined'!=typeof require&&require('fs'),l='undefined'!=typeof require&&require('crypto'),m=(a,b=a.length,...c)=>b<=c.length?a(...c):m.bind(null,a,b,...c),n=(a)=>{let b=Object.assign({},a);return Object.keys(b).forEach((c)=>b[c]='object'==typeof a[c]?n(a[c]):a[c]),b},o=(a)=>[].concat(...a.map((a)=>Array.isArray(a)?o(a):a)),p=([...c],d=32,e)=>{const[g,a]=c,b=(a,b)=>1/(1+10**((b-a)/400)),h=(c,h)=>(e||c)+d*(h-b(h?g:a,h?a:g));if(2===c.length)return[h(g,1),h(a,0)];for(let a,b=0;b{if(c===d)return!0;if(c instanceof Date&&d instanceof Date)return c.getTime()===d.getTime();if(!c||!d||'object'!=typeof c&&'object'!=typeof d)return c===d;if(null===c||void 0===c||null===d||void 0===d)return!1;if(c.prototype!==d.prototype)return!1;let e=Object.keys(c);return!(e.length!==Object.keys(d).length)&&e.every((a)=>q(c[a],d[a]))},r=(a)=>0>a?(()=>{throw new TypeError('Negative numbers are not allowed!')})():1>=a?1:a*r(a-1),s=(a,b=1)=>1===b?a.reduce((b,a)=>b.concat(a),[]):a.reduce((c,a)=>c.concat(Array.isArray(a)?s(a,b-1):a),[]),t=(a,b='')=>Object.keys(a).reduce((c,d)=>{const e=b.length?b+'.':'';return'object'==typeof a[d]?Object.assign(c,t(a[d],e+d)):c[e+d]=a[d],c},{}),u=(...a)=>{const c=(a,b)=>b?u(b,a%b):a;return[...a].reduce((d,a)=>c(d,a))},v='undefined'!=typeof require&&require('crypto'),w=(a)=>2>=a.length?2===a.length?[a,[a[1],a[0]]]:a:a.reduce((b,c,d)=>b.concat(w([...a.slice(0,d),...a.slice(d+1)]).map((a)=>[c,...a])),[]),x='undefined'!=typeof require&&require('fs'),y=()=>{const a=document.documentElement.scrollTop||document.body.scrollTop;02>=a.length?2===a.length?[a,a[1]+a[0]]:[a]:a.split('').reduce((b,c,d)=>b.concat(z(a.slice(0,d)+a.slice(d+1)).map((a)=>c+a)),[]);return{JSONToFile:(a,b)=>k.writeFile(`${b}.json`,JSON.stringify(a,null,2)),RGBToHex:(a,c,d)=>((a<<16)+(c<<8)+d).toString(16).padStart(6,'0'),URLJoin:(...a)=>a.join('/').replace(/[\/]+/g,'/').replace(/^(.+):\//,'$1://').replace(/^file:/,'file:/').replace(/\/(\?|&|#[^!])/g,'$1').replace(/\?/g,'&').replace('&','?'),UUIDGeneratorBrowser:()=>'10000000-1000-4000-8000-100000000000'.replace(/[018]/g,(a)=>(a^crypto.getRandomValues(new Uint8Array(1))[0]&15>>a/4).toString(16)),UUIDGeneratorNode:()=>'10000000-1000-4000-8000-100000000000'.replace(/[018]/g,(a)=>(a^l.randomBytes(1)[0]&15>>a/4).toString(16)),all:(a,b=Boolean)=>a.every(b),any:(a,b=Boolean)=>a.some(b),approximatelyEqual:(a,b,c=1e-3)=>j(a-b)a.map((a)=>document.querySelector('#'+b).innerHTML+=`
  • ${a}
  • `),ary:(a,b)=>(...c)=>a(...c.slice(0,b)),atob:(a)=>new Buffer(a,'base64').toString('binary'),attempt:(a,...b)=>{try{return a(b)}catch(a){return a instanceof Error?a:new Error(a)}},average:(...a)=>[...a].reduce((a,b)=>a+b,0)/a.length,averageBy:(a,b)=>a.map('function'==typeof b?b:(a)=>a[b]).reduce((a,b)=>a+b,0)/a.length,bifurcate:(a,b)=>a.reduce((a,c,d)=>(a[b[d]?0:1].push(c),a),[[],[]]),bifurcateBy:(a,b)=>a.reduce((a,c,d)=>(a[b(c,d)?0:1].push(c),a),[[],[]]),bind:(a,b,...c)=>function(){return a.apply(b,c.concat(...arguments))},bindAll:(a,...b)=>b.forEach((b)=>(f=a[b],a[b]=function(){return f.apply(a)})),bindKey:(a,b,...c)=>function(){return a[b].apply(a,c.concat(...arguments))},binomialCoefficient:(a,b)=>{var c=Number.isNaN;if(c(a)||c(b))return NaN;if(0>b||b>a)return 0;if(0===b||b===a)return 1;if(1===b||b===a-1)return a;a-bdocument.documentElement.clientHeight+window.scrollY>=(document.documentElement.scrollHeight||document.documentElement.clientHeight),btoa:(a)=>new Buffer(a,'binary').toString('base64'),byteSize:(a)=>new Blob([a]).size,call:(a,...b)=>(c)=>c[a](...b),capitalize:([a,...b],c=!1)=>a.toUpperCase()+(c?b.join('').toLowerCase():b.join('')),capitalizeEveryWord:(a)=>a.replace(/\b[a-z]/g,(a)=>a.toUpperCase()),castArray:(a)=>Array.isArray(a)?a:[a],chainAsync:(a)=>{let b=0;const c=()=>a[b++](c);c()},chunk:(a,b)=>Array.from({length:h(a.length/b)},(c,d)=>a.slice(d*b,d*b+b)),clampNumber:(c,d,a)=>g(e(c,g(d,a)),e(d,a)),cloneRegExp:(a)=>new RegExp(a.source,a.flags),coalesce:(...a)=>a.find((a)=>![void 0,null].includes(a)),coalesceFactory:(a)=>(...b)=>b.find(a),collectInto:(a)=>(...b)=>a(b),colorize:(...a)=>({black:`\x1b[30m${a.join(' ')}`,red:`\x1b[31m${a.join(' ')}`,green:`\x1b[32m${a.join(' ')}`,yellow:`\x1b[33m${a.join(' ')}`,blue:`\x1b[34m${a.join(' ')}`,magenta:`\x1b[35m${a.join(' ')}`,cyan:`\x1b[36m${a.join(' ')}`,white:`\x1b[37m${a.join(' ')}`,bgBlack:`\x1b[40m${a.join(' ')}\x1b[0m`,bgRed:`\x1b[41m${a.join(' ')}\x1b[0m`,bgGreen:`\x1b[42m${a.join(' ')}\x1b[0m`,bgYellow:`\x1b[43m${a.join(' ')}\x1b[0m`,bgBlue:`\x1b[44m${a.join(' ')}\x1b[0m`,bgMagenta:`\x1b[45m${a.join(' ')}\x1b[0m`,bgCyan:`\x1b[46m${a.join(' ')}\x1b[0m`,bgWhite:`\x1b[47m${a.join(' ')}\x1b[0m`}),compact:(a)=>a.filter(Boolean),compose:(...a)=>a.reduce((a,b)=>(...c)=>a(b(...c))),composeRight:(...a)=>a.reduce((a,b)=>(...c)=>b(a(...c))),converge:(a,b)=>(...c)=>a(...b.map((a)=>a.apply(null,c))),copyToClipboard:(a)=>{const b=document.createElement('textarea');b.value=a,b.setAttribute('readonly',''),b.style.position='absolute',b.style.left='-9999px',document.body.appendChild(b);const c=!!(0a.map('function'==typeof b?b:(a)=>a[b]).reduce((a,b)=>(a[b]=(a[b]||0)+1,a),{}),countOccurrences:(a,b)=>a.reduce((c,a)=>a===b?c+1:c+0,0),createElement:(a)=>{const b=document.createElement('div');return b.innerHTML=a,b.firstElementChild},createEventHub:()=>({hub:Object.create(null),emit(a,b){(this.hub[a]||[]).forEach((a)=>a(b))},on(a,b){this.hub[a]||(this.hub[a]=[]),this.hub[a].push(b)},off(a,b){const c=(this.hub[a]||[]).findIndex((a)=>a===b);-1window.location.href,curry:m,debounce:(a,b=0)=>{let c;return function(...d){clearTimeout(c),c=setTimeout(()=>a.apply(this,d),b)}},decapitalize:([a,...b],c=!1)=>a.toLowerCase()+(c?b.join('').toUpperCase():b.join('')),deepClone:n,deepFlatten:o,defaults:(a,...b)=>Object.assign({},a,...b.reverse(),a),defer:(a,...b)=>setTimeout(a,1,...b),degreesToRads:(a)=>a*d/180,delay:(a,b,...c)=>setTimeout(a,b,...c),detectDeviceType:()=>/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)?'Mobile':'Desktop',difference:(c,a)=>{const b=new Set(a);return c.filter((a)=>!b.has(a))},differenceBy:(c,a,b)=>{const d=new Set(a.map((a)=>b(a)));return c.filter((a)=>!d.has(b(a)))},differenceWith:(a,b,c)=>a.filter((d)=>-1===b.findIndex((a)=>c(d,a))),digitize:(a)=>[...`${a}`].map((a)=>parseInt(a)),distance:(a,b,c,d)=>Math.hypot(c-a,d-b),drop:(a,b=1)=>a.slice(b),dropRight:(a,b=1)=>a.slice(0,-b),dropRightWhile:(a,b)=>{for(;0{for(;0{const{top:c,left:d,bottom:e,right:g}=a.getBoundingClientRect(),{innerHeight:h,innerWidth:i}=window;return b?(0a.replace(/[&<>'"]/g,(a)=>({"&":'&',"<":'<',">":'>',"'":''','"':'"'})[a]||a),escapeRegExp:(a)=>a.replace(/[.*+?^${}()|[\]\\]/g,'\\$&'),everyNth:(a,b)=>a.filter((a,c)=>c%b==b-1),extendHex:(a)=>'#'+a.slice(a.startsWith('#')?1:0).split('').map((a)=>a+a).join(''),factorial:r,fibonacci:(a)=>Array.from({length:a}).reduce((a,b,c)=>a.concat(1a.filter((b)=>a.indexOf(b)===a.lastIndexOf(b)),findKey:(a,b)=>Object.keys(a).find((c)=>b(a[c],c,a)),findLast:(a,b)=>a.filter(b).slice(-1)[0],findLastIndex:(a,b)=>a.map((a,b)=>[b,a]).filter((c)=>b(c[1],c[0],a)).slice(-1)[0][0],findLastKey:(a,b)=>Object.keys(a).reverse().find((c)=>b(a[c],c,a)),flatten:s,flattenObject:t,flip:(a)=>(b,...c)=>a(...c,b),forEachRight:(a,b)=>a.slice(0).reverse().forEach(b),forOwn:(a,b)=>Object.keys(a).forEach((c)=>b(a[c],c,a)),forOwnRight:(a,b)=>Object.keys(a).reverse().forEach((c)=>b(a[c],c,a)),formatDuration:(a)=>{0>a&&(a=-a);const b={day:c(a/8.64e7),hour:c(a/3.6e6)%24,minute:c(a/6e4)%60,second:c(a/1e3)%60,millisecond:c(a)%1e3};return Object.entries(b).filter((a)=>0!==a[1]).map((a)=>a[1]+' '+(1===a[1]?a[0]:a[0]+'s')).join(', ')},fromCamelCase:(a,b='_')=>a.replace(/([a-z\d])([A-Z])/g,'$1'+b+'$2').replace(/([A-Z]+)([A-Z][a-z\d]+)/g,'$1'+b+'$2').toLowerCase(),functionName:(a)=>(console.debug(a.name),a),functions:(a,b=!1)=>(b?[...Object.keys(a),...Object.keys(Object.getPrototypeOf(a))]:Object.keys(a)).filter((b)=>'function'==typeof a[b]),gcd:u,geometricProgression:(a,d=1,e=2)=>Array.from({length:c(b(a/d)/b(e))+1}).map((a,b)=>d*e**b),get:(a,...b)=>[...b].map((b)=>b.replace(/\[([^\[\]]*)\]/g,'.$1.').split('.').filter((a)=>''!==a).reduce((a,b)=>a&&a[b],a)),getColonTimeFromDate:(a)=>a.toTimeString().slice(0,8),getDaysDiffBetweenDates:(a,b)=>(b-a)/86400000,getMeridiemSuffixOfInteger:(a)=>0===a||24===a?'12am':12===a?'12pm':12>a?a%12+'am':a%12+'pm',getScrollPosition:(a=window)=>({x:a.pageXOffset===void 0?a.scrollLeft:a.pageXOffset,y:a.pageYOffset===void 0?a.scrollTop:a.pageYOffset}),getStyle:(a,b)=>getComputedStyle(a)[b],getType:(a)=>a===void 0?'undefined':null===a?'null':a.constructor.name.toLowerCase(),getURLParameters:(a)=>(a.match(/([^?=&]+)(=([^&]*))/g)||[]).reduce((b,a)=>(b[a.slice(0,a.indexOf('='))]=a.slice(a.indexOf('=')+1),b),{}),groupBy:(a,b)=>a.map('function'==typeof b?b:(a)=>a[b]).reduce((b,c,d)=>(b[c]=(b[c]||[]).concat(a[d]),b),{}),hammingDistance:(a,b)=>((a^b).toString(2).match(/1/g)||'').length,hasClass:(a,b)=>a.classList.contains(b),hasFlags:(...a)=>a.every((a)=>process.argv.includes(/^-{1,2}/.test(a)?a:'--'+a)),hashBrowser:(a)=>crypto.subtle.digest('SHA-256',new TextEncoder('utf-8').encode(a)).then((a)=>{let b=[],c=new DataView(a);for(let d=0;dnew Promise((b)=>setTimeout(()=>b(v.createHash('sha256').update(a).digest('hex')),0)),head:(a)=>a[0],hexToRGB:(a)=>{let b=!1,c=a.slice(a.startsWith('#')?1:0);return 3===c.length?c=[...c].map((a)=>a+a).join(''):8===c.length&&(b=!0),c=parseInt(c,16),'rgb'+(b?'a':'')+'('+(c>>>(b?24:16))+', '+((c&(b?16711680:65280))>>>(b?16:8))+', '+((c&(b?65280:255))>>>(b?8:0))+(b?`, ${255&c}`:'')+')'},hide:(...a)=>[...a].forEach((a)=>a.style.display='none'),httpGet:(a,b,c=console.error)=>{const d=new XMLHttpRequest;d.open('GET',a,!0),d.onload=()=>b(d.responseText),d.onerror=()=>c(d),d.send()},httpPost:(a,b,c,d=console.error)=>{const e=new XMLHttpRequest;e.open('POST',a,!0),e.setRequestHeader('Content-type','application/json; charset=utf-8'),e.onload=()=>c(e.responseText),e.onerror=()=>d(e),e.send(b)},httpsRedirect:()=>{'https:'!==location.protocol&&location.replace('https://'+location.href.split('//')[1])},inRange:(a,b,c=null)=>(c&&b>c&&(c=b),null==c?0<=a&&a=b&&a{const c=[];return a.forEach((a,d)=>a===b&&c.push(d)),c},initial:(a)=>a.slice(0,-1),initialize2DArray:(a,b,c=null)=>Array.from({length:b}).map(()=>Array.from({length:a}).fill(c)),initializeArrayWithRange:(a,b=0,c=1)=>Array.from({length:h((a+1-b)/c)}).map((a,d)=>d*c+b),initializeArrayWithRangeRight:(a,b=0,c=1)=>Array.from({length:h((a+1-b)/c)}).map((a,d,e)=>(e.length-d-1)*c+b),initializeArrayWithValues:(a,b=0)=>Array(a).fill(b),intersection:(c,a)=>{const b=new Set(a);return c.filter((a)=>b.has(a))},intersectionBy:(c,a,b)=>{const d=new Set(a.map((a)=>b(a)));return c.filter((a)=>d.has(b(a)))},intersectionWith:(c,a,b)=>c.filter((c)=>-1!==a.findIndex((a)=>b(c,a))),invertKeyValues:(a,b)=>Object.keys(a).reduce((c,d)=>{const e=b?b(a[d]):a[d];return c[e]=c[e]||[],c[e].push(d),c},{}),is:(a,b)=>b instanceof a,isAbsoluteURL:(a)=>/^[a-z][a-z0-9+.-]*:/.test(a),isAnagram:(a,b)=>{const c=(a)=>a.toLowerCase().replace(/[^a-z0-9]/gi,'').split('').sort().join('');return c(a)===c(b)},isArrayLike:(a)=>{try{return[...a],!0}catch(a){return!1}},isBoolean:(a)=>'boolean'==typeof a,isDivisible:(a,b)=>0==a%b,isEmpty:(a)=>null==a||!(Object.keys(a)||a).length,isEven:(a)=>0==a%2,isFunction:(a)=>'function'==typeof a,isLowerCase:(a)=>a===a.toLowerCase(),isNil:(a)=>a===void 0||null===a,isNull:(a)=>null===a,isNumber:(a)=>'number'==typeof a,isObject:(a)=>a===Object(a),isObjectLike:(a)=>null!==a&&'object'==typeof a,isPlainObject:(a)=>!!a&&'object'==typeof a&&a.constructor===Object,isPrime:(b)=>{const d=c(a(b));for(var e=2;e<=d;e++)if(0==b%e)return!1;return 2<=b},isPrimitive:(a)=>!['object','function'].includes(typeof a)||null===a,isPromiseLike:(a)=>null!==a&&('object'==typeof a||'function'==typeof a)&&'function'==typeof a.then,isSorted:(a)=>{const b=a[0]>a[1]?-1:1;for(let[c,d]of a.entries()){if(c===a.length-1)return b;if(0<(d-a[c+1])*b)return 0}},isString:(a)=>'string'==typeof a,isSymbol:(a)=>'symbol'==typeof a,isTravisCI:()=>'TRAVIS'in process.env&&'CI'in process.env,isUndefined:(a)=>a===void 0,isUpperCase:(a)=>a===a.toUpperCase(),isValidJSON:(a)=>{try{return JSON.parse(a),!0}catch(a){return!1}},join:(a,b=',',c=b)=>a.reduce((d,e,g)=>g===a.length-2?d+e+c:g===a.length-1?d+e:d+e+b,''),last:(a)=>a[a.length-1],lcm:(...a)=>{const b=(a,c)=>c?b(c,a%c):a,c=(a,c)=>a*c/b(a,c);return[...a].reduce((d,a)=>c(d,a))},longestItem:(...a)=>[...a].sort((c,a)=>a.length-c.length)[0],lowercaseKeys:(a)=>Object.keys(a).reduce((b,c)=>(b[c.toLowerCase()]=a[c],b),{}),luhnCheck:(a)=>{let b=(a+'').split('').reverse().map((a)=>parseInt(a)),c=b.splice(0,1)[0],d=b.reduce((a,b,c)=>0==c%2?a+2*b%9||9:a+b,0);return d+=c,0==d%10},mapKeys:(a,b)=>Object.keys(a).reduce((c,d)=>(c[b(a[d],d,a)]=a[d],c),{}),mapObject:(b,c)=>((d)=>(d=[b,b.map(c)],d[0].reduce((a,b,c)=>(a[b]=d[1][c],a),{})))(),mapValues:(a,b)=>Object.keys(a).reduce((c,d)=>(c[d]=b(a[d],d,a),c),{}),mask:(a,b=4,c='*')=>(''+a).slice(0,-b).replace(/./g,c)+(''+a).slice(-b),matches:(a,b)=>Object.keys(b).every((c)=>a.hasOwnProperty(c)&&a[c]===b[c]),matchesWith:(a,b,c)=>Object.keys(b).every((d)=>a.hasOwnProperty(d)&&c?c(a[d],b[d],d,a,b):a[d]==b[d]),maxBy:(a,b)=>g(...a.map('function'==typeof b?b:(a)=>a[b])),maxN:(a,b=1)=>[...a].sort((c,a)=>a-c).slice(0,b),median:(a)=>{const b=c(a.length/2),d=[...a].sort((c,a)=>c-a);return 0==a.length%2?(d[b-1]+d[b])/2:d[b]},memoize:(a)=>{const b=new Map,c=function(c){return b.has(c)?b.get(c):b.set(c,a.call(this,c))&&b.get(c)};return c.cache=b,c},merge:(...a)=>[...a].reduce((b,c)=>Object.keys(c).reduce((d,a)=>(b[a]=b.hasOwnProperty(a)?[].concat(b[a]).concat(c[a]):c[a],b),{}),{}),minBy:(a,b)=>e(...a.map('function'==typeof b?b:(a)=>a[b])),minN:(a,b=1)=>[...a].sort((c,a)=>c-a).slice(0,b),mostPerformant:(a,b=1e4)=>{const c=a.map((a)=>{const c=performance.now();for(let c=0;c(...b)=>!a(...b),none:(a,b=Boolean)=>!a.some(b),nthArg:(a)=>(...b)=>b.slice(a)[0],nthElement:(a,b=0)=>(0a.reduce((b,a)=>(b[a[0]]=a[1],b),{}),objectToPairs:(a)=>Object.keys(a).map((b)=>[b,a[b]]),observeMutations:(a,b,c)=>{const d=new MutationObserver((a)=>a.forEach((a)=>b(a)));return d.observe(a,Object.assign({childList:!0,attributes:!0,attributeOldValue:!0,characterData:!0,characterDataOldValue:!0,subtree:!0},c)),d},off:(a,b,c,d=!1)=>a.removeEventListener(b,c,d),omit:(a,b)=>Object.keys(a).filter((a)=>!b.includes(a)).reduce((b,c)=>(b[c]=a[c],b),{}),omitBy:(a,b)=>Object.keys(a).filter((c)=>!b(a[c],c)).reduce((b,c)=>(b[c]=a[c],b),{}),on:(a,b,c,d={})=>{const e=(a)=>a.target.matches(d.target)&&c.call(a.target,a);if(a.addEventListener(b,d.target?e:c,d.options||!1),d.target)return e},onUserInputChange:(a)=>{let b='mouse',c=0;const d=()=>{const e=performance.now();20>e-c&&(b='mouse',a(b),document.removeEventListener('mousemove',d)),c=e};document.addEventListener('touchstart',()=>{'touch'==b||(b='touch',a(b),document.addEventListener('mousemove',d))})},once:(a)=>{let b=!1;return function(...c){if(!b)return b=!0,a.apply(this,c)}},orderBy:(a,c,d)=>[...a].sort((e,a)=>c.reduce((b,c,g)=>{if(0===b){const[h,i]=d&&'desc'===d[g]?[a[c],e[c]]:[e[c],a[c]];b=h>i?1:h(...b)=>a.map((a)=>a.apply(null,b)),overArgs:(a,b)=>(...c)=>a(...c.map((a,c)=>b[c](a))),palindrome:(a)=>{const b=a.toLowerCase().replace(/[\W_]/g,'');return b===b.split('').reverse().join('')},parseCookie:(a)=>a.split(';').map((a)=>a.split('=')).reduce((a,b)=>(a[decodeURIComponent(b[0].trim())]=decodeURIComponent(b[1].trim()),a),{}),partial:(a,...b)=>(...c)=>a(...b,...c),partialRight:(a,...b)=>(...c)=>a(...c,...b),partition:(a,b)=>a.reduce((a,c,d,e)=>(a[b(c,d,e)?0:1].push(c),a),[[],[]]),percentile:(a,b)=>100*a.reduce((a,c)=>a+(cb.reduce((b,c)=>(c in a&&(b[c]=a[c]),b),{}),pickBy:(a,b)=>Object.keys(a).filter((c)=>b(a[c],c)).reduce((b,c)=>(b[c]=a[c],b),{}),pipeAsyncFunctions:(...a)=>(b)=>a.reduce((a,b)=>a.then(b),Promise.resolve(b)),pipeFunctions:(...a)=>a.reduce((a,b)=>(...c)=>b(a(...c))),pluralize:(a,b,c=b+'s')=>{const d=(a,b,c=b+'s')=>[1,-1].includes(+a)?b:c;return'object'==typeof a?(b,c)=>d(b,c,a[c]):d(a,b,c)},powerset:(a)=>a.reduce((b,a)=>b.concat(b.map((b)=>[a].concat(b))),[[]]),prettyBytes:(a,b=3,d=!0)=>{const g=['B','KB','MB','GB','TB','PB','EB','ZB','YB'];if(1>j(a))return a+(d?' ':'')+g[0];const h=e(c(Math.log10(0>a?-a:a)/3),g.length-1),i=+((0>a?-a:a)/1e3**h).toPrecision(b);return(0>a?'-':'')+i+(d?' ':'')+g[h]},primes:(b)=>{let d=Array.from({length:b-1}).map((a,b)=>b+2),e=c(a(b)),g=Array.from({length:e-1}).map((a,b)=>b+2);return g.forEach((a)=>d=d.filter((b)=>0!=b%a||b===a)),d},promisify:(a)=>(...b)=>new Promise((c,d)=>a(...b,(a,b)=>a?d(a):c(b))),pull:(a,...b)=>{let c=Array.isArray(b[0])?b[0]:b,d=a.filter((a)=>!c.includes(a));a.length=0,d.forEach((b)=>a.push(b))},pullAtIndex:(a,b)=>{let c=[],d=a.map((a,d)=>b.includes(d)?c.push(a):a).filter((a,c)=>!b.includes(c));return a.length=0,d.forEach((b)=>a.push(b)),c},pullAtValue:(a,b)=>{let c=[],d=a.forEach((a)=>b.includes(a)?c.push(a):a),e=a.filter((a)=>!b.includes(a));return a.length=0,e.forEach((b)=>a.push(b)),c},pullBy:(a,...b)=>{const c=b.length;let d=1d(a)),g=a.filter((a)=>!e.includes(d(a)));a.length=0,g.forEach((b)=>a.push(b))},radsToDegrees:(a)=>180*a/d,randomHexColorCode:()=>{let a=(1e6*(1048575*Math.random())).toString(16);return'#'+a.slice(0,6)},randomIntArrayInRange:(a,b,d=1)=>Array.from({length:d},()=>c(Math.random()*(b-a+1))+a),randomIntegerInRange:(a,b)=>c(Math.random()*(b-a+1))+a,randomNumberInRange:(a,b)=>Math.random()*(b-a)+a,readFileLines:(a)=>x.readFileSync(a).toString('UTF8').split('\n'),rearg:(a,b)=>(...c)=>a(...c.reduce((a,c,d)=>(a[b.indexOf(d)]=c,a),Array.from({length:b.length}))),redirect:(a,b=!0)=>b?window.location.href=a:window.location.replace(a),reduceSuccessive:(a,b,c)=>a.reduce((a,c,d,e)=>(a.push(b(a.slice(-1)[0],c,d,e)),a),[c]),reduceWhich:(a,c=(c,a)=>c-a)=>a.reduce((d,a)=>0<=c(d,a)?a:d),reducedFilter:(a,b,c)=>a.filter(c).map((a)=>b.reduce((b,c)=>(b[c]=a[c],b),{})),remove:(a,b)=>Array.isArray(a)?a.filter(b).reduce((b,c)=>(a.splice(a.indexOf(c),1),b.concat(c)),[]):[],removeNonASCII:(a)=>a.replace(/[^\x20-\x7E]/g,''),reverseString:(a)=>[...a].join(''),round:(a,b=0)=>+`${i(`${a}e${b}`)}e-${b}`,runAsync:(a)=>{const b=new Worker(URL.createObjectURL(new Blob([`postMessage((${a})());`]),{type:'application/javascript; charset=utf-8'}));return new Promise((a,c)=>{b.onmessage=({data:c})=>{a(c),b.terminate()},b.onerror=(a)=>{c(a),b.terminate()}})},runPromisesInSeries:(a)=>a.reduce((a,b)=>a.then(b),Promise.resolve()),sample:(a)=>a[c(Math.random()*a.length)],sampleSize:([...a],b=1)=>{for(let d=a.length;d;){const b=c(Math.random()*d--);[a[d],a[b]]=[a[b],a[d]]}return a.slice(0,b)},scrollToTop:y,sdbm:(a)=>{let b=a.split('');return b.reduce((a,b)=>a=b.charCodeAt(0)+(a<<6)+(a<<16)-a,0)},serializeCookie:(a,b)=>`${encodeURIComponent(a)}=${encodeURIComponent(b)}`,setStyle:(a,b,c)=>a.style[b]=c,shallowClone:(a)=>Object.assign({},a),show:(...a)=>[...a].forEach((a)=>a.style.display=''),shuffle:([...a])=>{for(let b=a.length;b;){const d=c(Math.random()*b--);[a[b],a[d]]=[a[d],a[b]]}return a},similarity:(a,b)=>a.filter((a)=>b.includes(a)),size:(a)=>Array.isArray(a)?a.length:a&&'object'==typeof a?a.size||a.length||Object.keys(a).length:'string'==typeof a?new Blob([a]).size:0,sleep:(a)=>new Promise((b)=>setTimeout(b,a)),sortCharactersInString:(a)=>[...a].sort((c,a)=>c.localeCompare(a)).join(''),sortedIndex:(a,b)=>{const c=a[0]>a[a.length-1],d=a.findIndex((a)=>c?b>=a:b<=a);return-1===d?a.length:d},sortedIndexBy:(a,b,c)=>{const d=c(a[0])>c(a[a.length-1]),e=c(b),g=a.findIndex((a)=>d?e>=c(a):e<=c(a));return-1===g?a.length:g},sortedLastIndex:(a,b)=>{const c=a[0]>a[a.length-1],d=a.map((a,b)=>[b,a]).reverse().findIndex((a)=>c?b<=a[1]:b>=a[1]);return-1===d?0:a.length-d-1},sortedLastIndexBy:(a,b,c)=>{const d=c(a[0])>c(a[a.length-1]),e=c(b),g=a.map((a,b)=>[b,c(a)]).reverse().findIndex((a)=>d?e<=a[1]:e>=a[1]);return-1===g?0:a.length-g},splitLines:(a)=>a.split(/\r?\n/),spreadOver:(a)=>(b)=>a(...b),stableSort:(a,c)=>a.map((a,b)=>({item:a,index:b})).sort((d,a)=>c(d.item,a.item)||d.index-a.index).map(({item:a})=>a),standardDeviation:(b,c=!1)=>{const d=b.reduce((a,b)=>a+b,0)/b.length;return a(b.reduce((a,b)=>a.concat((b-d)**2),[]).reduce((a,b)=>a+b,0)/(b.length-(c?0:1)))},stringPermutations:z,stripHTMLTags:(a)=>a.replace(/<[^>]*>/g,''),sum:(...a)=>[...a].reduce((a,b)=>a+b,0),sumBy:(a,b)=>a.map('function'==typeof b?b:(a)=>a[b]).reduce((a,b)=>a+b,0),sumPower:(a,b=2,c=1)=>Array(a+1-c).fill(0).map((a,d)=>(d+c)**b).reduce((c,a)=>c+a,0),symmetricDifference:(c,a)=>{const b=new Set(c),d=new Set(a);return[...c.filter((a)=>!d.has(a)),...a.filter((a)=>!b.has(a))]},symmetricDifferenceBy:(c,a,b)=>{const d=new Set(c.map((a)=>b(a))),e=new Set(a.map((a)=>b(a)));return[...c.filter((a)=>!e.has(b(a))),...a.filter((a)=>!d.has(b(a)))]},symmetricDifferenceWith:(b,c,d)=>[...b.filter((e)=>-1===c.findIndex((a)=>d(e,a))),...c.filter((c)=>-1===b.findIndex((a)=>d(c,a)))],tail:(a)=>1a.slice(0,b),takeRight:(a,b=1)=>a.slice(a.length-b,a.length),takeRightWhile:(a,b)=>{for(let c of a.reverse().keys())if(b(a[c]))return a.reverse().slice(a.length-c,a.length);return a},takeWhile:(a,b)=>{for(let c of a.keys())if(b(a[c]))return a.slice(0,c);return a},throttle:(a,b)=>{let c,d,e;return function(){const g=this,h=arguments;c?(clearTimeout(d),d=setTimeout(function(){Date.now()-e>=b&&(a.apply(g,h),e=Date.now())},b-(Date.now()-e))):(a.apply(g,h),e=Date.now(),c=!0)}},timeTaken:(a)=>{console.time('timeTaken');const b=a();return console.timeEnd('timeTaken'),b},times:(a,b,c=void 0)=>{for(let d=0;!1!==b.call(c,d)&&++d{let b=a&&a.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g).map((a)=>a.slice(0,1).toUpperCase()+a.slice(1).toLowerCase()).join('');return b.slice(0,1).toLowerCase()+b.slice(1)},toCurrency:(a,b,c=void 0)=>Intl.NumberFormat(c,{style:'currency',currency:b}).format(a),toDecimalMark:(a)=>a.toLocaleString('en-US'),toKebabCase:(a)=>a&&a.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g).map((a)=>a.toLowerCase()).join('-'),toOrdinalSuffix:(a)=>{const b=parseInt(a),c=[b%10,b%100],d=['st','nd','rd','th'];return[1,2,3,4].includes(c[0])&&![11,12,13,14,15,16,17,18,19].includes(c[1])?b+d[c[0]-1]:b+d[3]},toSafeInteger:(a)=>i(g(e(a,Number.MAX_SAFE_INTEGER),Number.MIN_SAFE_INTEGER)),toSnakeCase:(a)=>a&&a.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g).map((a)=>a.toLowerCase()).join('_'),toggleClass:(a,b)=>a.classList.toggle(b),tomorrow:()=>{let a=new Date;return a.setDate(a.getDate()+1),`${a.getFullYear()}-${(a.getMonth()+1+'').padStart(2,'0')}-${(a.getDate()+'').padStart(2,'0')}`},transform:(b,c,a)=>Object.keys(b).reduce((d,a)=>c(d,b[a],a,b),a),truncateString:(a,b)=>a.length>b?a.slice(0,3a.every((a)=>a[b]),unary:(a)=>(b)=>a(b),uncurry:(a,b=1)=>(...c)=>{if(b>c.length)throw new RangeError('Arguments too few!');return((a)=>(b)=>b.reduce((a,b)=>a(b),a))(a)(c.slice(0,b))},unescapeHTML:(a)=>a.replace(/&|<|>|'|"/g,(a)=>({"&":'&',"<":'<',">":'>',"'":'\'',""":'"'})[a]||a),unflattenObject:(a)=>Object.keys(a).reduce((b,c)=>{if(-1!==c.indexOf('.')){const d=c.split('.');Object.assign(b,JSON.parse('{'+d.map((a,b)=>b===d.length-1?`"${a}":`:`"${a}":{`).join('')+a[c]+'}'.repeat(d.length)))}else b[c]=a[c];return b},{}),unfold:(a,b)=>{let c=[],d=[null,b];for(;d=a(d[1]);)c.push(d[0]);return c},union:(c,a)=>Array.from(new Set([...c,...a])),unionBy:(c,a,b)=>{const d=new Set(c.map((a)=>b(a)));return Array.from(new Set([...c,...a.filter((a)=>!d.has(b(a)))]))},unionWith:(c,a,b)=>Array.from(new Set([...c,...a.filter((a)=>-1===c.findIndex((c)=>b(a,c)))])),uniqueElements:(a)=>[...new Set(a)],untildify:(a)=>a.replace(/^~($|\/|\\)/,`${'undefined'!=typeof require&&require('os').homedir()}$1`),unzip:(a)=>a.reduce((a,b)=>(b.forEach((b,c)=>a[c].push(b)),a),Array.from({length:g(...a.map((a)=>a.length))}).map(()=>[])),unzipWith:(a,b)=>a.reduce((a,b)=>(b.forEach((b,c)=>a[c].push(b)),a),Array.from({length:g(...a.map((a)=>a.length))}).map(()=>[])).map((a)=>b(...a)),validateNumber:(a)=>!isNaN(parseFloat(a))&&isFinite(a)&&+a==a,without:(a,...b)=>a.filter((a)=>!b.includes(a)),words:(a,b=/[^a-zA-Z-]+/)=>a.split(b).filter(Boolean),xProd:(c,a)=>c.reduce((b,c)=>b.concat(a.map((a)=>[c,a])),[]),yesNo:(a,b=!1)=>!!/^(y|yes)$/i.test(a)||!/^(n|no)$/i.test(a)&&b,zip:(...a)=>{const b=g(...a.map((a)=>a.length));return Array.from({length:b}).map((b,c)=>Array.from({length:a.length},(b,d)=>a[d][c]))},zipObject:(a,b)=>a.reduce((a,c,d)=>(a[c]=b[d],a),{}),zipWith:(...a)=>{const b=a.length;let c=1a.length)),e=Array.from({length:d}).map((b,c)=>Array.from({length:a.length},(b,d)=>a[d][c]));return c?e.map((a)=>c(...a)):e}}}); diff --git a/test/isAnagram/isAnagram.js b/test/isAnagram/isAnagram.js index df206c4b9..41b26aa83 100644 --- a/test/isAnagram/isAnagram.js +++ b/test/isAnagram/isAnagram.js @@ -1,5 +1,11 @@ const isAnagram = (str1, str2) => { -const normalize = str => str.toLowerCase().replace(/[^a-z0-9]/gi, '').split('').sort().join(''); +const normalize = str => +str +.toLowerCase() +.replace(/[^a-z0-9]/gi, '') +.split('') +.sort() +.join(''); return normalize(str1) === normalize(str2); }; -module.exports = isAnagram; +module.exports = isAnagram; \ No newline at end of file diff --git a/test/permutations/permutations.js b/test/permutations/permutations.js index 165b38dc9..6c002e581 100644 --- a/test/permutations/permutations.js +++ b/test/permutations/permutations.js @@ -3,10 +3,7 @@ if (arr.length <= 2) return arr.length === 2 ? [arr, [arr[1], arr[0]]] : arr; return arr.reduce( (acc, item, i) => acc.concat( -permutations([...arr.slice(0, i), ...arr.slice(i + 1)]).map(val => [ -item, -...val, -]) +permutations([...arr.slice(0, i), ...arr.slice(i + 1)]).map(val => [item, ...val]) ), [] ); diff --git a/test/testlog b/test/testlog index 0139bd3ae..25b5a5ede 100644 --- a/test/testlog +++ b/test/testlog @@ -1,1823 +1,1930 @@ -Test log for: Mon Feb 19 2018 15:47:32 GMT+0200 (GTB Standard Time) +Test log for: Mon Feb 19 2018 20:25:18 GMT+0000 (UTC) -> 30-seconds-of-code@0.0.1 test G:\My Files\git Repositories\30-seconds-of-code +> 30-seconds-of-code@0.0.2 test /home/travis/build/Chalarangelo/30-seconds-of-code > tape test/**/*.test.js | tap-spec - Testing arrayToHtmlList - - √ arrayToHtmlList is a Function - - Testing ary - - √ ary is a Function - √ Discards arguments with index >=n - - Testing atob - - √ atob is a Function - √ atob("Zm9vYmFy") equals "foobar" - √ atob("Z") returns "" - - Testing attempt - - √ attempt is a Function - √ Returns a value - √ Returns an error - - Testing average - - √ average is a Function - √ average(true) returns 0 - √ average(false) returns 1 - √ average(9, 1) returns 5 - √ average(153, 44, 55, 64, 71, 1122, 322774, 2232, 23423, 234, 3631) returns 32163.909090909092 - √ average(1, 2, 3) returns 2 - √ average(null) returns 0 - √ average(1, 2, 3) returns NaN - √ average(String) returns NaN - √ average({ a: 123}) returns NaN - √ average([undefined, 0, string]) returns NaN - √ head([1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 1122, 32124, 23232]) takes less than 2s to run - - Testing averageBy - - √ averageBy is a Function - √ Produces the right result with a function - √ Produces the right result with a property name - - Testing binarySearch - - √ binarySearch is a Function - √ Finds item in array - √ Returns -1 when not found - √ Works with empty arrays - √ Works for one element arrays - - Testing bind - - √ bind is a Function - √ Binds to an object context - - Testing bindAll - - √ bindAll is a Function - √ Binds to an object context - - Testing bindKey - - √ bindKey is a Function - √ Binds function to an object context - - Testing bottomVisible - - √ bottomVisible is a Function - √ Tested on 09/02/2018 by @chalarangelo - - Testing btoa - - √ btoa is a Function - √ btoa("foobar") equals "Zm9vYmFy" - - Testing byteSize - - √ byteSize is a Function - √ Works for a single letter - √ Works for a common string - √ Works for emoji - - Testing call - - √ call is a Function - √ Calls function on given object - - Testing capitalize - - √ capitalize is a Function - √ Capitalizes the first letter of a string - √ Capitalizes the first letter of a string - √ Works with characters - √ Works with single character words - - Testing capitalizeEveryWord - - √ capitalizeEveryWord is a Function - √ Capitalizes the first letter of every word in a string - √ Works with characters - √ Works with one word string - - Testing castArray - - √ castArray is a Function - √ Works for single values - √ Works for arrays with one value - √ Works for arrays with multiple value - √ Works for strings - √ Works for objects - - Testing chainAsync - - √ chainAsync is a Function - - Testing chunk - - √ chunk is a Function - √ chunk([1, 2, 3, 4, 5], 2) returns [[1,2],[3,4],[5]] - √ chunk([]) returns [] - √ chunk(123) returns [] - √ chunk({ a: 123}) returns [] - √ chunk(string, 2) returns [ st, ri, ng ] - √ chunk() throws an error - √ chunk(undefined) throws an error - √ chunk(null) throws an error - √ chunk(This is a string, 2) takes less than 2s to run - - Testing clampNumber - - √ clampNumber is a Function - √ Clamps num within the inclusive range specified by the boundary values a and b - - Testing cleanObj - - √ cleanObj is a Function - √ Removes any properties except the ones specified from a JSON object - - Testing cloneRegExp - - √ cloneRegExp is a Function - √ Clones regular expressions properly - - Testing coalesce - - √ coalesce is a Function - √ Returns the first non-null/undefined argument - - Testing coalesceFactory - - √ coalesceFactory is a Function - √ Returns a customized coalesce function - - Testing collatz - - √ collatz is a Function - √ When n is even, divide by 2 - √ When n is odd, times by 3 and add 1 - √ Eventually reaches 1 - - Testing collectInto - - √ collectInto is a Function - - Testing colorize - - √ colorize is a Function - √ Tested on 09/02/2018 by @chalarangelo - - Testing compact - - √ compact is a Function - √ Removes falsey values from an array - - Testing compose - - √ compose is a Function - √ Performs right-to-left function composition - - Testing composeRight - - √ composeRight is a Function - √ Performs left-to-right function composition - - Testing converge - - √ converge is a Function - √ Produces the average of the array - √ Produces the strange concatenation - - Testing copyToClipboard - - √ copyToClipboard is a Function - √ Tested on 09/02/2018 by @chalarangelo - - Testing countBy - - √ countBy is a Function - √ Works for functions - √ Works for property names - - Testing countOccurrences - - √ countOccurrences is a Function - √ Counts the occurrences of a value in an array - - Testing countVowels - - √ countVowels is a Function - - Testing createElement - - √ createElement is a Function - - Testing createEventHub - - √ createEventHub is a Function - - Testing currentURL - - √ currentURL is a Function - - Testing curry - - √ curry is a Function - √ curries a Math.pow - √ curries a Math.min - - Testing debounce - - √ debounce is a Function - - Testing decapitalize - - √ decapitalize is a Function - √ Works with default parameter - √ Works with second parameter set to true - - Testing deepClone - - √ deepClone is a Function - √ Shallow cloning works - √ Deep cloning works - - Testing deepFlatten - - √ deepFlatten is a Function - √ Deep flattens an array - - Testing defaults - - √ defaults is a Function - - Testing defer - - √ defer is a Function - - Testing delay - - √ delay is a Function - - Testing detectDeviceType - - √ detectDeviceType is a Function - √ Tested on 09/02/2018 by @chalarangelo - - Testing difference - - √ difference is a Function - √ Returns the difference between two arrays - - Testing differenceBy - - √ differenceBy is a Function - √ Works using a native function and numbers - √ Works with arrow function and objects - - Testing differenceWith - - √ differenceWith is a Function - √ Filters out all values from an array - - Testing digitize - - √ digitize is a Function - √ Converts a number to an array of digits - - Testing distance - - √ distance is a Function - √ Calculates the distance between two points - - Testing drop - - √ drop is a Function - √ Works without the last argument - √ Removes appropriate element count as specified - √ Empties array given a count greater than length - - Testing dropRight - - √ dropRight is a Function - √ Returns a new array with n elements removed from the right - √ Returns a new array with n elements removed from the right - √ Returns a new array with n elements removed from the right - - Testing dropRightWhile - - √ dropRightWhile is a Function - √ Removes elements from the end of an array until the passed function returns true. - - Testing dropWhile - - √ dropWhile is a Function - √ Removes elements in an array until the passed function returns true. - - Testing elementIsVisibleInViewport - - √ elementIsVisibleInViewport is a Function - √ Tested on 09/02/2018 by @chalarangelo - - Testing elo - - √ elo is a Function - √ Standard 1v1s - √ should be equivalent - √ 4 player FFA, all same rank - - Testing equals - - √ equals is a Function - √ { a: [2, {e: 3}], b: [4], c: 'foo' } is equal to { a: [2, {e: 3}], b: [4], c: 'foo' } - √ [1,2,3] is equal to [1,2,3] - √ { a: [2, 3], b: [4] } is not equal to { a: [2, 3], b: [6] } - √ [1,2,3] is not equal to [1,2,4] - √ [1, 2, 3] should be equal to { 0: 1, 1: 2, 2: 3 }) - type is different, but their enumerable properties match. - - Testing escapeHTML - - √ escapeHTML is a Function - √ Escapes a string for use in HTML - - Testing escapeRegExp - - √ escapeRegExp is a Function - √ Escapes a string to use in a regular expression - - Testing everyNth - - √ everyNth is a Function - √ Returns every nth element in an array - - Testing extendHex - - √ extendHex is a Function - √ Extends a 3-digit color code to a 6-digit color code - √ Extends a 3-digit color code to a 6-digit color code - - Testing factorial - - √ factorial is a Function - √ Calculates the factorial of 720 - √ Calculates the factorial of 0 - √ Calculates the factorial of 1 - √ Calculates the factorial of 4 - √ Calculates the factorial of 10 - - Testing factors - - √ factors is a Function - - Testing fibonacci - - √ fibonacci is a Function - √ Generates an array, containing the Fibonacci sequence - - Testing fibonacciCountUntilNum - - √ fibonacciCountUntilNum is a Function - - Testing fibonacciUntilNum - - √ fibonacciUntilNum is a Function - - Testing filterNonUnique - - √ filterNonUnique is a Function - √ Filters out the non-unique values in an array - - Testing findKey - - √ findKey is a Function - √ Returns the appropriate key - - Testing findLast - - √ findLast is a Function - √ Finds last element for which the given function returns true - - Testing findLastIndex - - √ findLastIndex is a Function - √ Finds last index for which the given function returns true - - Testing findLastKey - - √ findLastKey is a Function - √ Returns the appropriate key - - Testing flatten - - √ flatten is a Function - √ Flattens an array - √ Flattens an array - - Testing flattenObject - - √ flattenObject is a Function - √ Flattens an object with the paths for keys - √ Works with arrays - - Testing flip - - √ flip is a Function - √ Flips argument order - - Testing forEachRight - - √ forEachRight is a Function - √ Iterates over the array in reverse - - Testing formatDuration - - √ formatDuration is a Function - √ Returns the human readable format of the given number of milliseconds - √ Returns the human readable format of the given number of milliseconds - - Testing forOwn - - √ forOwn is a Function - √ Iterates over an element's key-value pairs - - Testing forOwnRight - - √ forOwnRight is a Function - √ Iterates over an element's key-value pairs in reverse - - Testing fromCamelCase - - √ fromCamelCase is a Function - √ Converts a string from camelcase - √ Converts a string from camelcase - √ Converts a string from camelcase - - Testing functionName - - √ functionName is a Function - √ Works for native functions - √ Works for functions - √ Works for arrow functions - - Testing functions - - √ functions is a Function - √ Returns own methods - √ Returns own and inherited methods - - Testing gcd - - √ gcd is a Function - √ Calculates the greatest common divisor between two or more numbers/arrays - √ Calculates the greatest common divisor between two or more numbers/arrays - - Testing geometricProgression - - √ geometricProgression is a Function - √ Initializes an array containing the numbers in the specified range - √ Initializes an array containing the numbers in the specified range - √ Initializes an array containing the numbers in the specified range - - Testing get - - √ get is a Function - √ Retrieve a property indicated by the selector from an object. - - Testing getColonTimeFromDate - - √ getColonTimeFromDate is a Function - - Testing getDaysDiffBetweenDates - - √ getDaysDiffBetweenDates is a Function - √ Returns the difference in days between two dates - - Testing getMeridiemSuffixOfInteger - - √ getMeridiemSuffixOfInteger is a Function - - Testing getScrollPosition - - √ getScrollPosition is a Function - - Testing getStyle - - √ getStyle is a Function - - Testing getType - - √ getType is a Function - √ Returns the native type of a value - - Testing getURLParameters - - √ getURLParameters is a Function - √ Returns an object containing the parameters of the current URL - - Testing groupBy - - √ groupBy is a Function - √ Groups the elements of an array based on the given function - √ Groups the elements of an array based on the given function - - Testing hammingDistance - - √ hammingDistance is a Function - √ retuns hamming disance between 2 values - - Testing hasClass - - √ hasClass is a Function - - Testing hasFlags - - √ hasFlags is a Function - - Testing hashBrowser - - √ hashBrowser is a Function - - Testing hashNode - - √ hashNode is a Function - - Testing head - - √ head is a Function - √ head({ a: 1234}) returns undefined - √ head([1, 2, 3]) returns 1 - √ head({ 0: false}) returns false - √ head(String) returns S - √ head(null) throws an Error - √ head(undefined) throws an Error - √ head() throws an Error - √ head([1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 1122, 32124, 23232]) takes less than 2s to run - - Testing hexToRGB - - √ hexToRGB is a Function - √ Converts a color code to a rgb() or rgba() string - √ Converts a color code to a rgb() or rgba() string - √ Converts a color code to a rgb() or rgba() string - - Testing hide - - √ hide is a Function - - Testing howManyTimes - - √ howManyTimes is a Function - - Testing httpDelete - - √ httpDelete is a Function - - Testing httpGet - - √ httpGet is a Function - - Testing httpPost - - √ httpPost is a Function - - Testing httpPut - - √ httpPut is a Function - - Testing httpsRedirect - - √ httpsRedirect is a Function - √ Tested on 09/02/2018 by @chalarangelo - - Testing indexOfAll - - √ indexOfAll is a Function - √ Returns all indices of val in an array - √ Returns all indices of val in an array - - Testing initial - - √ initial is a Function - √ Returns all the elements of an array except the last one - - Testing initialize2DArray - - √ initialize2DArray is a Function - √ Initializes a 2D array of given width and height and value - - Testing initializeArrayWithRange - - √ initializeArrayWithRange is a Function - √ Initializes an array containing the numbers in the specified range - - Testing initializeArrayWithRangeRight - - √ initializeArrayWithRangeRight is a Function - - Testing initializeArrayWithValues - - √ initializeArrayWithValues is a Function - √ Initializes and fills an array with the specified values - - Testing inRange - - √ inRange is a Function - √ The given number falls within the given range - √ The given number falls within the given range - √ The given number does not falls within the given range - √ The given number does not falls within the given range - - Testing intersection - - √ intersection is a Function - √ Returns a list of elements that exist in both arrays - - Testing intersectionBy - - √ intersectionBy is a Function - √ Returns a list of elements that exist in both arrays, after applying the provided function to each array element of both - - Testing intersectionWith - - √ intersectionWith is a Function - √ Returns a list of elements that exist in both arrays, using a provided comparator function - - Testing invertKeyValues - - √ invertKeyValues is a Function - √ invertKeyValues({ a: 1, b: 2, c: 1 }) returns { 1: [ 'a', 'c' ], 2: [ 'b' ] } - √ invertKeyValues({ a: 1, b: 2, c: 1 }, value => 'group' + value) returns { group1: [ 'a', 'c' ], group2: [ 'b' ] } - - Testing is - - √ is is a Function - √ Works for arrays with data - √ Works for empty arrays - √ Works for arrays, not objects - √ Works for objects - √ Works for maps - √ Works for regular expressions - √ Works for sets - √ Works for weak maps - √ Works for weak sets - √ Works for strings - returns false for primitive - √ Works for strings - returns true when using constructor - √ Works for numbers - returns false for primitive - √ Works for numbers - returns true when using constructor - √ Works for booleans - returns false for primitive - √ Works for booleans - returns true when using constructor - √ Works for functions - - Testing isAbsoluteURL - - √ isAbsoluteURL is a Function - √ Given string is an absolute URL - √ Given string is an absolute URL - √ Given string is not an absolute URL - - Testing isAnagram - - √ isAnagram is a Function - √ Checks valid anagram - √ Works with spaces - √ Ignores case - √ Ignores special characters - - Testing isArmstrongNumber - - √ isArmstrongNumber is a Function - - Testing isArray - - √ isArray is a Function - √ passed value is an array - √ passed value is not an array - - Testing isArrayBuffer - - √ isArrayBuffer is a Function - - Testing isArrayLike - - √ isArrayLike is a Function - √ Returns true for a string - √ Returns true for an array - √ Returns false for null - - Testing isBoolean - - √ isBoolean is a Function - √ passed value is not a boolean - √ passed value is not a boolean - - Testing isDivisible - - √ isDivisible is a Function - √ The number 6 is divisible by 3 - - Testing isEmpty - - √ isEmpty is a Function - √ Returns true for empty Map - √ Returns true for empty Set - √ Returns true for empty array - √ Returns true for empty object - √ Returns true for empty string - √ Returns false for non-empty array - √ Returns false for non-empty object - √ Returns false for non-empty string - √ Returns true - type is not considered a collection - √ Returns true - type is not considered a collection - - Testing isEven - - √ isEven is a Function - √ 4 is even number - √ undefined - - Testing isFunction - - √ isFunction is a Function - √ passed value is a function - √ passed value is not a function - - Testing isLowerCase - - √ isLowerCase is a Function - √ passed string is a lowercase - √ passed string is a lowercase - √ passed value is not a lowercase - - Testing isMap - - √ isMap is a Function - - Testing isNil - - √ isNil is a Function - √ Returns true for null - √ Returns true for undefined - √ Returns false for an empty string - - Testing isNull - - √ isNull is a Function - √ passed argument is a null - √ passed argument is a null - - Testing isNumber - - √ isNumber is a Function - √ passed argument is a number - √ passed argument is not a number - - Testing isObject - - √ isObject is a Function - √ isObject([1, 2, 3, 4]) is a object - √ isObject([]) is a object - √ isObject({ a:1 }) is a object - √ isObject(true) is not a object - - Testing isObjectLike - - √ isObjectLike is a Function - √ Returns true for an object - √ Returns true for an array - √ Returns false for a function - √ Returns false for null - - Testing isPlainObject - - √ isPlainObject is a Function - √ Returns true for a plain object - √ Returns false for a Map (example of non-plain object) - - Testing isPrime - - √ isPrime is a Function - √ passed number is a prime - - Testing isPrimitive - - √ isPrimitive is a Function - √ isPrimitive(null) is primitive - √ isPrimitive(undefined) is primitive - √ isPrimitive(string) is primitive - √ isPrimitive(true) is primitive - √ isPrimitive(50) is primitive - √ isPrimitive('Hello') is primitive - √ isPrimitive(false) is primitive - √ isPrimitive(Symbol()) is primitive - √ isPrimitive([1, 2, 3]) is not primitive - √ isPrimitive({ a: 123 }) is not primitive - √ isPrimitive({ a: 123 }) takes less than 2s to run - - Testing isPromiseLike - - √ isPromiseLike is a Function - √ Returns true for a promise-like object - √ Returns false for null - √ Returns false for an empty object - - Testing isRegExp - - √ isRegExp is a Function - - Testing isSet - - √ isSet is a Function - - Testing isSorted - - √ isSorted is a Function - √ Array is sorted in ascending order - √ Array is sorted in descending order - √ Array is not sorted, direction changed in array - - Testing isString - - √ isString is a Function - √ foo is a string - √ "10" is a string - √ Empty string is a string - √ 10 is not a string - √ true is not string - - Testing isSymbol - - √ isSymbol is a Function - √ Checks if the given argument is a symbol - - Testing isTravisCI - - √ isTravisCI is a Function - √ Not running on Travis, correctly evaluates - - Testing isTypedArray - - √ isTypedArray is a Function - - Testing isUndefined - - √ isUndefined is a Function - √ Returns true for undefined - - Testing isUpperCase - - √ isUpperCase is a Function - √ ABC is all upper case - √ abc is not all upper case - √ A3@$ is all uppercase - - Testing isValidJSON - - √ isValidJSON is a Function - √ {"name":"Adam","age":20} is a valid JSON - √ {"name":"Adam",age:"20"} is not a valid JSON - √ null is a valid JSON - - Testing isWeakMap - - √ isWeakMap is a Function - - Testing isWeakSet - - √ isWeakSet is a Function - - Testing join - - √ join is a Function - √ Joins all elements of an array into a string and returns this string - √ Joins all elements of an array into a string and returns this string - √ Joins all elements of an array into a string and returns this string - Testing JSONToDate - √ JSONToDate is a Function + ✔ JSONToDate is a Function Testing JSONToFile - √ JSONToFile is a Function - √ Tested on 09/02/2018 by @chalarangelo - - Testing last - - √ last is a Function - √ last({ a: 1234}) returns undefined - √ last([1, 2, 3]) returns 3 - √ last({ 0: false}) returns undefined - √ last(String) returns g - √ last(null) throws an Error - √ last(undefined) throws an Error - √ last() throws an Error - √ last([1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 1122, 32124, 23232]) takes less than 2s to run - - Testing lcm - - √ lcm is a Function - √ Returns the least common multiple of two or more numbers. - √ Returns the least common multiple of two or more numbers. - - Testing longestItem - - √ longestItem is a Function - √ Returns the longest object - - Testing lowercaseKeys - - √ lowercaseKeys is a Function - √ Lowercases object keys - √ Does not mutate original object - - Testing luhnCheck - - √ luhnCheck is a Function - √ validates identification number - √ validates identification number - √ validates identification number - - Testing mapKeys - - √ mapKeys is a Function - √ Maps keys - - Testing mapObject - - √ mapObject is a Function - √ mapObject([1, 2, 3], a => a * a) returns { 1: 1, 2: 4, 3: 9 } - √ mapObject([1, 2, 3, 4], (a, b) => b - a) returns { 1: -1, 2: -1, 3: -1, 4: -1 } - √ mapObject([1, 2, 3, 4], (a, b) => a - b) returns { 1: 1, 2: 1, 3: 1, 4: 1 } - - Testing mapValues - - √ mapValues is a Function - √ Maps values - - Testing mask - - √ mask is a Function - √ Replaces all but the last num of characters with the specified mask character - √ Replaces all but the last num of characters with the specified mask character - √ Replaces all but the last num of characters with the specified mask character - - Testing matches - - √ matches is a Function - √ Matches returns true for two similar objects - √ Matches returns false for two non-similar objects - - Testing matchesWith - - √ matchesWith is a Function - √ Returns true for two objects with similar values, based on the provided function - - Testing maxBy - - √ maxBy is a Function - √ Produces the right result with a function - √ Produces the right result with a property name - - Testing maxN - - √ maxN is a Function - √ Returns the n maximum elements from the provided array - √ Returns the n maximum elements from the provided array - - Testing median - - √ median is a Function - √ Returns the median of an array of numbers - √ Returns the median of an array of numbers - - Testing memoize - - √ memoize is a Function - √ Function works properly - √ Function works properly - √ Cache stores values - - Testing merge - - √ merge is a Function - √ Merges two objects - - Testing minBy - - √ minBy is a Function - √ Produces the right result with a function - √ Produces the right result with a property name - - Testing minN - - √ minN is a Function - √ Returns the n minimum elements from the provided array - √ Returns the n minimum elements from the provided array - - Testing negate - - √ negate is a Function - √ Negates a predicate function - - Testing nthArg - - √ nthArg is a Function - √ Returns the nth argument - √ Returns undefined if arguments too few - √ Works for negative values - - Testing nthElement - - √ nthElement is a Function - √ Returns the nth element of an array. - √ Returns the nth element of an array. - - Testing objectFromPairs - - √ objectFromPairs is a Function - √ Creates an object from the given key-value pairs. - - Testing objectToPairs - - √ objectToPairs is a Function - √ Creates an array of key-value pair arrays from an object. - - Testing observeMutations - - √ observeMutations is a Function - √ Tested on 09/02/2018 by @chalarangelo - - Testing off - - √ off is a Function - - Testing omit - - √ omit is a Function - √ Omits the key-value pairs corresponding to the given keys from an object - - Testing omitBy - - √ omitBy is a Function - √ Creates an object composed of the properties the given function returns falsey for - - Testing on - - √ on is a Function - - Testing once - - √ once is a Function - - Testing onUserInputChange - - √ onUserInputChange is a Function - - Testing orderBy - - √ orderBy is a Function - √ Returns a sorted array of objects ordered by properties and orders. - √ Returns a sorted array of objects ordered by properties and orders. - - Testing over - - √ over is a Function - √ Applies given functions over multiple arguments - - Testing overArgs - - √ overArgs is a Function - √ Invokes the provided function with its arguments transformed - - Testing palindrome - - √ palindrome is a Function - √ Given string is a palindrome - √ Given string is not a palindrome - - Testing parseCookie - - √ parseCookie is a Function - √ Parses the cookie - - Testing partial - - √ partial is a Function - √ Prepends arguments - - Testing partialRight - - √ partialRight is a Function - √ Appends arguments - - Testing partition - - √ partition is a Function - √ Groups the elements into two arrays, depending on the provided function's truthiness for each element. - - Testing percentile - - √ percentile is a Function - √ Uses the percentile formula to calculate how many numbers in the given array are less or equal to the given value. - - Testing permutations - - √ permutations is a Function - √ Generates all permutations of an array - - Testing pick - - √ pick is a Function - √ Picks the key-value pairs corresponding to the given keys from an object. - - Testing pickBy - - √ pickBy is a Function - √ Creates an object composed of the properties the given function returns truthy for. - - Testing pipeAsyncFunctions - - √ pipeAsyncFunctions is a Function - √ Produces the appropriate hash - √ pipeAsyncFunctions result should be 15 - - Testing pipeFunctions - - √ pipeFunctions is a Function - √ Performs left-to-right function composition - - Testing pluralize - - √ pluralize is a Function - √ Produces the plural of the word - √ Produces the singular of the word - √ Produces the plural of the word - √ Prodices the defined plural of the word - √ Works with a dictionary - - Testing powerset - - √ powerset is a Function - √ Returns the powerset of a given array of numbers. - - Testing prettyBytes - - √ prettyBytes is a Function - √ Converts a number in bytes to a human-readable string. - √ Converts a number in bytes to a human-readable string. - √ Converts a number in bytes to a human-readable string. - - Testing primes - - √ primes is a Function - √ Generates primes up to a given number, using the Sieve of Eratosthenes. - - Testing promisify - - √ promisify is a Function - √ Returns a promise - - Testing pull - - √ pull is a Function - √ Pulls the specified values - - Testing pullAtIndex - - √ pullAtIndex is a Function - √ Pulls the given values - √ Pulls the given values - - Testing pullAtValue - - √ pullAtValue is a Function - √ Pulls the specified values - √ Pulls the specified values - - Testing pullBy - - √ pullBy is a Function - √ Pulls the specified values - - Testing quickSort - - √ quickSort is a Function - √ quickSort([5, 6, 4, 3, 1, 2]) returns [1, 2, 3, 4, 5, 6] - √ quickSort([-1, 0, -2]) returns [-2, -1, 0] - √ quickSort() throws an error - √ quickSort(123) throws an error - √ quickSort({ 234: string}) throws an error - √ quickSort(null) throws an error - √ quickSort(undefined) throws an error - √ quickSort([11, 1, 324, 23232, -1, 53, 2, 524, 32, 13, 156, 133, 62, 12, 4]) takes less than 2s to run - - Testing randomHexColorCode - - √ randomHexColorCode is a Function - √ should be equal - - Testing randomIntArrayInRange - - √ randomIntArrayInRange is a Function - √ The returned array contains only integers - √ The returned array has the proper length - √ The returned array's values lie between provided lowerLimit and upperLimit (both inclusive). - - Testing randomIntegerInRange - - √ randomIntegerInRange is a Function - √ The returned value is an integer - √ The returned value lies between provided lowerLimit and upperLimit (both inclusive). - - Testing randomNumberInRange - - √ randomNumberInRange is a Function - √ The returned value is a number - √ The returned value lies between provided lowerLimit and upperLimit (both inclusive). - - Testing readFileLines - - √ readFileLines is a Function - √ Tested on 09/02/2018 by @chalarangelo - - Testing rearg - - √ rearg is a Function - √ Reorders arguments in invoked function - - Testing redirect - - √ redirect is a Function - √ Tested on 09/02/2018 by @chalarangelo - - Testing reducedFilter - - √ reducedFilter is a Function - √ Filter an array of objects based on a condition while also filtering out unspecified keys. - - Testing reduceSuccessive - - √ reduceSuccessive is a Function - √ Returns the array of successively reduced values - - Testing reduceWhich - - √ reduceWhich is a Function - √ Returns the minimum of an array - √ Returns the maximum of an array - √ Returns the object with the minimum specified value in an array - - Testing remove - - √ remove is a Function - √ Removes elements from an array for which the given function returns false - - Testing removeNonASCII - - √ removeNonASCII is a Function - √ Removes non-ASCII characters - - Testing removeVowels - - √ removeVowels is a Function - - Testing reverseString - - √ reverseString is a Function - √ Reverses a string. + ✔ JSONToFile is a Function + ✔ Tested on 09/02/2018 by @chalarangelo Testing RGBToHex - √ RGBToHex is a Function - √ Converts the values of RGB components to a color code. - - Testing round - - √ round is a Function - √ round(1.005, 2) returns 1.01 - √ round(123.3423345345345345344, 11) returns 123.34233453453 - √ round(3.342, 11) returns 3.342 - √ round(1.005) returns 1 - √ round([1.005, 2]) returns NaN - √ round(string) returns NaN - √ round() returns NaN - √ round(132, 413, 4134) returns NaN - √ round({a: 132}, 413) returns NaN - √ round(123.3423345345345345344, 11) takes less than 2s to run - - Testing runAsync - - √ runAsync is a Function - √ Tested on 09/02/2018 by @chalarangelo - - Testing runPromisesInSeries - - √ runPromisesInSeries is a Function - - Testing sample - - √ sample is a Function - √ Returns a random element from the array - √ Works for single-element arrays - √ Returns undefined for empty array - - Testing sampleSize - - √ sampleSize is a Function - √ Returns a single element without n specified - √ Returns a random sample of specified size from an array - √ Returns all elements in an array if n >= length - √ Returns an empty array if original array is empty - √ Returns an empty array if n = 0 - - Testing scrollToTop - - √ scrollToTop is a Function - √ Tested on 09/02/2018 by @chalarangelo - - Testing sdbm - - √ sdbm is a Function - √ Hashes the input string into a whole number. - - Testing serializeCookie - - √ serializeCookie is a Function - √ Serializes the cookie - - Testing setStyle - - √ setStyle is a Function - - Testing shallowClone - - √ shallowClone is a Function - √ Shallow cloning works - √ Does not clone deeply - - Testing show - - √ show is a Function - - Testing shuffle - - √ shuffle is a Function - √ Shuffles the array - √ New array contains all original elements - √ Works for empty arrays - √ Works for single-element arrays - - Testing similarity - - √ similarity is a Function - √ Returns an array of elements that appear in both arrays. - - Testing size - - √ size is a Function - √ Get size of arrays, objects or strings. - √ Get size of arrays, objects or strings. - - Testing sleep - - √ sleep is a Function - - Testing solveRPN - - √ solveRPN is a Function - - Testing sortCharactersInString - - √ sortCharactersInString is a Function - √ Alphabetically sorts the characters in a string. - - Testing sortedIndex - - √ sortedIndex is a Function - √ Returns the lowest index at which value should be inserted into array in order to maintain its sort order. - √ Returns the lowest index at which value should be inserted into array in order to maintain its sort order. - - Testing sortedIndexBy - - √ sortedIndexBy is a Function - √ Returns the lowest index to insert the element without messing up the list order - - Testing sortedLastIndex - - √ sortedLastIndex is a Function - √ Returns the highest index to insert the element without messing up the list order - - Testing sortedLastIndexBy - - √ sortedLastIndexBy is a Function - √ Returns the highest index to insert the element without messing up the list order - - Testing speechSynthesis - - √ speechSynthesis is a Function - - Testing splitLines - - √ splitLines is a Function - √ Splits a multiline string into an array of lines. - - Testing spreadOver - - √ spreadOver is a Function - √ Takes a variadic function and returns a closure that accepts an array of arguments to map to the inputs of the function. - - Testing standardDeviation - - √ standardDeviation is a Function - √ Returns the standard deviation of an array of numbers - √ Returns the standard deviation of an array of numbers - - Testing stringPermutations - - √ stringPermutations is a Function - √ Generates all stringPermutations of a string - √ Works for single-letter strings - √ Works for empty strings - - Testing stripHTMLTags - - √ stripHTMLTags is a Function - √ Removes HTML tags - - Testing sum - - √ sum is a Function - √ Returns the sum of two or more numbers/arrays. - - Testing sumBy - - √ sumBy is a Function - - Testing sumPower - - √ sumPower is a Function - √ Returns the sum of the powers of all the numbers from start to end - √ Returns the sum of the powers of all the numbers from start to end - √ Returns the sum of the powers of all the numbers from start to end - - Testing symmetricDifference - - √ symmetricDifference is a Function - √ Returns the symmetric difference between two arrays. - - Testing symmetricDifferenceBy - - √ symmetricDifferenceBy is a Function - √ Returns the symmetric difference between two arrays, after applying the provided function to each array element of both - - Testing symmetricDifferenceWith - - √ symmetricDifferenceWith is a Function - √ Returns the symmetric difference between two arrays, using a provided function as a comparator - - Testing tail - - √ tail is a Function - √ Returns tail - √ Returns tail - - Testing take - - √ take is a Function - √ Returns an array with n elements removed from the beginning. - √ Returns an array with n elements removed from the beginning. - - Testing takeRight - - √ takeRight is a Function - √ Returns an array with n elements removed from the end - √ Returns an array with n elements removed from the end - - Testing takeRightWhile - - √ takeRightWhile is a Function - √ Removes elements until the function returns true - - Testing takeWhile - - √ takeWhile is a Function - √ Removes elements until the function returns true - - Testing throttle - - √ throttle is a Function - - Testing times - - √ times is a Function - √ Runs a function the specified amount of times - - Testing timeTaken - - √ timeTaken is a Function - - Testing toCamelCase - - √ toCamelCase is a Function - √ toCamelCase('some_database_field_name') returns someDatabaseFieldName - √ toCamelCase('Some label that needs to be camelized') returns someLabelThatNeedsToBeCamelized - √ toCamelCase('some-javascript-property') return someJavascriptProperty - √ toCamelCase('some-mixed_string with spaces_underscores-and-hyphens') returns someMixedStringWithSpacesUnderscoresAndHyphens - √ toCamelCase() throws a error - √ toCamelCase([]) throws a error - √ toCamelCase({}) throws a error - √ toCamelCase(123) throws a error - √ toCamelCase(some-mixed_string with spaces_underscores-and-hyphens) takes less than 2s to run - - Testing toCurrency - - √ toCurrency is a Function - √ currency: Euro | currencyLangFormat: Local - √ currency: US Dollar | currencyLangFormat: English (United States) - √ currency: Japanese Yen | currencyLangFormat: Local - - Testing toDecimalMark - - √ toDecimalMark is a Function - √ convert a float-point arithmetic to the Decimal mark form - - Testing toggleClass - - √ toggleClass is a Function - - Testing toKebabCase - - √ toKebabCase is a Function - √ toKebabCase('camelCase') returns camel-case - √ toKebabCase('some text') returns some-text - √ toKebabCase('some-mixed-string With spaces-underscores-and-hyphens') returns some-mixed-string-with-spaces-underscores-and-hyphens - √ toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') returns i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-some-xml-and-html - √ toKebabCase() return undefined - √ toKebabCase([]) throws an error - √ toKebabCase({}) throws an error - √ toKebabCase(123) throws an error - √ toKebabCase(IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML) takes less than 2s to run - - Testing tomorrow - - √ tomorrow is a Function - √ Returns the correct year - √ Returns the correct month - √ Returns the correct date - - Testing toOrdinalSuffix - - √ toOrdinalSuffix is a Function - √ Adds an ordinal suffix to a number - √ Adds an ordinal suffix to a number - √ Adds an ordinal suffix to a number - √ Adds an ordinal suffix to a number - - Testing toSafeInteger - - √ toSafeInteger is a Function - √ Number(toSafeInteger(3.2)) is a number - √ Converts a value to a safe integer - √ toSafeInteger('4.2') returns 4 - √ toSafeInteger(4.6) returns 5 - √ toSafeInteger([]) returns 0 - √ isNaN(toSafeInteger([1.5, 3124])) is true - √ isNaN(toSafeInteger('string')) is true - √ isNaN(toSafeInteger({})) is true - √ isNaN(toSafeInteger()) is true - √ toSafeInteger(Infinity) returns 9007199254740991 - √ toSafeInteger(3.2) takes less than 2s to run - - Testing toSnakeCase - - √ toSnakeCase is a Function - √ toSnakeCase('camelCase') returns camel_case - √ toSnakeCase('some text') returns some_text - √ toSnakeCase('some-mixed_string With spaces_underscores-and-hyphens') returns some_mixed_string_with_spaces_underscores_and_hyphens - √ toSnakeCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') returns i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html - √ toSnakeCase() returns undefined - √ toSnakeCase([]) throws an error - √ toSnakeCase({}) throws an error - √ toSnakeCase(123) throws an error - √ toSnakeCase(IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML) takes less than 2s to run - - Testing transform - - √ transform is a Function - √ Transforms an object - - Testing truncateString - - √ truncateString is a Function - √ Truncates a "boomerang" up to a specified length. - - Testing truthCheckCollection - - √ truthCheckCollection is a Function - √ second argument is truthy on all elements of a collection - - Testing unary - - √ unary is a Function - √ Discards arguments after the first one - - Testing unescapeHTML - - √ unescapeHTML is a Function - √ Unescapes escaped HTML characters. - - Testing unflattenObject - - √ unflattenObject is a Function - √ Unflattens an object with the paths for keys - - Testing unfold - - √ unfold is a Function - √ Works with a given function, producing an array - - Testing union - - √ union is a Function - √ union([1, 2, 3], [4, 3, 2]) returns [1, 2, 3, 4] - √ union('str', 'asd') returns [ 's', 't', 'r', 'a', 'd' ] - √ union([[], {}], [1, 2, 3]) returns [[], {}, 1, 2, 3] - √ union([], []) returns [] - √ union() throws an error - √ union(true, str) throws an error - √ union(false, true) throws an error - √ union(123, {}) throws an error - √ union([], {}) throws an error - √ union(undefined, null) throws an error - √ union([1, 2, 3], [4, 3, 2]) takes less than 2s to run - - Testing unionBy - - √ unionBy is a Function - √ Produces the appropriate results - - Testing unionWith - - √ unionWith is a Function - √ Produces the appropriate results - - Testing uniqueElements - - √ uniqueElements is a Function - √ uniqueElements([1, 2, 2, 3, 4, 4, 5]) returns [1,2,3,4,5] - √ uniqueElements([1, 23, 53]) returns [1, 23, 53] - √ uniqueElements([true, 0, 1, false, false, undefined, null, '']) returns [true, 0, 1, false, false, undefined, null, ''] - √ uniqueElements() returns [] - √ uniqueElements(null) returns [] - √ uniqueElements(undefined) returns [] - √ uniqueElements('strt') returns ['s', 't', 'r'] - √ uniqueElements(1, 1, 2543, 534, 5) throws an error - √ uniqueElements({}) throws an error - √ uniqueElements(true) throws an error - √ uniqueElements(false) throws an error - √ uniqueElements([true, 0, 1, false, false, undefined, null]) takes less than 2s to run - - Testing untildify - - √ untildify is a Function - √ Contains no tildes - √ Does not alter the rest of the path - √ Does not alter paths without tildes - - Testing unzip - - √ unzip is a Function - √ unzip([['a', 1, true], ['b', 2, false]]) equals [['a', 'b'], [1, 2], [true, false]] - √ unzip([['a', 1, true], ['b', 2]]) equals [['a', 'b'], [1, 2], [true]] - - Testing unzipWith - - √ unzipWith is a Function - √ unzipWith([[1, 10, 100], [2, 20, 200]], (...args) => args.reduce((acc, v) => acc + v, 0)) equals [3, 30, 300] + ✔ RGBToHex is a Function + ✔ Converts the values of RGB components to a color code. Testing URLJoin - √ URLJoin is a Function - √ Returns proper URL - √ Returns proper URL + ✔ URLJoin is a Function + ✔ Returns proper URL + ✔ Returns proper URL Testing UUIDGeneratorBrowser - √ UUIDGeneratorBrowser is a Function - √ Tested 09/02/2018 by @chalarangelo + ✔ UUIDGeneratorBrowser is a Function + ✔ Tested 09/02/2018 by @chalarangelo Testing UUIDGeneratorNode - √ UUIDGeneratorNode is a Function - √ Contains dashes in the proper places - √ Only contains hexadecimal digits + ✔ UUIDGeneratorNode is a Function + ✔ Contains dashes in the proper places + ✔ Only contains hexadecimal digits + + Testing all + + ✔ all is a Function + ✔ Returns true for arrays with no falsey values + ✔ Returns false for arrays with 0 + ✔ Returns false for arrays with NaN + ✔ Returns false for arrays with undefined + ✔ Returns false for arrays with null + ✔ Returns false for arrays with empty strings + ✔ Returns true with predicate function + ✔ Returns false with a predicate function + + Testing any + + ✔ any is a Function + ✔ Returns true for arrays with at least one truthy value + ✔ Returns false for arrays with no truthy values + ✔ Returns false for arrays with no truthy values + ✔ Returns true with predicate function + ✔ Returns false with a predicate function + + Testing approximatelyEqual + + ✔ approximatelyEqual is a Function + ✔ Works for PI / 2 + ✔ Works for 0.1 + 0.2 === 0.3 + ✔ Works for exactly equal values + ✔ Works for a custom epsilon + + Testing arrayToHtmlList + + ✔ arrayToHtmlList is a Function + ✔ Tested by @chalarangelo on 16/02/2018 + + Testing ary + + ✔ ary is a Function + ✔ Discards arguments with index >=n + + Testing atob + + ✔ atob is a Function + ✔ atob("Zm9vYmFy") equals "foobar" + ✔ atob("Z") returns "" + + Testing attempt + + ✔ attempt is a Function + ✔ Returns a value + ✔ Returns an error + + Testing average + + ✔ average is a Function + ✔ average(true) returns 0 + ✔ average(false) returns 1 + ✔ average(9, 1) returns 5 + ✔ average(153, 44, 55, 64, 71, 1122, 322774, 2232, 23423, 234, 3631) returns 32163.909090909092 + ✔ average(1, 2, 3) returns 2 + ✔ average(null) returns 0 + ✔ average(1, 2, 3) returns NaN + ✔ average(String) returns NaN + ✔ average({ a: 123}) returns NaN + ✔ average([undefined, 0, string]) returns NaN + ✔ average([1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 1122, 32124, 23232]) takes less than 2s to run + + Testing averageBy + + ✔ averageBy is a Function + ✔ Produces the right result with a function + ✔ Produces the right result with a property name + + Testing bifurcate + + ✔ bifurcate is a Function + ✔ Splits the collection into two groups + + Testing bifurcateBy + + ✔ bifurcateBy is a Function + ✔ Splits the collection into two groups + + Testing binarySearch + + ✔ binarySearch is a Function + ✔ Finds item in array + ✔ Returns -1 when not found + ✔ Works with empty arrays + ✔ Works for one element arrays + + Testing bind + + ✔ bind is a Function + ✔ Binds to an object context + + Testing bindAll + + ✔ bindAll is a Function + ✔ Binds to an object context + + Testing bindKey + + ✔ bindKey is a Function + ✔ Binds function to an object context + + Testing binomialCoefficient + + ✔ binomialCoefficient is a Function + ✔ Returns the appropriate value + ✔ Returns the appropriate value + ✔ Returns the appropriate value + ✔ Returns NaN + ✔ Returns NaN + + Testing bottomVisible + + ✔ bottomVisible is a Function + ✔ Tested on 09/02/2018 by @chalarangelo + + Testing btoa + + ✔ btoa is a Function + ✔ btoa("foobar") equals "Zm9vYmFy" + + Testing byteSize + + ✔ byteSize is a Function + ✔ Works for a single letter + ✔ Works for a common string + ✔ Works for emoji + + Testing call + + ✔ call is a Function + ✔ Calls function on given object + + Testing capitalize + + ✔ capitalize is a Function + ✔ Capitalizes the first letter of a string + ✔ Capitalizes the first letter of a string + ✔ Works with characters + ✔ Works with single character words + + Testing capitalizeEveryWord + + ✔ capitalizeEveryWord is a Function + ✔ Capitalizes the first letter of every word in a string + ✔ Works with characters + ✔ Works with one word string + + Testing castArray + + ✔ castArray is a Function + ✔ Works for single values + ✔ Works for arrays with one value + ✔ Works for arrays with multiple value + ✔ Works for strings + ✔ Works for objects + + Testing chainAsync + + ✔ chainAsync is a Function + ✔ Calls all functions in an array + + Testing chunk + + ✔ chunk is a Function + ✔ chunk([1, 2, 3, 4, 5], 2) returns [[1,2],[3,4],[5]] + ✔ chunk([]) returns [] + ✔ chunk(123) returns [] + ✔ chunk({ a: 123}) returns [] + ✔ chunk(string, 2) returns [ st, ri, ng ] + ✔ chunk() throws an error + ✔ chunk(undefined) throws an error + ✔ chunk(null) throws an error + ✔ chunk(This is a string, 2) takes less than 2s to run + + Testing clampNumber + + ✔ clampNumber is a Function + ✔ Clamps num within the inclusive range specified by the boundary values a and b + + Testing cleanObj + + ✔ cleanObj is a Function + ✔ Removes any properties except the ones specified from a JSON object + + Testing cloneRegExp + + ✔ cloneRegExp is a Function + ✔ Clones regular expressions properly + + Testing coalesce + + ✔ coalesce is a Function + ✔ Returns the first non-null/undefined argument + + Testing coalesceFactory + + ✔ coalesceFactory is a Function + ✔ Returns a customized coalesce function + + Testing collatz + + ✔ collatz is a Function + ✔ When n is even, divide by 2 + ✔ When n is odd, times by 3 and add 1 + ✔ Eventually reaches 1 + + Testing collectInto + + ✔ collectInto is a Function + + Testing colorize + + ✔ colorize is a Function + ✔ Tested on 09/02/2018 by @chalarangelo + + Testing compact + + ✔ compact is a Function + ✔ Removes falsey values from an array + + Testing compose + + ✔ compose is a Function + ✔ Performs right-to-left function composition + + Testing composeRight + + ✔ composeRight is a Function + ✔ Performs left-to-right function composition + + Testing converge + + ✔ converge is a Function + ✔ Produces the average of the array + ✔ Produces the strange concatenation + + Testing copyToClipboard + + ✔ copyToClipboard is a Function + ✔ Tested on 09/02/2018 by @chalarangelo + + Testing countBy + + ✔ countBy is a Function + ✔ Works for functions + ✔ Works for property names + + Testing countOccurrences + + ✔ countOccurrences is a Function + ✔ Counts the occurrences of a value in an array + + Testing countVowels + + ✔ countVowels is a Function + + Testing createElement + + ✔ createElement is a Function + ✔ Tested by @chalarangelo on 16/02/2018 + + Testing createEventHub + + ✔ createEventHub is a Function + ✔ Tested by @chalarangelo on 16/02/2018 + + Testing currentURL + + ✔ currentURL is a Function + ✔ Tested by @chalarangelo on 16/02/2018 + + Testing curry + + ✔ curry is a Function + ✔ curries a Math.pow + ✔ curries a Math.min + + Testing debounce + + ✔ debounce is a Function + + Testing decapitalize + + ✔ decapitalize is a Function + ✔ Works with default parameter + ✔ Works with second parameter set to true + + Testing deepClone + + ✔ deepClone is a Function + ✔ Shallow cloning works + ✔ Deep cloning works + + Testing deepFlatten + + ✔ deepFlatten is a Function + ✔ Deep flattens an array + + Testing defaults + + ✔ defaults is a Function + ✔ Assigns default values for undefined properties + + Testing defer + + ✔ defer is a Function + ✔ Tested by @chalarangelo on 16/02/2018 + + Testing degreesToRads + + ✔ degreesToRads is a Function + ✔ Returns the appropriate value + + Testing delay + + ✔ delay is a Function + + Testing detectDeviceType + + ✔ detectDeviceType is a Function + ✔ Tested on 09/02/2018 by @chalarangelo + + Testing difference + + ✔ difference is a Function + ✔ Returns the difference between two arrays + + Testing differenceBy + + ✔ differenceBy is a Function + ✔ Works using a native function and numbers + ✔ Works with arrow function and objects + + Testing differenceWith + + ✔ differenceWith is a Function + ✔ Filters out all values from an array + + Testing digitize + + ✔ digitize is a Function + ✔ Converts a number to an array of digits + + Testing distance + + ✔ distance is a Function + ✔ Calculates the distance between two points + + Testing drop + + ✔ drop is a Function + ✔ Works without the last argument + ✔ Removes appropriate element count as specified + ✔ Empties array given a count greater than length + + Testing dropRight + + ✔ dropRight is a Function + ✔ Returns a new array with n elements removed from the right + ✔ Returns a new array with n elements removed from the right + ✔ Returns a new array with n elements removed from the right + + Testing dropRightWhile + + ✔ dropRightWhile is a Function + ✔ Removes elements from the end of an array until the passed function returns true. + + Testing dropWhile + + ✔ dropWhile is a Function + ✔ Removes elements in an array until the passed function returns true. + + Testing elementIsVisibleInViewport + + ✔ elementIsVisibleInViewport is a Function + ✔ Tested on 09/02/2018 by @chalarangelo + + Testing elo + + ✔ elo is a Function + ✔ Standard 1v1s + ✔ should be equivalent + ✔ 4 player FFA, all same rank + + Testing equals + + ✔ equals is a Function + ✔ { a: [2, {e: 3}], b: [4], c: 'foo' } is equal to { a: [2, {e: 3}], b: [4], c: 'foo' } + ✔ [1,2,3] is equal to [1,2,3] + ✔ { a: [2, 3], b: [4] } is not equal to { a: [2, 3], b: [6] } + ✔ [1,2,3] is not equal to [1,2,4] + ✔ [1, 2, 3] should be equal to { 0: 1, 1: 2, 2: 3 }) - type is different, but their enumerable properties match. + + Testing escapeHTML + + ✔ escapeHTML is a Function + ✔ Escapes a string for use in HTML + + Testing escapeRegExp + + ✔ escapeRegExp is a Function + ✔ Escapes a string to use in a regular expression + + Testing everyNth + + ✔ everyNth is a Function + ✔ Returns every nth element in an array + + Testing extendHex + + ✔ extendHex is a Function + ✔ Extends a 3-digit color code to a 6-digit color code + ✔ Extends a 3-digit color code to a 6-digit color code + + Testing factorial + + ✔ factorial is a Function + ✔ Calculates the factorial of 720 + ✔ Calculates the factorial of 0 + ✔ Calculates the factorial of 1 + ✔ Calculates the factorial of 4 + ✔ Calculates the factorial of 10 + + Testing factors + + ✔ factors is a Function + + Testing fibonacci + + ✔ fibonacci is a Function + ✔ Generates an array, containing the Fibonacci sequence + + Testing fibonacciCountUntilNum + + ✔ fibonacciCountUntilNum is a Function + + Testing fibonacciUntilNum + + ✔ fibonacciUntilNum is a Function + + Testing filterNonUnique + + ✔ filterNonUnique is a Function + ✔ Filters out the non-unique values in an array + + Testing findKey + + ✔ findKey is a Function + ✔ Returns the appropriate key + + Testing findLast + + ✔ findLast is a Function + ✔ Finds last element for which the given function returns true + + Testing findLastIndex + + ✔ findLastIndex is a Function + ✔ Finds last index for which the given function returns true + + Testing findLastKey + + ✔ findLastKey is a Function + ✔ Returns the appropriate key + + Testing flatten + + ✔ flatten is a Function + ✔ Flattens an array + ✔ Flattens an array + + Testing flattenObject + + ✔ flattenObject is a Function + ✔ Flattens an object with the paths for keys + ✔ Works with arrays + + Testing flip + + ✔ flip is a Function + ✔ Flips argument order + + Testing forEachRight + + ✔ forEachRight is a Function + ✔ Iterates over the array in reverse + + Testing forOwn + + ✔ forOwn is a Function + ✔ Iterates over an element's key-value pairs + + Testing forOwnRight + + ✔ forOwnRight is a Function + ✔ Iterates over an element's key-value pairs in reverse + + Testing formatDuration + + ✔ formatDuration is a Function + ✔ Returns the human readable format of the given number of milliseconds + ✔ Returns the human readable format of the given number of milliseconds + + Testing fromCamelCase + + ✔ fromCamelCase is a Function + ✔ Converts a string from camelcase + ✔ Converts a string from camelcase + ✔ Converts a string from camelcase + + Testing functionName + + ✔ functionName is a Function + ✔ Works for native functions + ✔ Works for functions + ✔ Works for arrow functions + + Testing functions + + ✔ functions is a Function + ✔ Returns own methods + ✔ Returns own and inherited methods + + Testing gcd + + ✔ gcd is a Function + ✔ Calculates the greatest common divisor between two or more numbers/arrays + ✔ Calculates the greatest common divisor between two or more numbers/arrays + + Testing geometricProgression + + ✔ geometricProgression is a Function + ✔ Initializes an array containing the numbers in the specified range + ✔ Initializes an array containing the numbers in the specified range + ✔ Initializes an array containing the numbers in the specified range + + Testing get + + ✔ get is a Function + ✔ Retrieve a property indicated by the selector from an object. + + Testing getColonTimeFromDate + + ✔ getColonTimeFromDate is a Function + + Testing getDaysDiffBetweenDates + + ✔ getDaysDiffBetweenDates is a Function + ✔ Returns the difference in days between two dates + + Testing getMeridiemSuffixOfInteger + + ✔ getMeridiemSuffixOfInteger is a Function + + Testing getScrollPosition + + ✔ getScrollPosition is a Function + ✔ Tested by @chalarangelo on 16/02/2018 + + Testing getStyle + + ✔ getStyle is a Function + ✔ Tested by @chalarangelo on 16/02/2018 + + Testing getType + + ✔ getType is a Function + ✔ Returns the native type of a value + + Testing getURLParameters + + ✔ getURLParameters is a Function + ✔ Returns an object containing the parameters of the current URL + + Testing groupBy + + ✔ groupBy is a Function + ✔ Groups the elements of an array based on the given function + ✔ Groups the elements of an array based on the given function + + Testing hammingDistance + + ✔ hammingDistance is a Function + ✔ retuns hamming disance between 2 values + + Testing hasClass + + ✔ hasClass is a Function + + Testing hasFlags + + ✔ hasFlags is a Function + ✔ Tested by @chalarangelo on 16/02/2018 + + Testing hashBrowser + + ✔ hashBrowser is a Function + ✔ Tested by @chalarangelo on 16/02/2018 + + Testing hashNode + + ✔ hashNode is a Function + + Testing head + + ✔ head is a Function + ✔ head({ a: 1234}) returns undefined + ✔ head([1, 2, 3]) returns 1 + ✔ head({ 0: false}) returns false + ✔ head(String) returns S + ✔ head(null) throws an Error + ✔ head(undefined) throws an Error + ✔ head() throws an Error + ✔ head([1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 1122, 32124, 23232]) takes less than 2s to run + + Testing hexToRGB + + ✔ hexToRGB is a Function + ✔ Converts a color code to a rgb() or rgba() string + ✔ Converts a color code to a rgb() or rgba() string + ✔ Converts a color code to a rgb() or rgba() string + + Testing hide + + ✔ hide is a Function + ✔ Tested by @chalarangelo on 16/02/2018 + + Testing howManyTimes + + ✔ howManyTimes is a Function + + Testing httpDelete + + ✔ httpDelete is a Function + + Testing httpGet + + ✔ httpGet is a Function + + Testing httpPost + + ✔ httpPost is a Function + + Testing httpPut + + ✔ httpPut is a Function + + Testing httpsRedirect + + ✔ httpsRedirect is a Function + ✔ Tested on 09/02/2018 by @chalarangelo + + Testing inRange + + ✔ inRange is a Function + ✔ The given number falls within the given range + ✔ The given number falls within the given range + ✔ The given number does not falls within the given range + ✔ The given number does not falls within the given range + + Testing indexOfAll + + ✔ indexOfAll is a Function + ✔ Returns all indices of val in an array + ✔ Returns all indices of val in an array + + Testing initial + + ✔ initial is a Function + ✔ Returns all the elements of an array except the last one + + Testing initialize2DArray + + ✔ initialize2DArray is a Function + ✔ Initializes a 2D array of given width and height and value + + Testing initializeArrayWithRange + + ✔ initializeArrayWithRange is a Function + ✔ Initializes an array containing the numbers in the specified range + + Testing initializeArrayWithRangeRight + + ✔ initializeArrayWithRangeRight is a Function + + Testing initializeArrayWithValues + + ✔ initializeArrayWithValues is a Function + ✔ Initializes and fills an array with the specified values + + Testing intersection + + ✔ intersection is a Function + ✔ Returns a list of elements that exist in both arrays + + Testing intersectionBy + + ✔ intersectionBy is a Function + ✔ Returns a list of elements that exist in both arrays, after applying the provided function to each array element of both + + Testing intersectionWith + + ✔ intersectionWith is a Function + ✔ Returns a list of elements that exist in both arrays, using a provided comparator function + + Testing invertKeyValues + + ✔ invertKeyValues is a Function + ✔ invertKeyValues({ a: 1, b: 2, c: 1 }) returns { 1: [ 'a', 'c' ], 2: [ 'b' ] } + ✔ invertKeyValues({ a: 1, b: 2, c: 1 }, value => 'group' + value) returns { group1: [ 'a', 'c' ], group2: [ 'b' ] } + + Testing is + + ✔ is is a Function + ✔ Works for arrays with data + ✔ Works for empty arrays + ✔ Works for arrays, not objects + ✔ Works for objects + ✔ Works for maps + ✔ Works for regular expressions + ✔ Works for sets + ✔ Works for weak maps + ✔ Works for weak sets + ✔ Works for strings - returns false for primitive + ✔ Works for strings - returns true when using constructor + ✔ Works for numbers - returns false for primitive + ✔ Works for numbers - returns true when using constructor + ✔ Works for booleans - returns false for primitive + ✔ Works for booleans - returns true when using constructor + ✔ Works for functions + + Testing isAbsoluteURL + + ✔ isAbsoluteURL is a Function + ✔ Given string is an absolute URL + ✔ Given string is an absolute URL + ✔ Given string is not an absolute URL + + Testing isAnagram + + ✔ isAnagram is a Function + ✔ Checks valid anagram + ✔ Works with spaces + ✔ Ignores case + ✔ Ignores special characters + + Testing isArmstrongNumber + + ✔ isArmstrongNumber is a Function + + Testing isArray + + ✔ isArray is a Function + ✔ passed value is an array + ✔ passed value is not an array + + Testing isArrayBuffer + + ✔ isArrayBuffer is a Function + + Testing isArrayLike + + ✔ isArrayLike is a Function + ✔ Returns true for a string + ✔ Returns true for an array + ✔ Returns false for null + + Testing isBoolean + + ✔ isBoolean is a Function + ✔ passed value is not a boolean + ✔ passed value is not a boolean + + Testing isDivisible + + ✔ isDivisible is a Function + ✔ The number 6 is divisible by 3 + + Testing isEmpty + + ✔ isEmpty is a Function + ✔ Returns true for empty Map + ✔ Returns true for empty Set + ✔ Returns true for empty array + ✔ Returns true for empty object + ✔ Returns true for empty string + ✔ Returns false for non-empty array + ✔ Returns false for non-empty object + ✔ Returns false for non-empty string + ✔ Returns true - type is not considered a collection + ✔ Returns true - type is not considered a collection + + Testing isEven + + ✔ isEven is a Function + ✔ 4 is even number + ✔ undefined + + Testing isFunction + + ✔ isFunction is a Function + ✔ passed value is a function + ✔ passed value is not a function + + Testing isLowerCase + + ✔ isLowerCase is a Function + ✔ passed string is a lowercase + ✔ passed string is a lowercase + ✔ passed value is not a lowercase + + Testing isMap + + ✔ isMap is a Function + + Testing isNil + + ✔ isNil is a Function + ✔ Returns true for null + ✔ Returns true for undefined + ✔ Returns false for an empty string + + Testing isNull + + ✔ isNull is a Function + ✔ passed argument is a null + ✔ passed argument is a null + + Testing isNumber + + ✔ isNumber is a Function + ✔ passed argument is a number + ✔ passed argument is not a number + + Testing isObject + + ✔ isObject is a Function + ✔ isObject([1, 2, 3, 4]) is a object + ✔ isObject([]) is a object + ✔ isObject({ a:1 }) is a object + ✔ isObject(true) is not a object + + Testing isObjectLike + + ✔ isObjectLike is a Function + ✔ Returns true for an object + ✔ Returns true for an array + ✔ Returns false for a function + ✔ Returns false for null + + Testing isPlainObject + + ✔ isPlainObject is a Function + ✔ Returns true for a plain object + ✔ Returns false for a Map (example of non-plain object) + + Testing isPrime + + ✔ isPrime is a Function + ✔ passed number is a prime + + Testing isPrimitive + + ✔ isPrimitive is a Function + ✔ isPrimitive(null) is primitive + ✔ isPrimitive(undefined) is primitive + ✔ isPrimitive(string) is primitive + ✔ isPrimitive(true) is primitive + ✔ isPrimitive(50) is primitive + ✔ isPrimitive('Hello') is primitive + ✔ isPrimitive(false) is primitive + ✔ isPrimitive(Symbol()) is primitive + ✔ isPrimitive([1, 2, 3]) is not primitive + ✔ isPrimitive({ a: 123 }) is not primitive + ✔ isPrimitive({ a: 123 }) takes less than 2s to run + + Testing isPromiseLike + + ✔ isPromiseLike is a Function + ✔ Returns true for a promise-like object + ✔ Returns false for null + ✔ Returns false for an empty object + + Testing isRegExp + + ✔ isRegExp is a Function + + Testing isSet + + ✔ isSet is a Function + + Testing isSorted + + ✔ isSorted is a Function + ✔ Array is sorted in ascending order + ✔ Array is sorted in descending order + ✔ Array is not sorted, direction changed in array + + Testing isString + + ✔ isString is a Function + ✔ foo is a string + ✔ "10" is a string + ✔ Empty string is a string + ✔ 10 is not a string + ✔ true is not string + + Testing isSymbol + + ✔ isSymbol is a Function + ✔ Checks if the given argument is a symbol + + Testing isTravisCI + + ✔ isTravisCI is a Function + ✔ Running on Travis, correctly evaluates + + Testing isTypedArray + + ✔ isTypedArray is a Function + + Testing isUndefined + + ✔ isUndefined is a Function + ✔ Returns true for undefined + + Testing isUpperCase + + ✔ isUpperCase is a Function + ✔ ABC is all upper case + ✔ abc is not all upper case + ✔ A3@$ is all uppercase + + Testing isValidJSON + + ✔ isValidJSON is a Function + ✔ {"name":"Adam","age":20} is a valid JSON + ✔ {"name":"Adam",age:"20"} is not a valid JSON + ✔ null is a valid JSON + + Testing isWeakMap + + ✔ isWeakMap is a Function + + Testing isWeakSet + + ✔ isWeakSet is a Function + + Testing join + + ✔ join is a Function + ✔ Joins all elements of an array into a string and returns this string + ✔ Joins all elements of an array into a string and returns this string + ✔ Joins all elements of an array into a string and returns this string + + Testing last + + ✔ last is a Function + ✔ last({ a: 1234}) returns undefined + ✔ last([1, 2, 3]) returns 3 + ✔ last({ 0: false}) returns undefined + ✔ last(String) returns g + ✔ last(null) throws an Error + ✔ last(undefined) throws an Error + ✔ last() throws an Error + ✔ last([1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 1122, 32124, 23232]) takes less than 2s to run + + Testing lcm + + ✔ lcm is a Function + ✔ Returns the least common multiple of two or more numbers. + ✔ Returns the least common multiple of two or more numbers. + + Testing longestItem + + ✔ longestItem is a Function + ✔ Returns the longest object + + Testing lowercaseKeys + + ✔ lowercaseKeys is a Function + ✔ Lowercases object keys + ✔ Does not mutate original object + + Testing luhnCheck + + ✔ luhnCheck is a Function + ✔ validates identification number + ✔ validates identification number + ✔ validates identification number + + Testing mapKeys + + ✔ mapKeys is a Function + ✔ Maps keys + + Testing mapObject + + ✔ mapObject is a Function + ✔ mapObject([1, 2, 3], a => a * a) returns { 1: 1, 2: 4, 3: 9 } + ✔ mapObject([1, 2, 3, 4], (a, b) => b - a) returns { 1: -1, 2: -1, 3: -1, 4: -1 } + ✔ mapObject([1, 2, 3, 4], (a, b) => a - b) returns { 1: 1, 2: 1, 3: 1, 4: 1 } + + Testing mapValues + + ✔ mapValues is a Function + ✔ Maps values + + Testing mask + + ✔ mask is a Function + ✔ Replaces all but the last num of characters with the specified mask character + ✔ Replaces all but the last num of characters with the specified mask character + ✔ Replaces all but the last num of characters with the specified mask character + + Testing matches + + ✔ matches is a Function + ✔ Matches returns true for two similar objects + ✔ Matches returns false for two non-similar objects + + Testing matchesWith + + ✔ matchesWith is a Function + ✔ Returns true for two objects with similar values, based on the provided function + + Testing maxBy + + ✔ maxBy is a Function + ✔ Produces the right result with a function + ✔ Produces the right result with a property name + + Testing maxN + + ✔ maxN is a Function + ✔ Returns the n maximum elements from the provided array + ✔ Returns the n maximum elements from the provided array + + Testing median + + ✔ median is a Function + ✔ Returns the median of an array of numbers + ✔ Returns the median of an array of numbers + + Testing memoize + + ✔ memoize is a Function + ✔ Function works properly + ✔ Function works properly + ✔ Cache stores values + + Testing merge + + ✔ merge is a Function + ✔ Merges two objects + + Testing minBy + + ✔ minBy is a Function + ✔ Produces the right result with a function + ✔ Produces the right result with a property name + + Testing minN + + ✔ minN is a Function + ✔ Returns the n minimum elements from the provided array + ✔ Returns the n minimum elements from the provided array + + Testing mostPerformant + + ✔ mostPerformant is a Function + ✔ Tested by @chalarangelo on 16/02/2018 + + Testing negate + + ✔ negate is a Function + ✔ Negates a predicate function + + Testing none + + ✔ none is a Function + ✔ Returns true for arrays with no truthy values + ✔ Returns false for arrays with at least one truthy value + ✔ Returns true with a predicate function + ✔ Returns false with predicate function + + Testing nthArg + + ✔ nthArg is a Function + ✔ Returns the nth argument + ✔ Returns undefined if arguments too few + ✔ Works for negative values + + Testing nthElement + + ✔ nthElement is a Function + ✔ Returns the nth element of an array. + ✔ Returns the nth element of an array. + + Testing objectFromPairs + + ✔ objectFromPairs is a Function + ✔ Creates an object from the given key-value pairs. + + Testing objectToPairs + + ✔ objectToPairs is a Function + ✔ Creates an array of key-value pair arrays from an object. + + Testing observeMutations + + ✔ observeMutations is a Function + ✔ Tested on 09/02/2018 by @chalarangelo + + Testing off + + ✔ off is a Function + ✔ Tested by @chalarangelo on 16/02/2018 + + Testing omit + + ✔ omit is a Function + ✔ Omits the key-value pairs corresponding to the given keys from an object + + Testing omitBy + + ✔ omitBy is a Function + ✔ Creates an object composed of the properties the given function returns falsey for + + Testing on + + ✔ on is a Function + ✔ Tested by @chalarangelo on 16/02/2018 + + Testing onUserInputChange + + ✔ onUserInputChange is a Function + ✔ Tested by @chalarangelo on 16/02/2018 + + Testing once + + ✔ once is a Function + ✔ Tested by @chalarangelo on 16/02/2018 + + Testing orderBy + + ✔ orderBy is a Function + ✔ Returns a sorted array of objects ordered by properties and orders. + ✔ Returns a sorted array of objects ordered by properties and orders. + + Testing over + + ✔ over is a Function + ✔ Applies given functions over multiple arguments + + Testing overArgs + + ✔ overArgs is a Function + ✔ Invokes the provided function with its arguments transformed + + Testing palindrome + + ✔ palindrome is a Function + ✔ Given string is a palindrome + ✔ Given string is not a palindrome + + Testing parseCookie + + ✔ parseCookie is a Function + ✔ Parses the cookie + + Testing partial + + ✔ partial is a Function + ✔ Prepends arguments + + Testing partialRight + + ✔ partialRight is a Function + ✔ Appends arguments + + Testing partition + + ✔ partition is a Function + ✔ Groups the elements into two arrays, depending on the provided function's truthiness for each element. + + Testing percentile + + ✔ percentile is a Function + ✔ Uses the percentile formula to calculate how many numbers in the given array are less or equal to the given value. + + Testing permutations + + ✔ permutations is a Function + ✔ Generates all permutations of an array + + Testing pick + + ✔ pick is a Function + ✔ Picks the key-value pairs corresponding to the given keys from an object. + + Testing pickBy + + ✔ pickBy is a Function + ✔ Creates an object composed of the properties the given function returns truthy for. + + Testing pipeAsyncFunctions + + ✔ pipeAsyncFunctions is a Function + ✔ Produces the appropriate hash + ✔ pipeAsyncFunctions result should be 15 + + Testing pipeFunctions + + ✔ pipeFunctions is a Function + ✔ Performs left-to-right function composition + + Testing pluralize + + ✔ pluralize is a Function + ✔ Produces the plural of the word + ✔ Produces the singular of the word + ✔ Produces the plural of the word + ✔ Prodices the defined plural of the word + ✔ Works with a dictionary + + Testing powerset + + ✔ powerset is a Function + ✔ Returns the powerset of a given array of numbers. + + Testing prettyBytes + + ✔ prettyBytes is a Function + ✔ Converts a number in bytes to a human-readable string. + ✔ Converts a number in bytes to a human-readable string. + ✔ Converts a number in bytes to a human-readable string. + + Testing primes + + ✔ primes is a Function + ✔ Generates primes up to a given number, using the Sieve of Eratosthenes. + + Testing promisify + + ✔ promisify is a Function + ✔ Returns a promise + + Testing pull + + ✔ pull is a Function + ✔ Pulls the specified values + + Testing pullAtIndex + + ✔ pullAtIndex is a Function + ✔ Pulls the given values + ✔ Pulls the given values + + Testing pullAtValue + + ✔ pullAtValue is a Function + ✔ Pulls the specified values + ✔ Pulls the specified values + + Testing pullBy + + ✔ pullBy is a Function + ✔ Pulls the specified values + + Testing quickSort + + ✔ quickSort is a Function + ✔ quickSort([5, 6, 4, 3, 1, 2]) returns [1, 2, 3, 4, 5, 6] + ✔ quickSort([-1, 0, -2]) returns [-2, -1, 0] + ✔ quickSort() throws an error + ✔ quickSort(123) throws an error + ✔ quickSort({ 234: string}) throws an error + ✔ quickSort(null) throws an error + ✔ quickSort(undefined) throws an error + ✔ quickSort([11, 1, 324, 23232, -1, 53, 2, 524, 32, 13, 156, 133, 62, 12, 4]) takes less than 2s to run + + Testing radsToDegrees + + ✔ radsToDegrees is a Function + ✔ Returns the appropriate value + + Testing randomHexColorCode + + ✔ randomHexColorCode is a Function + ✔ should be equal + ✔ The color code starts with "#" + ✔ The color code contains only valid hex-digits + + Testing randomIntArrayInRange + + ✔ randomIntArrayInRange is a Function + ✔ The returned array contains only integers + ✔ The returned array has the proper length + ✔ The returned array's values lie between provided lowerLimit and upperLimit (both inclusive). + + Testing randomIntegerInRange + + ✔ randomIntegerInRange is a Function + ✔ The returned value is an integer + ✔ The returned value lies between provided lowerLimit and upperLimit (both inclusive). + + Testing randomNumberInRange + + ✔ randomNumberInRange is a Function + ✔ The returned value is a number + ✔ The returned value lies between provided lowerLimit and upperLimit (both inclusive). + + Testing readFileLines + + ✔ readFileLines is a Function + ✔ Tested on 09/02/2018 by @chalarangelo + + Testing rearg + + ✔ rearg is a Function + ✔ Reorders arguments in invoked function + + Testing redirect + + ✔ redirect is a Function + ✔ Tested on 09/02/2018 by @chalarangelo + + Testing reduceSuccessive + + ✔ reduceSuccessive is a Function + ✔ Returns the array of successively reduced values + + Testing reduceWhich + + ✔ reduceWhich is a Function + ✔ Returns the minimum of an array + ✔ Returns the maximum of an array + ✔ Returns the object with the minimum specified value in an array + + Testing reducedFilter + + ✔ reducedFilter is a Function + ✔ Filter an array of objects based on a condition while also filtering out unspecified keys. + + Testing remove + + ✔ remove is a Function + ✔ Removes elements from an array for which the given function returns false + + Testing removeNonASCII + + ✔ removeNonASCII is a Function + ✔ Removes non-ASCII characters + + Testing removeVowels + + ✔ removeVowels is a Function + + Testing reverseString + + ✔ reverseString is a Function + ✔ Reverses a string. + + Testing round + + ✔ round is a Function + ✔ round(1.005, 2) returns 1.01 + ✔ round(123.3423345345345345344, 11) returns 123.34233453453 + ✔ round(3.342, 11) returns 3.342 + ✔ round(1.005) returns 1 + ✔ round([1.005, 2]) returns NaN + ✔ round(string) returns NaN + ✔ round() returns NaN + ✔ round(132, 413, 4134) returns NaN + ✔ round({a: 132}, 413) returns NaN + ✔ round(123.3423345345345345344, 11) takes less than 2s to run + + Testing runAsync + + ✔ runAsync is a Function + ✔ Tested on 09/02/2018 by @chalarangelo + + Testing runPromisesInSeries + + ✔ runPromisesInSeries is a Function + + Testing sample + + ✔ sample is a Function + ✔ Returns a random element from the array + ✔ Works for single-element arrays + ✔ Returns undefined for empty array + + Testing sampleSize + + ✔ sampleSize is a Function + ✔ Returns a single element without n specified + ✔ Returns a random sample of specified size from an array + ✔ Returns all elements in an array if n >= length + ✔ Returns an empty array if original array is empty + ✔ Returns an empty array if n = 0 + + Testing scrollToTop + + ✔ scrollToTop is a Function + ✔ Tested on 09/02/2018 by @chalarangelo + + Testing sdbm + + ✔ sdbm is a Function + ✔ Hashes the input string into a whole number. + + Testing serializeCookie + + ✔ serializeCookie is a Function + ✔ Serializes the cookie + + Testing setStyle + + ✔ setStyle is a Function + ✔ Tested by @chalarangelo on 16/02/2018 + + Testing shallowClone + + ✔ shallowClone is a Function + ✔ Shallow cloning works + ✔ Does not clone deeply + + Testing show + + ✔ show is a Function + ✔ Tested by @chalarangelo on 16/02/2018 + + Testing shuffle + + ✔ shuffle is a Function + ✔ Shuffles the array + ✔ New array contains all original elements + ✔ Works for empty arrays + ✔ Works for single-element arrays + + Testing similarity + + ✔ similarity is a Function + ✔ Returns an array of elements that appear in both arrays. + + Testing size + + ✔ size is a Function + ✔ Get size of arrays, objects or strings. + ✔ Get size of arrays, objects or strings. + + Testing sleep + + ✔ sleep is a Function + + Testing solveRPN + + ✔ solveRPN is a Function + + Testing sortCharactersInString + + ✔ sortCharactersInString is a Function + ✔ Alphabetically sorts the characters in a string. + + Testing sortedIndex + + ✔ sortedIndex is a Function + ✔ Returns the lowest index at which value should be inserted into array in order to maintain its sort order. + ✔ Returns the lowest index at which value should be inserted into array in order to maintain its sort order. + + Testing sortedIndexBy + + ✔ sortedIndexBy is a Function + ✔ Returns the lowest index to insert the element without messing up the list order + + Testing sortedLastIndex + + ✔ sortedLastIndex is a Function + ✔ Returns the highest index to insert the element without messing up the list order + + Testing sortedLastIndexBy + + ✔ sortedLastIndexBy is a Function + ✔ Returns the highest index to insert the element without messing up the list order + + Testing speechSynthesis + + ✔ speechSynthesis is a Function + + Testing splitLines + + ✔ splitLines is a Function + ✔ Splits a multiline string into an array of lines. + + Testing spreadOver + + ✔ spreadOver is a Function + ✔ Takes a variadic function and returns a closure that accepts an array of arguments to map to the inputs of the function. + + Testing stableSort + + ✔ stableSort is a Function + ✔ Array is properly sorted + + Testing standardDeviation + + ✔ standardDeviation is a Function + ✔ Returns the standard deviation of an array of numbers + ✔ Returns the standard deviation of an array of numbers + + Testing stringPermutations + + ✔ stringPermutations is a Function + ✔ Generates all stringPermutations of a string + ✔ Works for single-letter strings + ✔ Works for empty strings + + Testing stripHTMLTags + + ✔ stripHTMLTags is a Function + ✔ Removes HTML tags + + Testing sum + + ✔ sum is a Function + ✔ Returns the sum of two or more numbers/arrays. + + Testing sumBy + + ✔ sumBy is a Function + + Testing sumPower + + ✔ sumPower is a Function + ✔ Returns the sum of the powers of all the numbers from start to end + ✔ Returns the sum of the powers of all the numbers from start to end + ✔ Returns the sum of the powers of all the numbers from start to end + + Testing symmetricDifference + + ✔ symmetricDifference is a Function + ✔ Returns the symmetric difference between two arrays. + + Testing symmetricDifferenceBy + + ✔ symmetricDifferenceBy is a Function + ✔ Returns the symmetric difference between two arrays, after applying the provided function to each array element of both + + Testing symmetricDifferenceWith + + ✔ symmetricDifferenceWith is a Function + ✔ Returns the symmetric difference between two arrays, using a provided function as a comparator + + Testing tail + + ✔ tail is a Function + ✔ Returns tail + ✔ Returns tail + + Testing take + + ✔ take is a Function + ✔ Returns an array with n elements removed from the beginning. + ✔ Returns an array with n elements removed from the beginning. + + Testing takeRight + + ✔ takeRight is a Function + ✔ Returns an array with n elements removed from the end + ✔ Returns an array with n elements removed from the end + + Testing takeRightWhile + + ✔ takeRightWhile is a Function + ✔ Removes elements until the function returns true + + Testing takeWhile + + ✔ takeWhile is a Function + ✔ Removes elements until the function returns true + + Testing throttle + + ✔ throttle is a Function + ✔ Tested by @chalarangelo on 16/02/2018 + + Testing timeTaken + + ✔ timeTaken is a Function + ✔ Tested by @chalarangelo on 16/02/2018 + + Testing times + + ✔ times is a Function + ✔ Runs a function the specified amount of times + + Testing toCamelCase + + ✔ toCamelCase is a Function + ✔ toCamelCase('some_database_field_name') returns someDatabaseFieldName + ✔ toCamelCase('Some label that needs to be camelized') returns someLabelThatNeedsToBeCamelized + ✔ toCamelCase('some-javascript-property') return someJavascriptProperty + ✔ toCamelCase('some-mixed_string with spaces_underscores-and-hyphens') returns someMixedStringWithSpacesUnderscoresAndHyphens + ✔ toCamelCase() throws a error + ✔ toCamelCase([]) throws a error + ✔ toCamelCase({}) throws a error + ✔ toCamelCase(123) throws a error + ✔ toCamelCase(some-mixed_string with spaces_underscores-and-hyphens) takes less than 2s to run + + Testing toCurrency + + ✔ toCurrency is a Function + ✔ currency: Euro | currencyLangFormat: Local + ✔ currency: US Dollar | currencyLangFormat: English (United States) + ✔ currency: Japanese Yen | currencyLangFormat: Local + + Testing toDecimalMark + + ✔ toDecimalMark is a Function + ✔ convert a float-point arithmetic to the Decimal mark form + + Testing toKebabCase + + ✔ toKebabCase is a Function + ✔ toKebabCase('camelCase') returns camel-case + ✔ toKebabCase('some text') returns some-text + ✔ toKebabCase('some-mixed-string With spaces-underscores-and-hyphens') returns some-mixed-string-with-spaces-underscores-and-hyphens + ✔ toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') returns i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-some-xml-and-html + ✔ toKebabCase() return undefined + ✔ toKebabCase([]) throws an error + ✔ toKebabCase({}) throws an error + ✔ toKebabCase(123) throws an error + ✔ toKebabCase(IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML) takes less than 2s to run + + Testing toOrdinalSuffix + + ✔ toOrdinalSuffix is a Function + ✔ Adds an ordinal suffix to a number + ✔ Adds an ordinal suffix to a number + ✔ Adds an ordinal suffix to a number + ✔ Adds an ordinal suffix to a number + + Testing toSafeInteger + + ✔ toSafeInteger is a Function + ✔ Number(toSafeInteger(3.2)) is a number + ✔ Converts a value to a safe integer + ✔ toSafeInteger('4.2') returns 4 + ✔ toSafeInteger(4.6) returns 5 + ✔ toSafeInteger([]) returns 0 + ✔ isNaN(toSafeInteger([1.5, 3124])) is true + ✔ isNaN(toSafeInteger('string')) is true + ✔ isNaN(toSafeInteger({})) is true + ✔ isNaN(toSafeInteger()) is true + ✔ toSafeInteger(Infinity) returns 9007199254740991 + ✔ toSafeInteger(3.2) takes less than 2s to run + + Testing toSnakeCase + + ✔ toSnakeCase is a Function + ✔ toSnakeCase('camelCase') returns camel_case + ✔ toSnakeCase('some text') returns some_text + ✔ toSnakeCase('some-mixed_string With spaces_underscores-and-hyphens') returns some_mixed_string_with_spaces_underscores_and_hyphens + ✔ toSnakeCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') returns i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html + ✔ toSnakeCase() returns undefined + ✔ toSnakeCase([]) throws an error + ✔ toSnakeCase({}) throws an error + ✔ toSnakeCase(123) throws an error + ✔ toSnakeCase(IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML) takes less than 2s to run + + Testing toggleClass + + ✔ toggleClass is a Function + ✔ Tested by @chalarangelo on 16/02/2018 + + Testing tomorrow + + ✔ tomorrow is a Function + ✔ Returns the correct year + ✔ Returns the correct month + ✔ Returns the correct date + + Testing transform + + ✔ transform is a Function + ✔ Transforms an object + + Testing truncateString + + ✔ truncateString is a Function + ✔ Truncates a "boomerang" up to a specified length. + + Testing truthCheckCollection + + ✔ truthCheckCollection is a Function + ✔ second argument is truthy on all elements of a collection + + Testing unary + + ✔ unary is a Function + ✔ Discards arguments after the first one + + Testing uncurry + + ✔ uncurry is a Function + ✔ Works without a provided value for n + ✔ Works without n = 2 + ✔ Works withoutn = 3 + + Testing unescapeHTML + + ✔ unescapeHTML is a Function + ✔ Unescapes escaped HTML characters. + + Testing unflattenObject + + ✔ unflattenObject is a Function + ✔ Unflattens an object with the paths for keys + + Testing unfold + + ✔ unfold is a Function + ✔ Works with a given function, producing an array + + Testing union + + ✔ union is a Function + ✔ union([1, 2, 3], [4, 3, 2]) returns [1, 2, 3, 4] + ✔ union('str', 'asd') returns [ 's', 't', 'r', 'a', 'd' ] + ✔ union([[], {}], [1, 2, 3]) returns [[], {}, 1, 2, 3] + ✔ union([], []) returns [] + ✔ union() throws an error + ✔ union(true, str) throws an error + ✔ union(false, true) throws an error + ✔ union(123, {}) throws an error + ✔ union([], {}) throws an error + ✔ union(undefined, null) throws an error + ✔ union([1, 2, 3], [4, 3, 2]) takes less than 2s to run + + Testing unionBy + + ✔ unionBy is a Function + ✔ Produces the appropriate results + + Testing unionWith + + ✔ unionWith is a Function + ✔ Produces the appropriate results + + Testing uniqueElements + + ✔ uniqueElements is a Function + ✔ uniqueElements([1, 2, 2, 3, 4, 4, 5]) returns [1,2,3,4,5] + ✔ uniqueElements([1, 23, 53]) returns [1, 23, 53] + ✔ uniqueElements([true, 0, 1, false, false, undefined, null, '']) returns [true, 0, 1, false, false, undefined, null, ''] + ✔ uniqueElements() returns [] + ✔ uniqueElements(null) returns [] + ✔ uniqueElements(undefined) returns [] + ✔ uniqueElements('strt') returns ['s', 't', 'r'] + ✔ uniqueElements(1, 1, 2543, 534, 5) throws an error + ✔ uniqueElements({}) throws an error + ✔ uniqueElements(true) throws an error + ✔ uniqueElements(false) throws an error + ✔ uniqueElements([true, 0, 1, false, false, undefined, null]) takes less than 2s to run + + Testing untildify + + ✔ untildify is a Function + ✔ Contains no tildes + ✔ Does not alter the rest of the path + ✔ Does not alter paths without tildes + + Testing unzip + + ✔ unzip is a Function + ✔ unzip([['a', 1, true], ['b', 2, false]]) equals [['a', 'b'], [1, 2], [true, false]] + ✔ unzip([['a', 1, true], ['b', 2]]) equals [['a', 'b'], [1, 2], [true]] + + Testing unzipWith + + ✔ unzipWith is a Function + ✔ unzipWith([[1, 10, 100], [2, 20, 200]], (...args) => args.reduce((acc, v) => acc + v, 0)) equals [3, 30, 300] Testing validateNumber - √ validateNumber is a Function - √ validateNumber(9) returns true - √ validateNumber(234asd.slice(0, 2)) returns true - √ validateNumber(1232) returns true - √ validateNumber(1232 + 13423) returns true - √ validateNumber(1232 * 2342 * 123) returns true - √ validateNumber(1232.23423536) returns true - √ validateNumber(234asd) returns false - √ validateNumber(e234d) returns false - √ validateNumber(false) returns false - √ validateNumber(true) returns false - √ validateNumber(null) returns false - √ validateNumber(123 * asd) returns false + ✔ validateNumber is a Function + ✔ validateNumber(9) returns true + ✔ validateNumber(234asd.slice(0, 2)) returns true + ✔ validateNumber(1232) returns true + ✔ validateNumber(1232 + 13423) returns true + ✔ validateNumber(1232 * 2342 * 123) returns true + ✔ validateNumber(1232.23423536) returns true + ✔ validateNumber(234asd) returns false + ✔ validateNumber(e234d) returns false + ✔ validateNumber(false) returns false + ✔ validateNumber(true) returns false + ✔ validateNumber(null) returns false + ✔ validateNumber(123 * asd) returns false Testing without - √ without is a Function - √ without([2, 1, 2, 3], 1, 2) returns [3] - √ without([]) returns [] - √ without([3, 1, true, '3', true], '3', true) returns [3, 1] - √ without('string'.split(''), 's', 't', 'g') returns ['r', 'i', 'n'] - √ without() throws an error - √ without(null) throws an error - √ without(undefined) throws an error - √ without() throws an error - √ without({}) throws an error + ✔ without is a Function + ✔ without([2, 1, 2, 3], 1, 2) returns [3] + ✔ without([]) returns [] + ✔ without([3, 1, true, '3', true], '3', true) returns [3, 1] + ✔ without('string'.split(''), 's', 't', 'g') returns ['r', 'i', 'n'] + ✔ without() throws an error + ✔ without(null) throws an error + ✔ without(undefined) throws an error + ✔ without() throws an error + ✔ without({}) throws an error Testing words - √ words is a Function - √ words('I love javaScript!!') returns [I, love, javaScript] - √ words('python, javaScript & coffee') returns [python, javaScript, coffee] - √ words(I love javaScript!!) returns an array - √ words() throws a error - √ words(null) throws a error - √ words(undefined) throws a error - √ words({}) throws a error - √ words([]) throws a error - √ words(1234) throws a error + ✔ words is a Function + ✔ words('I love javaScript!!') returns [I, love, javaScript] + ✔ words('python, javaScript & coffee') returns [python, javaScript, coffee] + ✔ words(I love javaScript!!) returns an array + ✔ words() throws a error + ✔ words(null) throws a error + ✔ words(undefined) throws a error + ✔ words({}) throws a error + ✔ words([]) throws a error + ✔ words(1234) throws a error Testing xProd - √ xProd is a Function - √ xProd([1, 2], ['a', 'b']) returns [[1, 'a'], [1, 'b'], [2, 'a'], [2, 'b']] + ✔ xProd is a Function + ✔ xProd([1, 2], ['a', 'b']) returns [[1, 'a'], [1, 'b'], [2, 'a'], [2, 'b']] Testing yesNo - √ yesNo is a Function - √ yesNo(Y) returns true - √ yesNo(yes) returns true - √ yesNo(foo, true) returns true - √ yesNo(No) returns false - √ yesNo() returns false - √ yesNo(null) returns false - √ yesNo(undefined) returns false - √ yesNo([123, null]) returns false - √ yesNo([Yes, No]) returns false - √ yesNo({ 2: Yes }) returns false - √ yesNo([Yes, No], true) returns true - √ yesNo({ 2: Yes }, true) returns true + ✔ yesNo is a Function + ✔ yesNo(Y) returns true + ✔ yesNo(yes) returns true + ✔ yesNo(foo, true) returns true + ✔ yesNo(No) returns false + ✔ yesNo() returns false + ✔ yesNo(null) returns false + ✔ yesNo(undefined) returns false + ✔ yesNo([123, null]) returns false + ✔ yesNo([Yes, No]) returns false + ✔ yesNo({ 2: Yes }) returns false + ✔ yesNo([Yes, No], true) returns true + ✔ yesNo({ 2: Yes }, true) returns true Testing zip - √ zip is a Function - √ zip([a, b], [1, 2], [true, false]) returns [[a, 1, true], [b, 2, false]] - √ zip([a], [1, 2], [true, false]) returns [[a, 1, true], [undefined, 2, false]] - √ zip([]) returns [] - √ zip(123) returns [] - √ zip([a, b], [1, 2], [true, false]) returns an Array - √ zip([a], [1, 2], [true, false]) returns an Array - √ zip(null) throws an error - √ zip(undefined) throws an error + ✔ zip is a Function + ✔ zip([a, b], [1, 2], [true, false]) returns [[a, 1, true], [b, 2, false]] + ✔ zip([a], [1, 2], [true, false]) returns [[a, 1, true], [undefined, 2, false]] + ✔ zip([]) returns [] + ✔ zip(123) returns [] + ✔ zip([a, b], [1, 2], [true, false]) returns an Array + ✔ zip([a], [1, 2], [true, false]) returns an Array + ✔ zip(null) throws an error + ✔ zip(undefined) throws an error Testing zipObject - √ zipObject is a Function - √ zipObject([a, b, c], [1, 2]) returns {a: 1, b: 2, c: undefined} - √ zipObject([a, b], [1, 2, 3]) returns {a: 1, b: 2} - √ zipObject([a, b, c], string) returns { a: s, b: t, c: r } - √ zipObject([a], string) returns { a: s } - √ zipObject() throws an error - √ zipObject([string], null) throws an error - √ zipObject(null, [1]) throws an error - √ zipObject(string) throws an error - √ zipObject(test, string) throws an error + ✔ zipObject is a Function + ✔ zipObject([a, b, c], [1, 2]) returns {a: 1, b: 2, c: undefined} + ✔ zipObject([a, b], [1, 2, 3]) returns {a: 1, b: 2} + ✔ zipObject([a, b, c], string) returns { a: s, b: t, c: r } + ✔ zipObject([a], string) returns { a: s } + ✔ zipObject() throws an error + ✔ zipObject([string], null) throws an error + ✔ zipObject(null, [1]) throws an error + ✔ zipObject(string) throws an error + ✔ zipObject(test, string) throws an error Testing zipWith - √ zipWith is a Function - √ Runs the function provided - √ Sends a GET request - √ Runs promises in series - √ Sends a POST request - √ Works with multiple promises + ✔ zipWith is a Function + ✔ Sends a GET request + ✔ Runs the function provided + ✔ Sends a POST request + ✔ Runs promises in series + ✔ Works as expecting, passing arguments properly + ✔ Works with multiple promises - total: 908 - passing: 908 - duration: 2.4s + total: 979 + passing: 979 + duration: 2.3s From b8ea9b5fa9ad86b45afc3ff0059677f10ca045c8 Mon Sep 17 00:00:00 2001 From: Angelos Chalaris Date: Tue, 20 Feb 2018 17:29:39 +0200 Subject: [PATCH 19/54] Update package-lock.json --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 7dea1534c..5d7736c68 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "30-seconds-of-code", - "version": "0.0.1", + "version": "0.0.2", "lockfileVersion": 1, "requires": true, "dependencies": { From bc9e5840fbdc681f9c2f0fa4c79ff90eac7f2ebb Mon Sep 17 00:00:00 2001 From: Angelos Chalaris Date: Tue, 20 Feb 2018 19:02:05 +0200 Subject: [PATCH 20/54] Website updates Updated the header bar to be slimmer and more usable, updated the search bar styling, added smooth-scrolling for links in the same page. --- .gitignore | 4 +++ docs/mini/flavor.scss | 53 ++++++++++------------------------- static-parts/index-start.html | 40 ++++++++++++++++++++------ 3 files changed, 50 insertions(+), 47 deletions(-) diff --git a/.gitignore b/.gitignore index d6b1b7f9c..a7eb01438 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,7 @@ currentSnippet\.js .idea test.sh /*.log + +dist/flavor\.min\.css + +dist/flavor\.css diff --git a/docs/mini/flavor.scss b/docs/mini/flavor.scss index 59775783e..9c5ce4a87 100644 --- a/docs/mini/flavor.scss +++ b/docs/mini/flavor.scss @@ -92,7 +92,7 @@ $button-hover-border-color-var: '--btn-h-br-col'; $button-group-border-color-var: '--btn-grp-br-col'; -$_include-fluid-input-group: false; +$_include-fluid-input-group: true; @import 'input_control'; @@ -195,68 +195,45 @@ pre { border: 0.0625rem solid var(#{$secondary-border-color-var}); border-radius: var(#{$universal-border-radius-var}); } -.group{ - position:relative; - margin-top: 2em; - margin-bottom: 1em -} -.search{ + +.search { font-size: 0.875rem; - margin-top: -0.1em; - display:block; - width:100%; - border:none; - border-bottom: $__1px solid var(#{$nav-link-color-var}); -} -.search:focus{ - outline:none -} -label#search-label{ - color:var(#{$nav-link-color-var}); - font-size: 1.125rem; - font-weight:400; - position:absolute; - left: 0.3125rem; - top: 0.625rem; -} -.search:focus ~ label#search-label,.search:valid ~ label#search-label{ - top: -1.25rem; - font-size: 0.875rem; - color:var(#{$nav-link-color-var}); -} -label#menu-toggle { - width: 3.4375rem; } header h1.logo { margin-top: -0.8rem; text-align:center; + position: relative; + top: 0; + transition: top 0.3s; a { text-decoration:none; color: #111; } + @media screen and (min-width: 769px) { + &:hover { + top: -3.5rem; + } + } } header #title { position:relative; top: -1rem; - @media screen and (max-width: 500px) { font-size: 1rem; display: block } + @media screen and (max-width: 768px) { display: none; } } header h1 small { display:block; font-size: 0.875rem; color: #888; - margin-top: -0.8rem; - @media screen and (max-width: 768px) { font-size: 0.75rem; } - @media screen and (max-width: 600px) { font-size: 0.625rem; } - @media screen and (max-width: 500px) { font-size: 0.5rem; margin-top: -1.2rem; } + margin-top: 0.75rem; } label#menu-toggle { position: absolute; - left: 0.5rem; - top: 0.5rem; + left: 0rem; + top: 0rem; width: 3.4375rem; } diff --git a/static-parts/index-start.html b/static-parts/index-start.html index e5c0702d1..9cf20be62 100644 --- a/static-parts/index-start.html +++ b/static-parts/index-start.html @@ -34,11 +34,30 @@ document.querySelector('main').scrollTo(0, c - c / 4); } }; + function scrollTo(element, to, id, duration) { + if (duration <= 0) return; + var difference = to - element.scrollTop; + var perTick = difference / duration * 40; + + setTimeout(function() { + element.scrollTop = element.scrollTop + perTick; + if (element.scrollTop === to) { + window.location.href = "#"+id; + return; + } + scrollTo(element, to, id, duration - 40); + }, 40); + }; function loader() { registerClickListener(); } function registerClickListener() { document.addEventListener('click', function (event) { + if( document.getElementById('doc-drawer-checkbox').checked ) { + if(!document.querySelector('nav').contains(event.target) && !event.target.classList.contains('drawer-toggle') && !event.target.classList.contains('drawer')) { + document.getElementById('doc-drawer-checkbox').checked = false; + } + } if ( event.target.classList.contains('collapse') ) { event.target.classList = event.target.classList.contains('toggled') ? 'collapse' : 'collapse toggled'; } @@ -64,23 +83,26 @@ else if (event.target.classList.contains('scroll-to-top')){ scrollToTop(); } + else if (event.target.classList.contains('sublink-1')){ + event.preventDefault(); + scrollTo(document.querySelector('main'), document.getElementById(event.target.href.split('#')[1]).parentElement.offsetTop - 60, event.target.href.split('#')[1], 400); + document.getElementById('doc-drawer-checkbox').checked = false; + } }, false); } - -
    -

    logo 30 seconds of code - Curated collection of useful JavaScript snippets that you can understand in 30 seconds or less. + +
    +

    logo 30 seconds of code +

    -
    +

    diff --git a/docs/index.html b/docs/index.html index c214aacdb..86831a0ac 100644 --- a/docs/index.html +++ b/docs/index.html @@ -839,14 +839,16 @@ document.bodygetMeridiemSuffixOfInteger(11); // "11am" getMeridiemSuffixOfInteger(13); // "1pm" getMeridiemSuffixOfInteger(25); // "1pm" -

    tomorrow

    Results in a string representation of tomorrow's date. Use new Date() to get today's date, adding one day using Date.getDate() and Date.setDate(), and converting the Date object to a string.

    const tomorrow = () => {
    +

    tomorrow

    Results in a string representation of tomorrow's date. Use new Date() to get today's date, adding one day using Date.getDate() and Date.setDate(), and converting the Date object to a string.

    const tomorrow = (long = false) => {
       let t = new Date();
       t.setDate(t.getDate() + 1);
    -  return `${t.getFullYear()}-${String(t.getMonth() + 1).padStart(2, '0')}-${String(
    +  const ret = `${t.getFullYear()}-${String(t.getMonth() + 1).padStart(2, '0')}-${String(
         t.getDate()
    -  ).padStart(2, '0')}`;
    +  ).padStart(2, '0')}`;
    +  return !long ? ret : `${ret}T00:00:00`;
     };
     
    tomorrow(); // 2017-12-27 (if current date is 2017-12-26)
    +tomorrow(true); // 2017-12-27T00:00:00 (if current date is 2017-12-26)
     

    Function

    attempt

    Attempts to invoke a function with the provided arguments, returning either the result or the caught error object.

    Use a try... catch block to return either the result of the function or an appropriate error.

    const attempt = (fn, ...args) => {
       try {
         return fn(args);
    
    From 11f3d9537980eb586277f156df0a344cdd07a09d Mon Sep 17 00:00:00 2001
    From: 30secondsofcode <30secondsofcode@gmail.com>
    Date: Mon, 26 Feb 2018 10:20:51 +0000
    Subject: [PATCH 45/54] Travis build: 1738 [custom]
    
    ---
     test/nest/nest.js         |  5 +++++
     test/nest/nest.test.js    | 13 +++++++++++++
     test/testlog              | 10 +++++++---
     test/tomorrow/tomorrow.js |  7 ++++---
     4 files changed, 29 insertions(+), 6 deletions(-)
     create mode 100644 test/nest/nest.js
     create mode 100644 test/nest/nest.test.js
    
    diff --git a/test/nest/nest.js b/test/nest/nest.js
    new file mode 100644
    index 000000000..4afb092bd
    --- /dev/null
    +++ b/test/nest/nest.js
    @@ -0,0 +1,5 @@
    +const nest = (items, id = null, link = 'parent_id') =>
    +items
    +.filter(item => item[link] === id)
    +.map(item => ({ ...item, children: nest(items, item.id) }));
    +module.exports = nest;
    \ No newline at end of file
    diff --git a/test/nest/nest.test.js b/test/nest/nest.test.js
    new file mode 100644
    index 000000000..f3b177255
    --- /dev/null
    +++ b/test/nest/nest.test.js
    @@ -0,0 +1,13 @@
    +const test = require('tape');
    +const nest = require('./nest.js');
    +
    +test('Testing nest', (t) => {
    +  //For more information on all the methods supported by tape
    +  //Please go to https://github.com/substack/tape
    +  t.true(typeof nest === 'function', 'nest is a Function');
    +  //t.deepEqual(nest(args..), 'Expected');
    +  //t.equal(nest(args..), 'Expected');
    +  //t.false(nest(args..), 'Expected');
    +  //t.throws(nest(args..), 'Expected');
    +  t.end();
    +});
    \ No newline at end of file
    diff --git a/test/testlog b/test/testlog
    index 1a2c87d70..de9b84a0a 100644
    --- a/test/testlog
    +++ b/test/testlog
    @@ -1,4 +1,4 @@
    -Test log for: Sun Feb 25 2018 20:27:15 GMT+0000 (UTC)
    +Test log for: Mon Feb 26 2018 10:20:44 GMT+0000 (UTC)
     
     > 30-seconds-of-code@0.0.2 test /home/travis/build/Chalarangelo/30-seconds-of-code
     > tape test/**/*.test.js | tap-spec
    @@ -1117,6 +1117,10 @@ Test log for: Sun Feb 25 2018 20:27:15 GMT+0000 (UTC)
         ✔ negate is a Function
         ✔ Negates a predicate function
     
    +  Testing nest
    +
    +    ✔ nest is a Function
    +
       Testing none
     
         ✔ none is a Function
    @@ -1923,8 +1927,8 @@ Test log for: Sun Feb 25 2018 20:27:15 GMT+0000 (UTC)
         ✔ Works with multiple promises
     
     
    -  total:     979
    -  passing:   979
    +  total:     980
    +  passing:   980
       duration:  2.3s
     
     
    diff --git a/test/tomorrow/tomorrow.js b/test/tomorrow/tomorrow.js
    index 81595a444..d177e0f9a 100644
    --- a/test/tomorrow/tomorrow.js
    +++ b/test/tomorrow/tomorrow.js
    @@ -1,8 +1,9 @@
    -const tomorrow = () => {
    +const tomorrow = (long = false) => {
     let t = new Date();
     t.setDate(t.getDate() + 1);
    -return `${String(t.getMonth() + 1).padStart(2, '0')}-${String(
    +const ret = `${t.getFullYear()}-${String(t.getMonth() + 1).padStart(2, '0')}-${String(
     t.getDate()
    -).padStart(2, '0')}-${t.getFullYear()}`;
    +).padStart(2, '0')}`;
    +return !long ? ret : `${ret}T00:00:00`;
     };
     module.exports = tomorrow;
    \ No newline at end of file
    
    From 5bd4667ef9611f9b2f7607e2aa755a534572c09d Mon Sep 17 00:00:00 2001
    From: Angelos Chalaris 
    Date: Mon, 26 Feb 2018 12:23:46 +0200
    Subject: [PATCH 46/54] Update nest.md
    
    ---
     snippets/nest.md | 10 ++++------
     1 file changed, 4 insertions(+), 6 deletions(-)
    
    diff --git a/snippets/nest.md b/snippets/nest.md
    index 616098748..b7ca13827 100644
    --- a/snippets/nest.md
    +++ b/snippets/nest.md
    @@ -3,12 +3,10 @@
     Given a flat array of objects linked to one another, it will nest them recursively.
     Useful for nesting comments, such as the ones on reddit.com.
     
    -Use recursion. Use `Array.filter()` to filter the items where the `id` matches the `link`,
    -then use `Array.map()` to map each one to a new object that has a `children` property which
    -recursively nests the items based on which ones are children of the current item. Omit the second 
    -argument, `id`, to default to `null` which indicates the object is not linked to another one (i.e.,
    -it is a top level). Omit the third argument, `link`, to use `'parent_id'` as the default property
    -which links the object to another one by its `id`.
    +Use recursion. 
    +Use `Array.filter()` to filter the items where the `id` matches the `link`, then `Array.map()` to map each one to a new object that has a `children` property which recursively nests the items based on which ones are children of the current item. 
    +Omit the second argument, `id`, to default to `null` which indicates the object is not linked to another one (i.e. it is a top level object). 
    +Omit the third argument, `link`, to use `'parent_id'` as the default property which links the object to another one by its `id`.
     
     ```js
     const nest = (items, id = null, link = 'parent_id') =>
    
    From 60dc7a86bc37db36c06509d90b2333a59c5d56be Mon Sep 17 00:00:00 2001
    From: 30secondsofcode <30secondsofcode@gmail.com>
    Date: Mon, 26 Feb 2018 10:25:04 +0000
    Subject: [PATCH 47/54] Travis build: 1740
    
    ---
     README.md       | 10 ++++------
     docs/index.html |  2 +-
     2 files changed, 5 insertions(+), 7 deletions(-)
    
    diff --git a/README.md b/README.md
    index 6053c1753..3d0c5191d 100644
    --- a/README.md
    +++ b/README.md
    @@ -6267,12 +6267,10 @@ merge(object, other); // { a: [ { x: 2 }, { y: 4 }, { z: 3 } ], b: [ 1, 2, 3 ],
     Given a flat array of objects linked to one another, it will nest them recursively.
     Useful for nesting comments, such as the ones on reddit.com.
     
    -Use recursion. Use `Array.filter()` to filter the items where the `id` matches the `link`,
    -then use `Array.map()` to map each one to a new object that has a `children` property which
    -recursively nests the items based on which ones are children of the current item. Omit the second 
    -argument, `id`, to default to `null` which indicates the object is not linked to another one (i.e.,
    -it is a top level). Omit the third argument, `link`, to use `'parent_id'` as the default property
    -which links the object to another one by its `id`.
    +Use recursion. 
    +Use `Array.filter()` to filter the items where the `id` matches the `link`, then `Array.map()` to map each one to a new object that has a `children` property which recursively nests the items based on which ones are children of the current item. 
    +Omit the second argument, `id`, to default to `null` which indicates the object is not linked to another one (i.e. it is a top level object). 
    +Omit the third argument, `link`, to use `'parent_id'` as the default property which links the object to another one by its `id`.
     
     ```js
     const nest = (items, id = null, link = 'parent_id') =>
    diff --git a/docs/index.html b/docs/index.html
    index 86831a0ac..c5b076685 100644
    --- a/docs/index.html
    +++ b/docs/index.html
    @@ -1478,7 +1478,7 @@ Foo.prototype: 'foo'
     };
     merge(object, other); // { a: [ { x: 2 }, { y: 4 }, { z: 3 } ], b: [ 1, 2, 3 ], c: 'foo' }
    -

    nest

    Given a flat array of objects linked to one another, it will nest them recursively. Useful for nesting comments, such as the ones on reddit.com.

    Use recursion. Use Array.filter() to filter the items where the id matches the link, then use Array.map() to map each one to a new object that has a children property which recursively nests the items based on which ones are children of the current item. Omit the second argument, id, to default to null which indicates the object is not linked to another one (i.e., it is a top level). Omit the third argument, link, to use 'parent_id' as the default property which links the object to another one by its id.

    const nest = (items, id = null, link = 'parent_id') =>
    +

    nest

    Given a flat array of objects linked to one another, it will nest them recursively. Useful for nesting comments, such as the ones on reddit.com.

    Use recursion. Use Array.filter() to filter the items where the id matches the link, then Array.map() to map each one to a new object that has a children property which recursively nests the items based on which ones are children of the current item. Omit the second argument, id, to default to null which indicates the object is not linked to another one (i.e. it is a top level object). Omit the third argument, link, to use 'parent_id' as the default property which links the object to another one by its id.

    const nest = (items, id = null, link = 'parent_id') =>
       items
         .filter(item => item[link] === id)
         .map(item => ({ ...item, children: nest(items, item.id) }));
    
    From 5c39b6db934a8bba8f023d474974e08327ddfd04 Mon Sep 17 00:00:00 2001
    From: Angelos Chalaris 
    Date: Mon, 26 Feb 2018 13:50:13 +0200
    Subject: [PATCH 48/54] Update pad.md
    
    ---
     snippets/pad.md | 17 +++++++++--------
     1 file changed, 9 insertions(+), 8 deletions(-)
    
    diff --git a/snippets/pad.md b/snippets/pad.md
    index d3ba0c4b1..18e449739 100644
    --- a/snippets/pad.md
    +++ b/snippets/pad.md
    @@ -1,16 +1,17 @@
     ### pad
     
    -Pads `string` on the left and right side if it's shorter than `length`.
    -String is *NOT* truncated on both sides if it exceeds length.
    +Pads a string on both sides with the specified character, if it's shorter than the specified length.
    +
    +Use `String.padStart()` and `String.padEnd()` to pad both sides of the given string.
    +Omit the third argument, `char`, to use the whitespace character as the default padding character.
     
     ```js
    -const pad = (string, length = 8, char = ' ') =>
    -  string.padStart((string.length + length) / 2, char).padEnd(length, char);
    -module.exports = pad;
    +const pad = (str, length, char = ' ') =>
    +  str.padStart((str.length + length) / 2, char).padEnd(length, char);
     ```
     
     ```js
    -pad('cat'); //> '  cat   '
    -pad(String(42), 4, '0'); //> '004200'
    -pad('foobar', 3); //> 'foobar'
    +pad('cat', 8); // '  cat   '
    +pad(String(42), 6, '0'); // '004200'
    +pad('foobar', 3); // 'foobar'
     ```
    
    From 3212c965bea1ee30c2f87cee3603fba429c9a935 Mon Sep 17 00:00:00 2001
    From: 30secondsofcode <30secondsofcode@gmail.com>
    Date: Mon, 26 Feb 2018 11:54:18 +0000
    Subject: [PATCH 49/54] Travis build: 1742
    
    ---
     README.md       | 27 +++++++++++++++++++++++++++
     docs/index.html |  7 ++++++-
     2 files changed, 33 insertions(+), 1 deletion(-)
    
    diff --git a/README.md b/README.md
    index 3d0c5191d..23e142d1f 100644
    --- a/README.md
    +++ b/README.md
    @@ -377,6 +377,7 @@ average(1, 2, 3);
     * [`isLowerCase`](#islowercase)
     * [`isUpperCase`](#isuppercase)
     * [`mask`](#mask)
    +* [`pad`](#pad)
     * [`palindrome`](#palindrome)
     * [`pluralize`](#pluralize)
     * [`removeNonASCII`](#removenonascii)
    @@ -6939,6 +6940,32 @@ mask(1234567890, -4, '$'); // '$$$$567890'
     
    [⬆ Back to top](#table-of-contents) +### pad + +Pads a string on both sides with the specified character, if it's shorter than the specified length. + +Use `String.padStart()` and `String.padEnd()` to pad both sides of the given string. +Omit the third argument, `char`, to use the whitespace character as the default padding character. + +```js +const pad = (str, length, char = ' ') => + str.padStart((str.length + length) / 2, char).padEnd(length, char); +``` + +
    +Examples + +```js +pad('cat', 8); // ' cat ' +pad(String(42), 6, '0'); // '004200' +pad('foobar', 3); // 'foobar' +``` + +
    + +
    [⬆ Back to top](#table-of-contents) + + ### palindrome Returns `true` if the given string is a palindrome, `false` otherwise. diff --git a/docs/index.html b/docs/index.html index c5b076685..5de07cb15 100644 --- a/docs/index.html +++ b/docs/index.html @@ -74,7 +74,7 @@ document.getElementById('doc-drawer-checkbox').checked = false; } }, false); - }

    logo 30 seconds of code Curated collection of useful JavaScript snippets that you can understand in 30 seconds or less.

     

    Adapter

    ary

    Creates a function that accepts up to n arguments, ignoring any additional arguments.

    Call the provided function, fn, with up to n arguments, using Array.slice(0,n) and the spread operator (...).

    const ary = (fn, n) => (...args) => fn(...args.slice(0, n));
    +      }

    logo 30 seconds of code Curated collection of useful JavaScript snippets that you can understand in 30 seconds or less.

     

    Adapter

    ary

    Creates a function that accepts up to n arguments, ignoring any additional arguments.

    Call the provided function, fn, with up to n arguments, using Array.slice(0,n) and the spread operator (...).

    const ary = (fn, n) => (...args) => fn(...args.slice(0, n));
     
    const firstTwoMax = ary(Math.max, 2);
     [[2, 6, 'a'], [8, 4, 6], [10]].map(x => firstTwoMax(...x)); // [6, 8, 10]
     

    call

    Given a key and a set of arguments, call them when given a context. Primarily useful in composition.

    Use a closure to call a stored key with stored arguments.

    const call = (key, ...args) => context => context[key](...args);
    @@ -1630,6 +1630,11 @@ Foo.prototypeShow examples
    mask(1234567890); // '******7890'
     mask(1234567890, 3); // '*******890'
     mask(1234567890, -4, '$'); // '$$$$567890'
    +

    pad

    Pads a string on both sides with the specified character, if it's shorter than the specified length.

    Use String.padStart() and String.padEnd() to pad both sides of the given string. Omit the third argument, char, to use the whitespace character as the default padding character.

    const pad = (str, length, char = ' ') =>
    +  str.padStart((str.length + length) / 2, char).padEnd(length, char);
    +
    pad('cat', 8); // '  cat   '
    +pad(String(42), 6, '0'); // '004200'
    +pad('foobar', 3); // 'foobar'
     

    palindrome

    Returns true if the given string is a palindrome, false otherwise.

    Convert string String.toLowerCase() and use String.replace() to remove non-alphanumeric characters from it. Then, String.split('') into individual characters, Array.reverse(), String.join('') and compare to the original, unreversed string, after converting it String.tolowerCase().

    const palindrome = str => {
       const s = str.toLowerCase().replace(/[\W_]/g, '');
       return (
    
    From a33988c5f01a1be7c10592882f8fa94c08f648fb Mon Sep 17 00:00:00 2001
    From: Angelos Chalaris 
    Date: Mon, 26 Feb 2018 14:03:32 +0200
    Subject: [PATCH 50/54] Update sortedLastIndex.md
    
    ---
     snippets/sortedLastIndex.md | 4 +---
     1 file changed, 1 insertion(+), 3 deletions(-)
    
    diff --git a/snippets/sortedLastIndex.md b/snippets/sortedLastIndex.md
    index 57d2499a3..281f6c3d4 100644
    --- a/snippets/sortedLastIndex.md
    +++ b/snippets/sortedLastIndex.md
    @@ -3,16 +3,14 @@
     Returns the highest index at which value should be inserted into array in order to maintain its sort order.
     
     Check if the array is sorted in descending order (loosely).
    -Use `Array.map()` to map each element to an array with its index and value.
     Use `Array.reverse()` and `Array.findIndex()` to find the appropriate last index where the element should be inserted.
     
     ```js
     const sortedLastIndex = (arr, n) => {
       const isDescending = arr[0] > arr[arr.length - 1];
       const index = arr
    -    .map((val, i) => [i, val])
         .reverse()
    -    .findIndex(el => (isDescending ? n <= el[1] : n >= el[1]));
    +    .findIndex(el => (isDescending ? n <= el : n >= el));
       return index === -1 ? 0 : arr.length - index - 1;
     };
     ```
    
    From 16a035b82b70765a0bac3f685ab2b2add2c7dd6a Mon Sep 17 00:00:00 2001
    From: 30secondsofcode <30secondsofcode@gmail.com>
    Date: Mon, 26 Feb 2018 12:04:41 +0000
    Subject: [PATCH 51/54] Travis build: 1744
    
    ---
     README.md                   | 6 +-----
     docs/index.html             | 7 ++-----
     snippets/sortedLastIndex.md | 4 +---
     3 files changed, 4 insertions(+), 13 deletions(-)
    
    diff --git a/README.md b/README.md
    index 23e142d1f..80ff561a8 100644
    --- a/README.md
    +++ b/README.md
    @@ -2312,16 +2312,12 @@ sortedIndexBy([{ x: 4 }, { x: 5 }], { x: 4 }, o => o.x); // 0
     Returns the highest index at which value should be inserted into array in order to maintain its sort order.
     
     Check if the array is sorted in descending order (loosely).
    -Use `Array.map()` to map each element to an array with its index and value.
     Use `Array.reverse()` and `Array.findIndex()` to find the appropriate last index where the element should be inserted.
     
     ```js
     const sortedLastIndex = (arr, n) => {
       const isDescending = arr[0] > arr[arr.length - 1];
    -  const index = arr
    -    .map((val, i) => [i, val])
    -    .reverse()
    -    .findIndex(el => (isDescending ? n <= el[1] : n >= el[1]));
    +  const index = arr.reverse().findIndex(el => (isDescending ? n <= el : n >= el));
       return index === -1 ? 0 : arr.length - index - 1;
     };
     ```
    diff --git a/docs/index.html b/docs/index.html
    index 5de07cb15..6da1d2431 100644
    --- a/docs/index.html
    +++ b/docs/index.html
    @@ -464,12 +464,9 @@ Object.assig
       return index === -1 ? arr.length : index;
     };
     
    sortedIndexBy([{ x: 4 }, { x: 5 }], { x: 4 }, o => o.x); // 0
    -

    sortedLastIndex

    Returns the highest index at which value should be inserted into array in order to maintain its sort order.

    Check if the array is sorted in descending order (loosely). Use Array.map() to map each element to an array with its index and value. Use Array.reverse() and Array.findIndex() to find the appropriate last index where the element should be inserted.

    const sortedLastIndex = (arr, n) => {
    +

    sortedLastIndex

    Returns the highest index at which value should be inserted into array in order to maintain its sort order.

    Check if the array is sorted in descending order (loosely). Use Array.reverse() and Array.findIndex() to find the appropriate last index where the element should be inserted.

    const sortedLastIndex = (arr, n) => {
       const isDescending = arr[0] > arr[arr.length - 1];
    -  const index = arr
    -    .map((val, i) => [i, val])
    -    .reverse()
    -    .findIndex(el => (isDescending ? n <= el[1] : n >= el[1]));
    +  const index = arr.reverse().findIndex(el => (isDescending ? n <= el : n >= el));
       return index === -1 ? 0 : arr.length - index - 1;
     };
     
    sortedLastIndex([10, 20, 30, 30, 40], 30); // 3
    diff --git a/snippets/sortedLastIndex.md b/snippets/sortedLastIndex.md
    index 281f6c3d4..43ecefab5 100644
    --- a/snippets/sortedLastIndex.md
    +++ b/snippets/sortedLastIndex.md
    @@ -8,9 +8,7 @@ Use `Array.reverse()` and `Array.findIndex()` to find the appropriate last index
     ```js
     const sortedLastIndex = (arr, n) => {
       const isDescending = arr[0] > arr[arr.length - 1];
    -  const index = arr
    -    .reverse()
    -    .findIndex(el => (isDescending ? n <= el : n >= el));
    +  const index = arr.reverse().findIndex(el => (isDescending ? n <= el : n >= el));
       return index === -1 ? 0 : arr.length - index - 1;
     };
     ```
    
    From 09f42d0dd1714665588d686644b15f75913d0a14 Mon Sep 17 00:00:00 2001
    From: Angelos Chalaris 
    Date: Mon, 26 Feb 2018 14:08:59 +0200
    Subject: [PATCH 52/54] Update sortedLastIndexBy.md
    
    ---
     snippets/sortedLastIndexBy.md | 7 ++++---
     1 file changed, 4 insertions(+), 3 deletions(-)
    
    diff --git a/snippets/sortedLastIndexBy.md b/snippets/sortedLastIndexBy.md
    index 443ba5045..97e60f827 100644
    --- a/snippets/sortedLastIndexBy.md
    +++ b/snippets/sortedLastIndexBy.md
    @@ -3,16 +3,17 @@
     Returns the highest index at which value should be inserted into array in order to maintain its sort order, based on a provided iterator function.
     
     Check if the array is sorted in descending order (loosely).
    -Use `Array.reverse()` and `Array.findIndex()` to find the appropriate last index where the element should be inserted, based on the iterator function `fn`..
    +Use `Array.map()` to apply the iterator function to all elements of the array.
    +Use `Array.reverse()` and `Array.findIndex()` to find the appropriate last index where the element should be inserted, based on the provided iterator function.
     
     ```js
     const sortedLastIndexBy = (arr, n, fn) => {
       const isDescending = fn(arr[0]) > fn(arr[arr.length - 1]);
       const val = fn(n);
       const index = arr
    -    .map((val, i) => [i, fn(val)])
    +    .map(fn)
         .reverse()
    -    .findIndex(el => (isDescending ? val <= el[1] : val >= el[1]));
    +    .findIndex(el => (isDescending ? val <= el : val >= el));
       return index === -1 ? 0 : arr.length - index;
     };
     ```
    
    From 441faf3ec29eeb6414a598971d1c141265cfea34 Mon Sep 17 00:00:00 2001
    From: 30secondsofcode <30secondsofcode@gmail.com>
    Date: Mon, 26 Feb 2018 12:11:09 +0000
    Subject: [PATCH 53/54] Travis build: 1746
    
    ---
     README.md       | 7 ++++---
     docs/index.html | 6 +++---
     2 files changed, 7 insertions(+), 6 deletions(-)
    
    diff --git a/README.md b/README.md
    index 80ff561a8..b1295b78d 100644
    --- a/README.md
    +++ b/README.md
    @@ -2339,16 +2339,17 @@ sortedLastIndex([10, 20, 30, 30, 40], 30); // 3
     Returns the highest index at which value should be inserted into array in order to maintain its sort order, based on a provided iterator function.
     
     Check if the array is sorted in descending order (loosely).
    -Use `Array.reverse()` and `Array.findIndex()` to find the appropriate last index where the element should be inserted, based on the iterator function `fn`..
    +Use `Array.map()` to apply the iterator function to all elements of the array.
    +Use `Array.reverse()` and `Array.findIndex()` to find the appropriate last index where the element should be inserted, based on the provided iterator function.
     
     ```js
     const sortedLastIndexBy = (arr, n, fn) => {
       const isDescending = fn(arr[0]) > fn(arr[arr.length - 1]);
       const val = fn(n);
       const index = arr
    -    .map((val, i) => [i, fn(val)])
    +    .map(fn)
         .reverse()
    -    .findIndex(el => (isDescending ? val <= el[1] : val >= el[1]));
    +    .findIndex(el => (isDescending ? val <= el : val >= el));
       return index === -1 ? 0 : arr.length - index;
     };
     ```
    diff --git a/docs/index.html b/docs/index.html
    index 6da1d2431..6cc929870 100644
    --- a/docs/index.html
    +++ b/docs/index.html
    @@ -470,13 +470,13 @@ Object.assig
       return index === -1 ? 0 : arr.length - index - 1;
     };
     
    sortedLastIndex([10, 20, 30, 30, 40], 30); // 3
    -

    sortedLastIndexBy

    Returns the highest index at which value should be inserted into array in order to maintain its sort order, based on a provided iterator function.

    Check if the array is sorted in descending order (loosely). Use Array.reverse() and Array.findIndex() to find the appropriate last index where the element should be inserted, based on the iterator function fn..

    const sortedLastIndexBy = (arr, n, fn) => {
    +

    sortedLastIndexBy

    Returns the highest index at which value should be inserted into array in order to maintain its sort order, based on a provided iterator function.

    Check if the array is sorted in descending order (loosely). Use Array.map() to apply the iterator function to all elements of the array. Use Array.reverse() and Array.findIndex() to find the appropriate last index where the element should be inserted, based on the provided iterator function.

    const sortedLastIndexBy = (arr, n, fn) => {
       const isDescending = fn(arr[0]) > fn(arr[arr.length - 1]);
       const val = fn(n);
       const index = arr
    -    .map((val, i) => [i, fn(val)])
    +    .map(fn)
         .reverse()
    -    .findIndex(el => (isDescending ? val <= el[1] : val >= el[1]));
    +    .findIndex(el => (isDescending ? val <= el : val >= el));
       return index === -1 ? 0 : arr.length - index;
     };
     
    sortedLastIndexBy([{ x: 4 }, { x: 5 }], { x: 4 }, o => o.x); // 1
    
    From 95c7674917e19dd0e26b77a1970902f559ab1b3d Mon Sep 17 00:00:00 2001
    From: Angelos Chalaris 
    Date: Mon, 26 Feb 2018 17:28:07 +0200
    Subject: [PATCH 54/54] Update isSimilar.md
    
    ---
     snippets_archive/isSimilar.md | 6 +++---
     1 file changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/snippets_archive/isSimilar.md b/snippets_archive/isSimilar.md
    index add2e6c02..7ed53b2ae 100644
    --- a/snippets_archive/isSimilar.md
    +++ b/snippets_archive/isSimilar.md
    @@ -1,10 +1,10 @@
     ### isSimilar
     
    -Determines if the `pattern` matches with `str`
    -
    -Loops through `str` and determines if it contains all characters of `pattern` and in the correct order. Both the strings are converted to lower case.
    +Determines if the `pattern` matches with `str`.
     
    +Use `String.toLowerCase()` to convert both strings to lowercase, then loop through `str` and determine if it contains all characters of `pattern` and in the correct order.
     Adapted from [here](https://github.com/forrestthewoods/lib_fts/blob/80f3f8c52db53428247e741b9efe2cde9667050c/code/fts_fuzzy_match.js#L18).
    +
     ``` js
     const isSimilar = (pattern, str) =>
     	[...str].reduce(