diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index be29162c3..a7e705e71 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -28,7 +28,7 @@ Here's what you can do to help:
- Use ES6 notation to define your function. For example `const myFunction = ( arg1, arg2 ) => { }`.
- Please use Javacript [Semi-Standard Style](https://github.com/Flet/semistandard).
- Try to keep your snippets' code short and to the point. Use modern techniques and features. Make sure to test your code before submitting.
- - All snippets must be followed by one (more if necessary) test case after the code, on a new line, in the form of a comment, along with the expected output. The syntax for this is `myFunction('testInput') -> 'testOutput'`. Use multiline comments only if necessary.
+ - All snippets must be followed by one (more if necessary) test case after the code, in a new block enclosed inside ` ```js ` and ` ``` `. The syntax for this is `myFunction('testInput') // 'testOutput'`. Use multiline examples only if necessary.
- Try to make your function name unique, so that it does not conflict with existing snippets.
- Snippet functions do not have to handle errors in input, unless it's necessary (e.g. a mathematical function that cannot be extended to negative numbers should handle negative input appropriately).
- Snippets should be short (usually below 10 lines). If your snippet is longer than that, you can still submit it, and we can help you shorten it or figure out ways to improve it.
diff --git a/README.md b/README.md
index a29b99093..f97b175e8 100644
--- a/README.md
+++ b/README.md
@@ -122,7 +122,6 @@
* [`randomIntegerInRange`](#randomintegerinrange)
* [`randomNumberInRange`](#randomnumberinrange)
* [`round`](#round)
-* [`sdbmHashAlgorithm`](#sdbmhashalgorithm)
* [`standardDeviation`](#standarddeviation)
### Media
@@ -169,8 +168,9 @@
* [`isNumber`](#isnumber)
* [`isString`](#isstring)
* [`isSymbol`](#issymbol)
-* [`randomHexColor`](#randomhexcolor)
+* [`randomHexColorCode`](#randomhexcolorcode)
* [`RGBToHex`](#rgbtohex)
+* [`sdbm`](#sdbm)
* [`timeTaken`](#timetaken)
* [`toDecimalMark`](#todecimalmark)
* [`toOrdinalSuffix`](#toordinalsuffix)
@@ -186,13 +186,14 @@ Given a key and a set of arguments, call them when given a context. Primarily us
Use a closure to call a stored key with stored arguments.
```js
-const call = (key, ...args) => context => context[ key ](...args);
-/*
+const call = ( key, ...args ) => context => context[ key ]( ...args );
+```
+
+```js
Promise.resolve( [ 1, 2, 3 ] ).then( call('map', x => 2 * x ) ).then( console.log ) //[ 2, 4, 6 ]
const map = call.bind(null, 'map')
Promise.resolve( [ 1, 2, 3 ] ).then( map( x => 2 * x ) ).then( console.log ) //[ 2, 4, 6 ]
-*/
-```
+```
[⬆ back to top](#table-of-contents)
@@ -203,15 +204,16 @@ Changes a function that accepts an array into a variadic function.
Given a function, return a closure that collects all inputs into an array-accepting function.
```js
-const collectInto = fn => (...args) => fn(args);
-/*
+const collectInto = fn => ( ...args ) => fn( args );
+```
+
+```js
const Pall = collectInto( Promise.all.bind(Promise) )
let p1 = Promise.resolve(1)
let p2 = Promise.resolve(2)
let p3 = new Promise((resolve) => setTimeout(resolve,2000,3))
Pall(p1, p2, p3).then(console.log)
-*/
-```
+```
[⬆ back to top](#table-of-contents)
@@ -223,7 +225,9 @@ Return a closure that takes variadic inputs, and splices the last argument to ma
```js
const flip = fn => (...args) => fn(args.pop(), ...args);
-/*
+```
+
+```js
let a = {name: 'John Smith'}
let b = {}
const mergeFrom = flip(Object.assign)
@@ -231,8 +235,7 @@ let mergePerson = mergeFrom.bind(null, a)
mergePerson(b) // == b
b = {}
Object.assign(b, a) // == b
-*/
-```
+```
[⬆ back to top](#table-of-contents)
@@ -245,12 +248,13 @@ The first (leftmost) function can accept one or more arguments; the remaining fu
```js
const pipeFunctions = (...fns) => fns.reduce((f, g) => (...args) => g(f(...args)));
-/*
+```
+
+```js
const add5 = x => x + 5
const multiply = (x, y) => x * y
const multiplyAndAdd5 = pipeFunctions(multiply, add5)
-multiplyAndAdd5(5, 2) -> 15
-*/
+multiplyAndAdd5(5, 2) // 15
```
[⬆ back to top](#table-of-contents)
@@ -271,8 +275,11 @@ const promisify = func =>
func(...args, (err, result) =>
err ? reject(err) : resolve(result))
);
-// const delay = promisify((d, cb) => setTimeout(cb, d))
-// delay(2000).then(() => console.log('Hi!')) -> Promise resolves after 2s
+```
+
+```js
+const delay = promisify((d, cb) => setTimeout(cb, d))
+delay(2000).then(() => console.log('Hi!')) // // Promise resolves after 2s
```
[⬆ back to top](#table-of-contents)
@@ -285,12 +292,13 @@ Use closures and the spread operator (`...`) to map the array of arguments to th
```js
const spreadOver = fn => argsArr => fn(...argsArr);
-/*
+```
+
+```js
const arrayMax = spreadOver(Math.max)
-arrayMax([1,2,3]) // -> 3
-arrayMax([1,2,4]) // -> 4
-*/
-```
+arrayMax([1,2,3]) // 3
+arrayMax([1,2,4]) // 4
+```
[⬆ back to top](#table-of-contents)
## Array
@@ -304,10 +312,13 @@ Use `Array.reduce()` and the `gcd` formula (uses recursion) to calculate the gre
```js
const arrayGcd = arr => {
const gcd = (x, y) => !y ? x : gcd(y, x % y);
- return arr.reduce((a, b) => gcd(a, b));
-};
-// arrayGcd([1,2,3,4,5]) -> 1
-// arrayGcd([4,8,12]) -> 4
+ return arr.reduce((a,b) => gcd(a,b));
+}
+```
+
+```js
+arrayGcd([1,2,3,4,5]) // 1
+arrayGcd([4,8,12]) // 4
```
[⬆ back to top](#table-of-contents)
@@ -321,11 +332,14 @@ Use `Array.reduce()` and the `lcm` formula (uses recursion) to calculate the low
```js
const arrayLcm = arr => {
const gcd = (x, y) => !y ? x : gcd(y, x % y);
- const lcm = (x, y) => (x * y) / gcd(x, y);
- return arr.reduce((a, b) => lcm(a, b));
-};
-// arrayLcm([1,2,3,4,5]) -> 60
-// arrayLcm([4,8,12]) -> 24
+ const lcm = (x, y) => (x*y)/gcd(x, y);
+ return arr.reduce((a,b) => lcm(a,b));
+}
+```
+
+```js
+arrayLcm([1,2,3,4,5]) // 60
+arrayLcm([4,8,12]) // 24
```
[⬆ back to top](#table-of-contents)
@@ -338,7 +352,10 @@ Use `Math.max()` combined with the spread operator (`...`) to get the maximum va
```js
const arrayMax = arr => Math.max(...arr);
-// arrayMax([10, 1, 5]) -> 10
+```
+
+```js
+arrayMax([10, 1, 5]) // 10
```
[⬆ back to top](#table-of-contents)
@@ -351,7 +368,10 @@ Use `Math.min()` combined with the spread operator (`...`) to get the minimum va
```js
const arrayMin = arr => Math.min(...arr);
-// arrayMin([10, 1, 5]) -> 1
+```
+
+```js
+arrayMin([10, 1, 5]) // 1
```
[⬆ back to top](#table-of-contents)
@@ -367,7 +387,10 @@ If the original array can't be split evenly, the final chunk will contain the re
```js
const chunk = (arr, size) =>
Array.from({length: Math.ceil(arr.length / size)}, (v, i) => arr.slice(i * size, i * size + size));
-// chunk([1,2,3,4,5], 2) -> [[1,2],[3,4],[5]]
+```
+
+```js
+chunk([1,2,3,4,5], 2) // [[1,2],[3,4],[5]]
```
[⬆ back to top](#table-of-contents)
@@ -380,7 +403,10 @@ Use `Array.filter()` to filter out falsey values (`false`, `null`, `0`, `""`, `u
```js
const compact = arr => arr.filter(Boolean);
-// compact([0, 1, false, 2, '', 3, 'a', 'e'*23, NaN, 's', 34]) -> [ 1, 2, 3, 'a', 's', 34 ]
+```
+
+```js
+compact([0, 1, false, 2, '', 3, 'a', 'e'*23, NaN, 's', 34]) // [ 1, 2, 3, 'a', 's', 34 ]
```
[⬆ back to top](#table-of-contents)
@@ -393,7 +419,10 @@ Use `Array.reduce()` to increment a counter each time you encounter the specific
```js
const countOccurrences = (arr, value) => arr.reduce((a, v) => v === value ? a + 1 : a + 0, 0);
-// countOccurrences([1,1,2,1,2,3], 1) -> 3
+```
+
+```js
+countOccurrences([1,1,2,1,2,3], 1) // 3
```
[⬆ back to top](#table-of-contents)
@@ -408,7 +437,10 @@ Recursively flatten each element that is an array.
```js
const deepFlatten = arr => [].concat(...arr.map(v => Array.isArray(v) ? deepFlatten(v) : v));
-// deepFlatten([1,[2],[[3],4],5]) -> [1,2,3,4,5]
+```
+
+```js
+deepFlatten([1,[2],[[3],4],5]) // [1,2,3,4,5]
```
[⬆ back to top](#table-of-contents)
@@ -421,7 +453,10 @@ Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values no
```js
const difference = (a, b) => { const s = new Set(b); return a.filter(x => !s.has(x)); };
-// difference([1,2,3], [1,2,4]) -> [3]
+```
+
+```js
+difference([1,2,3], [1,2,4]) // [3]
```
[⬆ back to top](#table-of-contents)
@@ -433,8 +468,11 @@ Filters out all values from an array for which the comparator function does not
Use `Array.filter()` and `Array.find()` to find the appropriate values.
```js
-const differenceWith = (arr, val, comp) => arr.filter(a => !val.find(b => comp(a, b)));
-// differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) -> [1, 1.2]
+const differenceWith = (arr, val, comp) => arr.filter(a => !val.find(b => comp(a, b)))
+```
+
+```js
+differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) // [1, 1.2]
```
[⬆ back to top](#table-of-contents)
@@ -447,7 +485,10 @@ Use ES6 `Set` and the `...rest` operator to discard all duplicated values.
```js
const distinctValuesOfArray = arr => [...new Set(arr)];
-// distinctValuesOfArray([1,2,2,3,4,4,5]) -> [1,2,3,4,5]
+```
+
+```js
+distinctValuesOfArray([1,2,2,3,4,4,5]) // [1,2,3,4,5]
```
[⬆ back to top](#table-of-contents)
@@ -464,7 +505,10 @@ const dropElements = (arr, func) => {
while (arr.length > 0 && !func(arr[0])) arr = arr.slice(1);
return arr;
};
-// dropElements([1, 2, 3, 4], n => n >= 3) -> [3,4]
+```
+
+```js
+dropElements([1, 2, 3, 4], n => n >= 3) // [3,4]
```
[⬆ back to top](#table-of-contents)
@@ -477,9 +521,12 @@ Use `Array.slice()` to slice the remove the specified number of elements from th
```js
const dropRight = (arr, n = 1) => arr.slice(0, -n);
-// dropRight([1,2,3]) -> [1,2]
-// dropRight([1,2,3], 2) -> [1]
-// dropRight([1,2,3], 42) -> []
+```
+
+```js
+dropRight([1,2,3]) // [1,2]
+dropRight([1,2,3], 2) // [1]
+dropRight([1,2,3], 42) // []
```
[⬆ back to top](#table-of-contents)
@@ -492,7 +539,10 @@ Use `Array.filter()` to create a new array that contains every nth element of a
```js
const everyNth = (arr, nth) => arr.filter((e, i) => i % nth === nth - 1);
-// everyNth([1,2,3,4,5,6], 2) -> [ 2, 4, 6 ]
+```
+
+```js
+everyNth([1,2,3,4,5,6], 2) // [ 2, 4, 6 ]
```
[⬆ back to top](#table-of-contents)
@@ -505,7 +555,10 @@ Use `Array.filter()` for an array containing only the unique values.
```js
const filterNonUnique = arr => arr.filter(i => arr.indexOf(i) === arr.lastIndexOf(i));
-// filterNonUnique([1,2,2,3,4,4,5]) -> [1,3,5]
+```
+
+```js
+filterNonUnique([1,2,2,3,4,4,5]) // [1,3,5]
```
[⬆ back to top](#table-of-contents)
@@ -517,8 +570,11 @@ Flattens an array.
Use a new array and concatenate it with the spread input array causing a shallow denesting of any contained arrays.
```js
-const flatten = arr => [ ].concat(...arr);
-// flatten([1,[2],3,4]) -> [1,2,3,4]
+const flatten = arr => [ ].concat( ...arr );
+```
+
+```js
+flatten([1,[2],3,4]) // [1,2,3,4]
```
[⬆ back to top](#table-of-contents)
@@ -536,7 +592,10 @@ Omit the second element, `depth` to flatten only to a depth of `1` (single flatt
const flattenDepth = (arr, depth = 1) =>
depth != 1 ? arr.reduce((a, v) => a.concat(Array.isArray(v) ? flattenDepth(v, depth - 1) : v), [])
: arr.reduce((a, v) => a.concat(v), []);
-// flattenDepth([1,[2],[[[3],4],5]], 2) -> [1,2,[3],4,5]
+```
+
+```js
+flattenDepth([1,[2],3,4]) // [1,2,3,4]
```
[⬆ back to top](#table-of-contents)
@@ -552,8 +611,11 @@ Use `Array.reduce()` to create an object, where the keys are produced from the m
const groupBy = (arr, func) =>
arr.map(typeof func === 'function' ? func : val => val[func])
.reduce((acc, val, i) => { acc[val] = (acc[val] || []).concat(arr[i]); return acc; }, {});
-// groupBy([6.1, 4.2, 6.3], Math.floor) -> {4: [4.2], 6: [6.1, 6.3]}
-// groupBy(['one', 'two', 'three'], 'length') -> {3: ['one', 'two'], 5: ['three']}
+```
+
+```js
+groupBy([6.1, 4.2, 6.3], Math.floor) // {4: [4.2], 6: [6.1, 6.3]}
+groupBy(['one', 'two', 'three'], 'length') // {3: ['one', 'two'], 5: ['three']}
```
[⬆ back to top](#table-of-contents)
@@ -566,7 +628,10 @@ Use `arr[0]` to return the first element of the passed array.
```js
const head = arr => arr[0];
-// head([1,2,3]) -> 1
+```
+
+```js
+head([1,2,3]) // 1
```
[⬆ back to top](#table-of-contents)
@@ -579,7 +644,10 @@ Use `arr.slice(0,-1)` to return all but the last element of the array.
```js
const initial = arr => arr.slice(0, -1);
-// initial([1,2,3]) -> [1,2]
+```
+
+```js
+initial([1,2,3]) // [1,2]
```
[⬆ back to top](#table-of-contents)
@@ -592,7 +660,10 @@ Use `Array.map()` to generate h rows where each is a new array of size w initial
```js
const initialize2DArray = (w, h, val = null) => Array(h).fill().map(() => Array(w).fill(val));
-// initializeArrayWithRange(2, 2, 0) -> [[0,0], [0,0]]
+```
+
+```js
+initialize2DArray(2, 2, 0) // [[0,0], [0,0]]
```
[⬆ back to top](#table-of-contents)
@@ -607,8 +678,11 @@ You can omit `start` to use a default value of `0`.
```js
const initializeArrayWithRange = (end, start = 0) =>
Array.from({ length: (end + 1) - start }).map((v, i) => i + start);
-// initializeArrayWithRange(5) -> [0,1,2,3,4,5]
-// initializeArrayWithRange(7, 3) -> [3,4,5,6,7]
+```
+
+```js
+initializeArrayWithRange(5) // [0,1,2,3,4,5]
+initializeArrayWithRange(7, 3) // [3,4,5,6,7]
```
[⬆ back to top](#table-of-contents)
@@ -622,7 +696,10 @@ You can omit `value` to use a default value of `0`.
```js
const initializeArrayWithValues = (n, value = 0) => Array(n).fill(value);
-// initializeArrayWithValues(5, 2) -> [2,2,2,2,2]
+```
+
+```js
+initializeArrayWithValues(5, 2) // [2,2,2,2,2]
```
[⬆ back to top](#table-of-contents)
@@ -635,7 +712,10 @@ Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values co
```js
const intersection = (a, b) => { const s = new Set(b); return a.filter(x => s.has(x)); };
-// intersection([1,2,3], [4,3,2]) -> [2,3]
+```
+
+```js
+intersection([1,2,3], [4,3,2]) // [2,3]
```
[⬆ back to top](#table-of-contents)
@@ -648,7 +728,10 @@ Use `arr.length - 1` to compute the index of the last element of the given array
```js
const last = arr => arr[arr.length - 1];
-// last([1,2,3]) -> 3
+```
+
+```js
+last([1,2,3]) // 3
```
[⬆ back to top](#table-of-contents)
@@ -661,11 +744,12 @@ Use an anonymous inner function scope to declare an undefined memory space, usin
```js
const mapObject = (arr, fn) =>
- (a => (a = [arr, arr.map(fn)], a[0].reduce((acc, val, ind) => (acc[val] = a[1][ind], acc), {})))();
-/*
+ (a => (a = [arr, arr.map(fn)], a[0].reduce( (acc,val,ind) => (acc[val] = a[1][ind], acc), {}) )) ( );
+```
+
+```js
const squareIt = arr => mapObject(arr, a => a*a)
squareIt([1,2,3]) // { 1: 1, 2: 4, 3: 9 }
-*/
```
[⬆ back to top](#table-of-contents)
@@ -679,9 +763,12 @@ If the index is out of bounds, return `[]`.
Omit the second argument, `n`, to get the first element of the array.
```js
-const nthElement = (arr, n = 0) => (n > 0 ? arr.slice(n, n + 1) : arr.slice(n))[0];
-// nthElement(['a','b','c'],1) -> 'b'
-// nthElement(['a','b','b'],-3) -> 'a'
+const nthElement = (arr, n=0) => (n>0? arr.slice(n,n+1) : arr.slice(n))[0];
+```
+
+```js
+nthElement(['a','b','c'],1) // 'b'
+nthElement(['a','b','b'],-3) // 'a'
```
[⬆ back to top](#table-of-contents)
@@ -695,7 +782,10 @@ Use `Array.reduce()` to convert the filtered/picked keys back to an object with
```js
const pick = (obj, arr) =>
arr.reduce((acc, curr) => (curr in obj && (acc[curr] = obj[curr]), acc), {});
-// pick({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c']) -> { 'a': 1, 'c': 3 }
+```
+
+```js
+pick({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c']) // { 'a': 1, 'c': 3 }
```
[⬆ back to top](#table-of-contents)
@@ -716,14 +806,16 @@ const pull = (arr, ...args) => {
arr.length = 0;
pulled.forEach(v => arr.push(v));
};
+```
-// let myArray1 = ['a', 'b', 'c', 'a', 'b', 'c'];
-// pull(myArray1, 'a', 'c');
-// console.log(myArray1) -> [ 'b', 'b' ]
+```js
+let myArray1 = ['a', 'b', 'c', 'a', 'b', 'c'];
+pull(myArray1, 'a', 'c');
+console.log(myArray1) // [ 'b', 'b' ]
-// let myArray2 = ['a', 'b', 'c', 'a', 'b', 'c'];
-// pull(myArray2, ['a', 'c']);
-// console.log(myArray2) -> [ 'b', 'b' ]
+let myArray2 = ['a', 'b', 'c', 'a', 'b', 'c'];
+pull(myArray2, ['a', 'c']);
+console.log(myArray2) // [ 'b', 'b' ]
```
[⬆ back to top](#table-of-contents)
@@ -734,23 +826,25 @@ Mutates the original array to filter out the values at the specified indexes.
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.
-Use `Array.push()` to keep track of pulled values
+Use `Array.push()` to keep track of pulled values
```js
const pullAtIndex = (arr, pullArr) => {
let removed = [];
let pulled = arr.map((v, i) => pullArr.includes(i) ? removed.push(v) : v)
- .filter((v, i) => !pullArr.includes(i));
+ .filter((v, i) => !pullArr.includes(i))
arr.length = 0;
pulled.forEach(v => arr.push(v));
return removed;
-};
+}
+```
-// let myArray = ['a', 'b', 'c', 'd'];
-// let pulled = pullAtIndex(myArray, [1, 3]);
+```js
+let myArray = ['a', 'b', 'c', 'd'];
+let pulled = pullAtIndex(myArray, [1, 3]);
-// console.log(myArray); -> [ 'a', 'c' ]
-// console.log(pulled); -> [ 'b', 'd' ]
+console.log(myArray); // [ 'a', 'c' ]
+console.log(pulled); // [ 'b', 'd' ]
```
[⬆ back to top](#table-of-contents)
@@ -761,7 +855,7 @@ Mutates the original array to filter out the values specified. Returns the remov
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.
-Use `Array.push()` to keep track of pulled values
+Use `Array.push()` to keep track of pulled values
```js
const pullAtValue = (arr, pullArr) => {
@@ -771,13 +865,14 @@ const pullAtValue = (arr, pullArr) => {
arr.length = 0;
mutateTo.forEach(v => arr.push(v));
return removed;
-};
-/*
+}
+```
+
+```js
let myArray = ['a', 'b', 'c', 'd'];
let pulled = pullAtValue(myArray, ['b', 'd']);
-console.log(myArray); -> [ 'a', 'c' ]
-console.log(pulled); -> [ 'b', 'd' ]
-*/
+console.log(myArray); // [ 'a', 'c' ]
+console.log(pulled); // [ 'b', 'd' ]
```
[⬆ back to top](#table-of-contents)
@@ -795,7 +890,10 @@ const remove = (arr, func) =>
arr.splice(arr.indexOf(val), 1); return acc.concat(val);
}, [])
: [];
-// remove([1, 2, 3, 4], n => n % 2 == 0) -> [2, 4]
+```
+
+```js
+remove([1, 2, 3, 4], n => n % 2 == 0) // [2, 4]
```
[⬆ back to top](#table-of-contents)
@@ -809,7 +907,10 @@ This method also works with strings.
```js
const sample = arr => arr[Math.floor(Math.random() * arr.length)];
-// sample([3, 7, 9, 11]) -> 9
+```
+
+```js
+sample([3, 7, 9, 11]) // 9
```
[⬆ back to top](#table-of-contents)
@@ -829,9 +930,12 @@ const shuffle = ([...arr]) => {
}
return arr;
};
-// const foo = [1,2,3]
-// shuffle(foo) -> [2,3,1]
-// console.log(foo) -> [1,2,3]
+```
+
+```js
+const foo = [1,2,3]
+shuffle(foo) // [2,3,1]
+console.log(foo) // [1,2,3]
```
[⬆ back to top](#table-of-contents)
@@ -844,7 +948,10 @@ Use `filter()` to remove values that are not part of `values`, determined using
```js
const similarity = (arr, values) => arr.filter(v => values.includes(v));
-// similarity([1,2,3], [1,2,4]) -> [1,2]
+```
+
+```js
+similarity([1,2,3], [1,2,4]) // [1,2]
```
[⬆ back to top](#table-of-contents)
@@ -859,8 +966,11 @@ Create a `Set` from each array, then use `Array.filter()` on each of them to onl
const symmetricDifference = (a, b) => {
const sA = new Set(a), sB = new Set(b);
return [...a.filter(x => !sB.has(x)), ...b.filter(x => !sA.has(x))];
-};
-// symmetricDifference([1,2,3], [1,2,4]) -> [3,4]
+}
+```
+
+```js
+symmetricDifference([1,2,3], [1,2,4]) // [3,4]
```
[⬆ back to top](#table-of-contents)
@@ -873,8 +983,11 @@ Return `arr.slice(1)` if the array's `length` is more than `1`, otherwise, retur
```js
const tail = arr => arr.length > 1 ? arr.slice(1) : arr;
-// tail([1,2,3]) -> [2,3]
-// tail([1]) -> [1]
+```
+
+```js
+tail([1,2,3]) // [2,3]
+tail([1]) // [1]
```
[⬆ back to top](#table-of-contents)
@@ -887,8 +1000,11 @@ Use `Array.slice()` to create a slice of the array with `n` elements taken from
```js
const take = (arr, n = 1) => arr.slice(0, n);
-// take([1, 2, 3], 5) -> [1, 2, 3]
-// take([1, 2, 3], 0) -> []
+```
+
+```js
+take([1, 2, 3], 5) // [1, 2, 3]
+take([1, 2, 3], 0) // []
```
[⬆ back to top](#table-of-contents)
@@ -901,8 +1017,11 @@ Use `Array.slice()` to create a slice of the array with `n` elements taken from
```js
const takeRight = (arr, n = 1) => arr.slice(arr.length - n, arr.length);
-// takeRight([1, 2, 3], 2) -> [ 2, 3 ]
-// takeRight([1, 2, 3]) -> [3]
+```
+
+```js
+takeRight([1, 2, 3], 2) // [ 2, 3 ]
+takeRight([1, 2, 3]) // [3]
```
[⬆ back to top](#table-of-contents)
@@ -915,7 +1034,10 @@ Create a `Set` with all values of `a` and `b` and convert to an array.
```js
const union = (a, b) => Array.from(new Set([...a, ...b]));
-// union([1,2,3], [4,3,2]) -> [1,2,3,4]
+```
+
+```js
+union([1,2,3], [4,3,2]) // [1,2,3,4]
```
[⬆ back to top](#table-of-contents)
@@ -930,7 +1052,10 @@ _(For a snippet that mutates the original array see [`pull`](#pull))_
```js
const without = (arr, ...args) => arr.filter(v => !args.includes(v));
-// without([2, 1, 2, 3], 1, 2) -> [3]
+```
+
+```js
+without([2, 1, 2, 3], 1, 2) // [3]
```
[⬆ back to top](#table-of-contents)
@@ -947,11 +1072,14 @@ If lengths of the argument-arrays vary, `undefined` is used where no value could
const zip = (...arrays) => {
const maxLength = Math.max(...arrays.map(x => x.length));
return Array.from({length: maxLength}).map((_, i) => {
- return Array.from({length: arrays.length}, (_, k) => arrays[k][i]);
- });
-};
-// zip(['a', 'b'], [1, 2], [true, false]); -> [['a', 1, true], ['b', 2, false]]
-// zip(['a'], [1, 2], [true, false]); -> [['a', 1, true], [undefined, 2, false]]
+ return Array.from({length: arrays.length}, (_, k) => arrays[k][i]);
+ })
+}
+```
+
+```js
+zip(['a', 'b'], [1, 2], [true, false]); // [['a', 1, true], ['b', 2, false]]
+zip(['a'], [1, 2], [true, false]); // [['a', 1, true], [undefined, 2, false]]
```
[⬆ back to top](#table-of-contents)
@@ -963,9 +1091,12 @@ Given an array of valid property identifiers and an array of values, return an o
Since an object can have undefined values but not undefined property pointers, the array of properties is used to decide the structure of the resulting object using `Array.reduce()`.
```js
-const zipObject = (props, values) => props.reduce((obj, prop, index) => (obj[prop] = values[index], obj), {});
-// zipObject(['a','b','c'], [1,2]) -> {a: 1, b: 2, c: undefined}
-// zipObject(['a','b'], [1,2,3]) -> {a: 1, b: 2}
+const zipObject = ( props, values ) => props.reduce( ( obj, prop, index ) => ( obj[prop] = values[index], obj ), {} )
+```
+
+```js
+zipObject(['a','b','c'], [1,2]) // {a: 1, b: 2, c: undefined}
+zipObject(['a','b'], [1,2,3]) // {a: 1, b: 2}
```
[⬆ back to top](#table-of-contents)
@@ -978,8 +1109,11 @@ Converts the given array elements into `
` tags and appends them to the list
Use `Array.map()` and `document.querySelector()` to create a list of html tags.
```js
-const arrayToHtmlList = (arr, listID) => arr.map(item => document.querySelector('#' + listID).innerHTML += ` ${item} `);
-// arrayToHtmlList(['item 1', 'item 2'],'myListID')
+const arrayToHtmlList = (arr, listID) => arr.map(item => document.querySelector("#"+listID).innerHTML+=`${item} `);
+```
+
+```js
+arrayToHtmlList(['item 1', 'item 2'],'myListID')
```
[⬆ back to top](#table-of-contents)
@@ -993,7 +1127,10 @@ Use `scrollY`, `scrollHeight` and `clientHeight` to determine if the bottom of t
```js
const bottomVisible = () =>
document.documentElement.clientHeight + window.scrollY >= (document.documentElement.scrollHeight || document.documentElement.clientHeight);
-// bottomVisible() -> true
+```
+
+```js
+bottomVisible() // true
```
[⬆ back to top](#table-of-contents)
@@ -1006,7 +1143,10 @@ Use `window.location.href` to get current URL.
```js
const currentURL = () => window.location.href;
-// currentUrl() -> 'https://google.com'
+```
+
+```js
+currentUrl() // 'https://google.com'
```
[⬆ back to top](#table-of-contents)
@@ -1018,9 +1158,12 @@ Detects wether the website is being opened in a mobile device or a desktop/lapto
Use a regular expression to test the `navigator.userAgent` property to figure out if the device is a mobile device or a desktop/laptop.
```js
-const detectDeviceType = () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ? 'Mobile' : 'Desktop';
-// detectDeviceType() -> "Mobile"
-// detectDeviceType() -> "Desktop"
+const detectDeviceType = () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ? "Mobile" : "Desktop";
+```
+
+```js
+detectDeviceType() // "Mobile"
+detectDeviceType() // "Desktop"
```
[⬆ back to top](#table-of-contents)
@@ -1043,9 +1186,12 @@ const elementIsVisibleInViewport = (el, partiallyVisible = false) => {
((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth))
: top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth;
};
+```
+
+```js
// e.g. 100x100 viewport and a 10x10px element at position {top: -1, left: 0, bottom: 9, right: 10}
-// elementIsVisibleInViewport(el) -> false (not fully visible)
-// elementIsVisibleInViewport(el, true) -> true (partially visible)
+elementIsVisibleInViewport(el) // false // (not fully visible)
+elementIsVisibleInViewport(el, true) // true // (partially visible)
```
[⬆ back to top](#table-of-contents)
@@ -1061,7 +1207,10 @@ You can omit `el` to use a default value of `window`.
const getScrollPosition = (el = window) =>
({x: (el.pageXOffset !== undefined) ? el.pageXOffset : el.scrollLeft,
y: (el.pageYOffset !== undefined) ? el.pageYOffset : el.scrollTop});
-// getScrollPosition() -> {x: 0, y: 200}
+```
+
+```js
+getScrollPosition() // {x: 0, y: 200}
```
[⬆ back to top](#table-of-contents)
@@ -1078,7 +1227,10 @@ const getURLParameters = url =>
url.match(/([^?=&]+)(=([^&]*))/g).reduce(
(a, v) => (a[v.slice(0, v.indexOf('='))] = v.slice(v.indexOf('=') + 1), a), {}
);
-// getURLParameters('http://url.com/page?name=Adam&surname=Smith') -> {name: 'Adam', surname: 'Smith'}
+```
+
+```js
+getURLParameters('http://url.com/page?name=Adam&surname=Smith') // {name: 'Adam', surname: 'Smith'}
```
[⬆ back to top](#table-of-contents)
@@ -1107,7 +1259,10 @@ Pass a second argument to simulate a link click (`true` - default) or an HTTP re
```js
const redirect = (url, asLink = true) =>
asLink ? window.location.href = url : window.location.replace(url);
-// redirect('https://google.com')
+```
+
+```js
+redirect('https://google.com')
```
[⬆ back to top](#table-of-contents)
@@ -1127,7 +1282,10 @@ const scrollToTop = () => {
window.scrollTo(0, c - c / 8);
}
};
-// scrollToTop()
+```
+
+```js
+scrollToTop()
```
[⬆ back to top](#table-of-contents)
@@ -1141,7 +1299,10 @@ Calculate the difference (in days) between two `Date` objects.
```js
const getDaysDiffBetweenDates = (dateInitial, dateFinal) => (dateFinal - dateInitial) / (1000 * 3600 * 24);
-// getDaysDiffBetweenDates(new Date("2017-12-13"), new Date("2017-12-22")) -> 9
+```
+
+```js
+getDaysDiffBetweenDates(new Date("2017-12-13"), new Date("2017-12-22")) // 9
```
[⬆ back to top](#table-of-contents)
@@ -1157,7 +1318,10 @@ const JSONToDate = arr => {
const dt = new Date(parseInt(arr.toString().substr(6)));
return `${dt.getDate()}/${dt.getMonth() + 1}/${dt.getFullYear()}`;
};
-// JSONToDate(/Date(1489525200000)/) -> "14/3/2017"
+```
+
+```js
+JSONToDate(/Date(1489525200000)/) // "14/3/2017"
```
[⬆ back to top](#table-of-contents)
@@ -1171,7 +1335,10 @@ Throws an error if the passed time cannot be converted to a date.
```js
const toEnglishDate = (time) => { try { return new Date(time).toISOString().split('T')[0].replace(/-/g, '/'); } catch (e) {} };
-// toEnglishDate('09/21/2010') -> '21/09/2010'
+```
+
+```js
+toEnglishDate('09/21/2010') // '21/09/2010'
```
[⬆ back to top](#table-of-contents)
@@ -1183,7 +1350,10 @@ Use `new Date()` to get today's date, adding `86400000` of seconds to it(24 hour
```js
const tomorrow = () => new Date(new Date().getTime() + 86400000).toISOString().split('T')[0];
-// tomorrow() -> 2017-12-27 (if current date is 2017-12-26)
+```
+
+```js
+tomorrow() // 2017-12-27 (if current date is 2017-12-26)
```
[⬆ back to top](#table-of-contents)
@@ -1197,13 +1367,14 @@ Loop through an array of functions containing asynchronous events, calling `next
```js
const chainAsync = fns => { let curr = 0; const next = () => fns[curr++](next); next(); };
-/*
+```
+
+```js
chainAsync([
next => { console.log('0 seconds'); setTimeout(next, 1000); },
next => { console.log('1 second'); setTimeout(next, 1000); },
next => { console.log('2 seconds'); }
])
-*/
```
[⬆ back to top](#table-of-contents)
@@ -1217,12 +1388,13 @@ The last (rightmost) function can accept one or more arguments; the remaining fu
```js
const compose = (...fns) => fns.reduce((f, g) => (...args) => f(g(...args)));
-/*
+```
+
+```js
const add5 = x => x + 5
const multiply = (x, y) => x * y
const multiplyAndAdd5 = compose(add5, multiply)
-multiplyAndAdd5(5, 2) -> 15
-*/
+multiplyAndAdd5(5, 2) // 15
```
[⬆ back to top](#table-of-contents)
@@ -1241,8 +1413,11 @@ const curry = (fn, arity = fn.length, ...args) =>
arity <= args.length
? fn(...args)
: curry.bind(null, fn, arity, ...args);
-// curry(Math.pow)(2)(10) -> 1024
-// curry(Math.min, 3)(10)(50)(2) -> 2
+```
+
+```js
+curry(Math.pow)(2)(10) // 1024
+curry(Math.min, 3)(10)(50)(2) // 2
```
[⬆ back to top](#table-of-contents)
@@ -1255,7 +1430,10 @@ Use `console.debug()` and the `name` property of the passed method to log the me
```js
const functionName = fn => (console.debug(fn.name), fn);
-// functionName(Math.max) -> max (logged in debug channel of console)
+```
+
+```js
+functionName(Math.max) // max (logged in debug channel of console)
```
[⬆ back to top](#table-of-contents)
@@ -1268,8 +1446,11 @@ Use `Array.reduce()` to create a promise chain, where each promise returns the n
```js
const runPromisesInSeries = ps => ps.reduce((p, next) => p.then(next), Promise.resolve());
-// const delay = (d) => new Promise(r => setTimeout(r, d))
-// runPromisesInSeries([() => delay(1000), () => delay(2000)]) -> executes each promise sequentially, taking a total of 3 seconds to complete
+```
+
+```js
+const delay = (d) => new Promise(r => setTimeout(r, d))
+runPromisesInSeries([() => delay(1000), () => delay(2000)]) // //executes each promise sequentially, taking a total of 3 seconds to complete
```
[⬆ back to top](#table-of-contents)
@@ -1282,13 +1463,14 @@ Delay executing part of an `async` function, by putting it to sleep, returning a
```js
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
-/*
+```
+
+```js
async function sleepyWork() {
console.log('I\'m going to sleep for 1 second.');
await sleep(1000);
console.log('I woke up after 1 second.');
}
-*/
```
[⬆ back to top](#table-of-contents)
@@ -1302,8 +1484,11 @@ Take a predicate function and apply `not` to it with its arguments.
```js
const negate = func => (...args) => !func(...args);
-// filter([1, 2, 3, 4, 5, 6], negate(isEven)) -> [1, 3, 5]
-// negate(isOdd)(1) -> false
+```
+
+```js
+filter([1, 2, 3, 4, 5, 6], negate(isEven)) // [1, 3, 5]
+negate(isOdd)(1) // false
```
[⬆ back to top](#table-of-contents)
@@ -1317,7 +1502,10 @@ Use `Array.reduce()` to add each value to an accumulator, initialized with a val
```js
const arrayAverage = arr => arr.reduce((acc, val) => acc + val, 0) / arr.length;
-// arrayAverage([1,2,3]) -> 2
+```
+
+```js
+arrayAverage([1,2,3]) // 2
```
[⬆ back to top](#table-of-contents)
@@ -1330,23 +1518,29 @@ Use `Array.reduce()` to add each value to an accumulator, initialized with a val
```js
const arraySum = arr => arr.reduce((acc, val) => acc + val, 0);
-// arraySum([1,2,3,4]) -> 10
+```
+
+```js
+arraySum([1,2,3,4]) // 10
```
[⬆ back to top](#table-of-contents)
### clampNumber
-Clamps `num` within the inclusive range specified by the boundary values `a` and `b`
+Clamps `num` within the inclusive range specified by the boundary values `a` and `b`.
-If `num` falls within the range, return `num`.
+If `num` falls within the range, return `num`.
Otherwise, return the nearest number in the range.
```js
const clampNumber = (num, a, b) => Math.max(Math.min(num, Math.max(a,b)),Math.min(a,b));
-// clampNumber(2, 3, 5) -> 3
-// clampNumber(1, -1, -5) -> -1
-// clampNumber(3, 2, 4) -> 3
+```
+
+```js
+clampNumber(2, 3, 5) // 3
+clampNumber(1, -1, -5) // -1
+clampNumber(3, 2, 4) // 3
```
[⬆ back to top](#table-of-contents)
@@ -1359,8 +1553,11 @@ If `n` is even, return `n/2`. Otherwise, return `3n+1`.
```js
const collatz = n => (n % 2 == 0) ? (n / 2) : (3 * n + 1);
-// collatz(8) --> 4
-// collatz(5) --> 16
+```
+
+```js
+collatz(8) // 4
+collatz(5) // 16
```
[⬆ back to top](#table-of-contents)
@@ -1373,8 +1570,11 @@ Convert the number to a string, using spread operators in ES6(`[...string]`) bui
Use `Array.map()` and `parseInt()` to transform each value to an integer.
```js
-const digitize = n => [...'' + n].map(i => parseInt(i));
-// digitize(2334) -> [2, 3, 3, 4]
+const digitize = n => [...''+n].map(i => parseInt(i));
+```
+
+```js
+differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) // [1, 1.2]
```
[⬆ back to top](#table-of-contents)
@@ -1387,7 +1587,10 @@ Use `Math.hypot()` to calculate the Euclidean distance between two points.
```js
const distance = (x0, y0, x1, y1) => Math.hypot(x1 - x0, y1 - y0);
-// distance(1,1, 2,3) -> 2.23606797749979
+```
+
+```js
+distance(1,1, 2,3) // 2.23606797749979
```
[⬆ back to top](#table-of-contents)
@@ -1405,7 +1608,10 @@ Throws an exception if `n` is a negative number.
const factorial = n =>
n < 0 ? (() => { throw new TypeError('Negative numbers are not allowed!'); })()
: n <= 1 ? 1 : n * factorial(n - 1);
-// factorial(6) -> 720
+```
+
+```js
+factorial(6) // 720
```
[⬆ back to top](#table-of-contents)
@@ -1420,7 +1626,10 @@ Use `Array.reduce()` to add values into the array, using the sum of the last two
```js
const fibonacci = n =>
Array.from({ length: n}).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []);
-// fibonacci(5) -> [0,1,1,2,3]
+```
+
+```js
+fibonacci(6) // 720
```
[⬆ back to top](#table-of-contents)
@@ -1433,8 +1642,11 @@ Use a mathematical formula to calculate the number of fibonacci numbers until `n
```js
const fibonacciCountUntilNum = num =>
- Math.ceil(Math.log(num * Math.sqrt(5) + 1 / 2) / Math.log((Math.sqrt(5) + 1) / 2));
-// fibonacciCountUntilNum(10) -> 7
+ Math.ceil(Math.log(num * Math.sqrt(5) + 1/2) / Math.log((Math.sqrt(5)+1)/2));
+```
+
+```js
+fibonacciCountUntilNum(10) // 7
```
[⬆ back to top](#table-of-contents)
@@ -1451,8 +1663,11 @@ Uses a mathematical formula to calculate the length of the array required.
const fibonacciUntilNum = num => {
let n = Math.ceil(Math.log(num * Math.sqrt(5) + 1 / 2) / Math.log((Math.sqrt(5) + 1) / 2));
return Array.from({ length: n}).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []);
-};
-// fibonacciUntilNum(15) -> [0,1,1,2,3,5,8,13]
+}
+```
+
+```js
+fibonacciCountUntilNum(10) // 7
```
[⬆ back to top](#table-of-contents)
@@ -1467,7 +1682,10 @@ Otherwise, return the GCD of `y` and the remainder of the division `x/y`.
```js
const gcd = (x, y) => !y ? x : gcd(y, x % y);
-// gcd (8, 36) -> 4
+```
+
+```js
+gcd (8, 36) // 4
```
[⬆ back to top](#table-of-contents)
@@ -1482,27 +1700,33 @@ Count and return the number of `1`s in the string, using `match(/1/g)`.
```js
const hammingDistance = (num1, num2) =>
((num1 ^ num2).toString(2).match(/1/g) || '').length;
-// hammingDistance(2,3) -> 1
+```
+
+```js
+hammingDistance(2,3) // 1
```
[⬆ back to top](#table-of-contents)
### inRange
-Checks if the given number falls within the given range.
+Checks if the given number falls within the given range.
Use arithmetic comparison to check if the given number is in the specified range.
If the second parameter, `end`, is not specified, the range is considered to be from `0` to `start`.
```js
-const inRange = (n, start, end = null) => {
- if (end && start > end) end = [start, start = end][0];
- return (end == null) ? (n >= 0 && n < start) : (n >= start && n < end);
-};
-// inRange(3, 2, 5) -> true
-// inRange(3, 4) -> true
-// inRange(2, 3, 5) -> false
-// inrange(3, 2) -> false
+const inRange = (n, start, end=null) => {
+ if(end && start > end) end = [start, start=end][0];
+ return (end == null) ? (n>=0 && n=start && n
- (arr => arr.reduce((a, d) => a + Math.pow(parseInt(d), arr.length), 0) == digits)((digits + '').split(''));
-// isArmstrongNumber(1634) -> true
-// isArmstrongNumber(371) -> true
-// isArmstrongNumber(56) -> false
+ ( arr => arr.reduce( ( a, d ) => a + Math.pow( parseInt( d ), arr.length ), 0 ) == digits ? true : false )( ( digits+'' ).split( '' ) );
+```
+
+```js
+isArmstrongNumber(1634) // true
+isArmstrongNumber(371) // true
+isArmstrongNumber(56) // false
```
[⬆ back to top](#table-of-contents)
@@ -1531,7 +1758,10 @@ Use the modulo operator (`%`) to check if the remainder is equal to `0`.
```js
const isDivisible = (dividend, divisor) => dividend % divisor === 0;
-// isDivisible(6,3) -> true
+```
+
+```js
+isDivisible(6,3) // true
```
[⬆ back to top](#table-of-contents)
@@ -1545,7 +1775,10 @@ Returns `true` if the number is even, `false` if the number is odd.
```js
const isEven = num => num % 2 === 0;
-// isEven(3) -> false
+```
+
+```js
+isEven(3) // false
```
[⬆ back to top](#table-of-contents)
@@ -1554,7 +1787,7 @@ const isEven = num => num % 2 === 0;
Checks if the provided integer is a prime number.
-Check numbers from `2` to the square root of the given number.
+Check numbers from `2` to the square root of the given number.
Return `false` if any of them divides the given number, else return `true`, unless the number is less than `2`.
```js
@@ -1563,8 +1796,11 @@ const isPrime = num => {
for (var i = 2; i * i <= boundary; i++) if (num % i == 0) return false;
return num >= 2;
};
-// isPrime(11) -> true
-// isPrime(12) -> false
+```
+
+```js
+isPrime(11) // true
+isPrime(12) // false
```
[⬆ back to top](#table-of-contents)
@@ -1581,7 +1817,10 @@ const lcm = (x, y) => {
const gcd = (x, y) => !y ? x : gcd(y, x % y);
return Math.abs(x * y) / (gcd(x, y));
};
-// lcm(12,7) -> 84
+```
+
+```js
+lcm(12,7) // 84
```
[⬆ back to top](#table-of-contents)
@@ -1598,8 +1837,11 @@ const median = arr => {
const mid = Math.floor(arr.length / 2), nums = [...arr].sort((a, b) => a - b);
return arr.length % 2 !== 0 ? nums[mid] : (nums[mid - 1] + nums[mid]) / 2;
};
-// median([5,6,50,1,-5]) -> 5
-// median([0,10,-2,7]) -> 3.5
+```
+
+```js
+median([5,6,50,1,-5]) // 5
+median([0,10,-2,7]) // 3.5
```
[⬆ back to top](#table-of-contents)
@@ -1616,8 +1858,11 @@ const palindrome = str => {
const s = str.toLowerCase().replace(/[\W_]/g,'');
return s === s.split('').reverse().join('');
}
-// palindrome('taco cat') -> true
- ```
+```
+
+```js
+palindrome('taco cat') // true
+```
[⬆ back to top](#table-of-contents)
@@ -1630,8 +1875,11 @@ Use `Array.reduce()` to calculate how many numbers are below the value and how m
```js
const percentile = (arr, val) =>
100 * arr.reduce((acc,v) => acc + (v < val ? 1 : 0) + (v === val ? 0.5 : 0), 0) / arr.length;
-// percentile([1,2,3,4,5,6,7,8,9,10], 6) -> 55
- ```
+```
+
+```js
+percentile([1,2,3,4,5,6,7,8,9,10], 6) // 55
+```
[⬆ back to top](#table-of-contents)
@@ -1644,12 +1892,15 @@ Use `Array.reduce()` combined with `Array.map()` to iterate over elements and co
```js
const powerset = arr =>
arr.reduce((a, v) => a.concat(a.map(r => [v].concat(r))), [[]]);
-// powerset([1,2]) -> [[], [1], [2], [2,1]]
+```
+
+```js
+powerset([1,2]) // [[], [1], [2], [2,1]]
```
[⬆ back to top](#table-of-contents)
-### primes
+### primes
Generates primes up to a given number, using the Sieve of Eratosthenes.
@@ -1657,13 +1908,16 @@ Generate an array from `2` to the given number. Use `Array.filter()` to filter o
```js
const primes = num => {
- let arr = Array.from({length: num - 1}).map((x, i) => i + 2),
- sqroot = Math.floor(Math.sqrt(num)),
- numsTillSqroot = Array.from({length: sqroot - 1}).map((x, i) => i + 2);
- numsTillSqroot.forEach(x => arr = arr.filter(y => ((y % x) !== 0) || (y == x)));
+ let arr = Array.from({length:num-1}).map((x,i)=> i+2),
+ sqroot = Math.floor(Math.sqrt(num)),
+ numsTillSqroot = Array.from({length:sqroot-1}).map((x,i)=> i+2);
+ numsTillSqroot.forEach(x => arr = arr.filter(y => ((y%x)!==0)||(y==x)));
return arr;
-};
-// primes(10) -> [2,3,5,7]
+}
+```
+
+```js
+primes(10) // [2,3,5,7]
```
[⬆ back to top](#table-of-contents)
@@ -1676,7 +1930,10 @@ Use `Math.random()` to generate a random number and map it to the desired range,
```js
const randomIntegerInRange = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
-// randomIntegerInRange(0, 5) -> 2
+```
+
+```js
+randomIntegerInRange(0, 5) // 2
```
[⬆ back to top](#table-of-contents)
@@ -1689,7 +1946,10 @@ Use `Math.random()` to generate a random value, map it to the desired range usin
```js
const randomNumberInRange = (min, max) => Math.random() * (max - min) + min;
-// randomNumberInRange(2,10) -> 6.0211363285087005
+```
+
+```js
+randomNumberInRange(2,10) // 6.0211363285087005
```
[⬆ back to top](#table-of-contents)
@@ -1702,27 +1962,11 @@ Use `Math.round()` and template literals to round the number to the specified nu
Omit the second argument, `decimals` to round to an integer.
```js
-const round = (n, decimals = 0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`);
-// round(1.005, 2) -> 1.01
+const round = (n, decimals=0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`);
```
-[⬆ back to top](#table-of-contents)
-
-### sdbmHashAlgorithm
-
-This algorithm is a simple hash-algorithm that hashes it input string `s` into a whole number.
-
-Use `split('')` and `Array.reduce()` to create a hash of the input string, utilizing bit shifting.
-
-``` js
-const sdbm = str => {
- let arr = str.split('');
- return arr.reduce((hashCode, currentVal) =>
- hashCode = currentVal.charCodeAt(0) + (hashCode << 6) + (hashCode << 16) - hashCode
- ,0)
-}
-// console.log(sdbm("name")) // -3521204949
-// console.log(sdbm("age")) // 808122783
+```js
+round(1.005, 2) // 1.01
```
[⬆ back to top](#table-of-contents)
@@ -1743,8 +1987,11 @@ const standardDeviation = (arr, usePopulation = false) => {
.reduce((acc, val) => acc + val, 0) / (arr.length - (usePopulation ? 0 : 1))
);
};
-// standardDeviation([10,2,38,23,38,23,21]) -> 13.284434142114991 (sample)
-// standardDeviation([10,2,38,23,38,23,21], true) -> 12.29899614287479 (population)
+```
+
+```js
+standardDeviation([10,2,38,23,38,23,21]) // 13.284434142114991 (sample)
+standardDeviation([10,2,38,23,38,23,21], true) // 12.29899614287479 (population)
```
[⬆ back to top](#table-of-contents)
@@ -1765,7 +2012,10 @@ const speechSynthesis = message => {
msg.voice = window.speechSynthesis.getVoices()[0];
window.speechSynthesis.speak(msg);
};
-// speechSynthesis('Hello, World') -> plays the message
+```
+
+```js
+speechSynthesis('Hello, World') // // plays the message
```
[⬆ back to top](#table-of-contents)
@@ -1779,8 +2029,11 @@ Use `fs.writeFile()`, template literals and `JSON.stringify()` to write a `json`
```js
const fs = require('fs');
-const JSONToFile = (obj, filename) => fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2));
-// JSONToFile({test: "is passed"}, 'testJsonFile') -> writes the object to 'testJsonFile.json'
+const JSONToFile = (obj, filename) => fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2))
+```
+
+```js
+JSONToFile({test: "is passed"}, 'testJsonFile') // writes the object to 'testJsonFile.json'
```
[⬆ back to top](#table-of-contents)
@@ -1795,18 +2048,22 @@ creating an array from contents of file by `split`ing file content line by line
```js
const fs = require('fs');
-const readFileLines = filename => fs.readFileSync(filename).toString('UTF8').split(/\r?\n/);
-/*
- contents of test.txt :
- line1
- line2
- line3
- ___________________________
- let arr = readFileLines('test.txt')
- console.log(arr) // -> ['line1', 'line2', 'line3']
- */
+const readFileLines = filename => fs.readFileSync(filename).toString('UTF8').split('\n');
```
+```js
+/*
+contents of test.txt :
+ line1
+ line2
+ line3
+ ___________________________
+*/
+let arr = readFileLines('test.txt')
+console.log(arr) // ['line1', 'line2', 'line3']
+```
+
+
[⬆ back to top](#table-of-contents)
## Object
@@ -1828,10 +2085,11 @@ const cleanObj = (obj, keysToKeep = [], childIndicator) => {
});
return obj;
};
-/*
- const testObj = {a: 1, b: 2, children: {a: 1, b: 2}}
- cleanObj(testObj, ["a"],"children") // { a: 1, children : { a: 1}}
-*/
+```
+
+```js
+const testObj = {a: 1, b: 2, children: {a: 1, b: 2}}
+cleanObj(testObj, ["a"],"children") // { a: 1, children : { a: 1}}
```
[⬆ back to top](#table-of-contents)
@@ -1844,7 +2102,10 @@ Use `Array.reduce()` to create and combine key-value pairs.
```js
const objectFromPairs = arr => arr.reduce((a, v) => (a[v[0]] = v[1], a), {});
-// objectFromPairs([['a',1],['b',2]]) -> {a: 1, b: 2}
+```
+
+```js
+objectFromPairs([['a',1],['b',2]]) // {a: 1, b: 2}
```
[⬆ back to top](#table-of-contents)
@@ -1857,7 +2118,10 @@ Use `Object.keys()` and `Array.map()` to iterate over the object's keys and prod
```js
const objectToPairs = obj => Object.keys(obj).map(k => [k, obj[k]]);
-// objectToPairs({a: 1, b: 2}) -> [['a',1],['b',2]])
+```
+
+```js
+objectToPairs({a: 1, b: 2}) // [['a',1],['b',2]])
```
[⬆ back to top](#table-of-contents)
@@ -1880,12 +2144,13 @@ const orderBy = (arr, props, orders) =>
return acc;
}, 0)
);
-/*
+```
+
+```js
const users = [{ 'name': 'fred', 'age': 48 },{ 'name': 'barney', 'age': 36 },
{ 'name': 'fred', 'age': 40 },{ 'name': 'barney', 'age': 34 }];
-orderby(users, ['name', 'age'], ['asc', 'desc']) -> [{name: 'barney', age: 36}, {name: 'barney', age: 34}, {name: 'fred', age: 48}, {name: 'fred', age: 40}]
-orderby(users, ['name', 'age']) -> [{name: 'barney', age: 34}, {name: 'barney', age: 36}, {name: 'fred', age: 40}, {name: 'fred', age: 48}]
-*/
+orderby(users, ['name', 'age'], ['asc', 'desc']) // [{name: 'barney', age: 36}, {name: 'barney', age: 34}, {name: 'fred', age: 48}, {name: 'fred', age: 40}]
+orderby(users, ['name', 'age']) // [{name: 'barney', age: 34}, {name: 'barney', age: 36}, {name: 'fred', age: 40}, {name: 'fred', age: 48}]
```
[⬆ back to top](#table-of-contents)
@@ -1899,9 +2164,11 @@ If the property does not exists returns `undefined`.
```js
const select = (from, selector) =>
selector.split('.').reduce((prev, cur) => prev && prev[cur], from);
+```
-// const obj = {selector: {to: {val: 'val to select'}}};
-// select(obj, 'selector.to.val'); -> 'val to select'
+```js
+const obj = {selector: {to: {val: 'val to select'}}};
+select(obj, 'selector.to.val'); // 'val to select'
```
[⬆ back to top](#table-of-contents)
@@ -1914,11 +2181,12 @@ Use `Object.assign()` and an empty object (`{}`) to create a shallow clone of th
```js
const shallowClone = obj => Object.assign({}, obj);
-/*
+```
+
+```js
const a = { x: true, y: 1 };
const b = shallowClone(a);
-a === b -> false
-*/
+a === b // false
```
[⬆ back to top](#table-of-contents)
@@ -1928,10 +2196,13 @@ a === b -> false
Checks if the predicate (second argument) is truthy on all elements of a collection (first argument).
Use `Array.every()` to check if each passed object has the specified property and if it returns a truthy value.
-
+
```js
const truthCheckCollection = (collection, pre) => (collection.every(obj => obj[pre]));
-// truthCheckCollection([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}], "sex") -> true
+```
+
+```js
+truthCheckCollection([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}], "sex") // true
```
[⬆ back to top](#table-of-contents)
@@ -1952,7 +2223,10 @@ const anagrams = 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']
+```
+
+```js
+anagrams('abc') // ['abc','acb','bac','bca','cab','cba']
```
[⬆ back to top](#table-of-contents)
@@ -1967,8 +2241,11 @@ Omit the `lowerRest` parameter to keep the rest of the string intact, or set it
```js
const capitalize = ([first, ...rest], lowerRest = false) =>
first.toUpperCase() + (lowerRest ? rest.join('').toLowerCase() : rest.join(''));
-// capitalize('myName') -> 'MyName'
-// capitalize('myName', true) -> 'Myname'
+```
+
+```js
+capitalize('fooBar') // 'FooBar'
+capitalize('fooBar', true) // 'Foobar'
```
[⬆ back to top](#table-of-contents)
@@ -1981,7 +2258,10 @@ Use `replace()` to match the first character of each word and `toUpperCase()` to
```js
const capitalizeEveryWord = str => str.replace(/\b[a-z]/g, char => char.toUpperCase());
-// capitalizeEveryWord('hello world!') -> 'Hello World!'
+```
+
+```js
+capitalizeEveryWord('hello world!') // 'Hello World!'
```
[⬆ back to top](#table-of-contents)
@@ -1994,8 +2274,11 @@ Use a regular expression to count the number of vowels `(A, E, I, O, U)` in a `s
```js
const countVowels = str => (str.match(/[aeiou]/ig) || []).length;
-// countVowels('foobar') -> 3
-// countVowels('gym') -> 0
+```
+
+```js
+countVowels('foobar') // 3
+countVowels('gym') // 0
```
[⬆ back to top](#table-of-contents)
@@ -2008,7 +2291,10 @@ Use `replace()` to escape special characters.
```js
const escapeRegExp = str => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
-// escapeRegExp('(test)') -> \\(test\\)
+```
+
+```js
+escapeRegExp('(test)') // \\(test\\)
```
[⬆ back to top](#table-of-contents)
@@ -2024,9 +2310,12 @@ Omit the second argument to use a default separator of `_`.
const fromCamelCase = (str, separator = '_') =>
str.replace(/([a-z\d])([A-Z])/g, '$1' + separator + '$2')
.replace(/([A-Z]+)([A-Z][a-z\d]+)/g, '$1' + separator + '$2').toLowerCase();
-// fromCamelCase('someDatabaseFieldName', ' ') -> 'some database field name'
-// fromCamelCase('someLabelThatNeedsToBeCamelized', '-') -> 'some-label-that-needs-to-be-camelized'
-// fromCamelCase('someJavascriptProperty', '_') -> 'some_javascript_property'
+```
+
+```js
+fromCamelCase('someDatabaseFieldName', ' ') // 'some database field name'
+fromCamelCase('someLabelThatNeedsToBeCamelized', '-') // 'some-label-that-needs-to-be-camelized'
+fromCamelCase('someJavascriptProperty', '_') // 'some_javascript_property'
```
[⬆ back to top](#table-of-contents)
@@ -2038,11 +2327,14 @@ Repeats a string n times using `String.repeat()`
If no string is provided the default is `""` and the default number of times is 2.
```js
-const repeatString = (str = '', num = 2) => {
- return num >= 0 ? str.repeat(num) : str;
-};
-// repeatString("abc",3) -> 'abcabcabc'
-// repeatString("abc") -> 'abcabc'
+const repeatString = (str="",num=2) => {
+ return num >= 0 ? str.repeat(num) : str;
+}
+```
+
+```js
+repeatString("abc",3) // 'abcabcabc'
+repeatString("abc") // 'abcabc'
```
[⬆ back to top](#table-of-contents)
@@ -2056,7 +2348,10 @@ Combine characters to get a string using `join('')`.
```js
const reverseString = str => str.split('').reverse().join('');
-// reverseString('foobar') -> 'raboof'
+```
+
+```js
+reverseString('foobar') // 'raboof'
```
[⬆ back to top](#table-of-contents)
@@ -2070,7 +2365,10 @@ Split the string using `split('')`, `Array.sort()` utilizing `localeCompare()`,
```js
const sortCharactersInString = str =>
str.split('').sort((a, b) => a.localeCompare(b)).join('');
-// sortCharactersInString('cabbage') -> 'aabbceg'
+```
+
+```js
+sortCharactersInString('cabbage') // 'aabbceg'
```
[⬆ back to top](#table-of-contents)
@@ -2087,12 +2385,15 @@ const toCamelCase = str => {
let s = str && str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g)
.map(x => x.slice(0, 1).toUpperCase() + x.slice(1).toLowerCase())
.join('');
- return s.slice(0, 1).toLowerCase() + s.slice(1);
-};
-// toCamelCase("some_database_field_name") -> 'someDatabaseFieldName'
-// toCamelCase("Some label that needs to be camelized") -> 'someLabelThatNeedsToBeCamelized'
-// toCamelCase("some-javascript-property") -> 'someJavascriptProperty'
-// toCamelCase("some-mixed_string with spaces_underscores-and-hyphens") -> 'someMixedStringWithSpacesUnderscoresAndHyphens'
+ return s.slice(0,1).toLowerCase() + s.slice(1)
+ }
+```
+
+```js
+toCamelCase("some_database_field_name") // 'someDatabaseFieldName'
+toCamelCase("Some label that needs to be camelized") // 'someLabelThatNeedsToBeCamelized'
+toCamelCase("some-javascript-property") // 'someJavascriptProperty'
+toCamelCase("some-mixed_string with spaces_underscores-and-hyphens") // 'someMixedStringWithSpacesUnderscoresAndHyphens'
```
[⬆ back to top](#table-of-contents)
@@ -2109,11 +2410,14 @@ const toKebabCase = str =>
str && str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g)
.map(x => x.toLowerCase())
.join('-');
-// toKebabCase("camelCase") -> 'camel-case'
-// toKebabCase("some text") -> 'some-text'
-// toKebabCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some-mixed-string-with-spaces-underscores-and-hyphens'
-// toKebabCase("AllThe-small Things") -> "all-the-small-things"
-// toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-xml-and-html"
+```
+
+```js
+toKebabCase("camelCase") // 'camel-case'
+toKebabCase("some text") // 'some-text'
+toKebabCase("some-mixed_string With spaces_underscores-and-hyphens") // 'some-mixed-string-with-spaces-underscores-and-hyphens'
+toKebabCase("AllThe-small Things") // "all-the-small-things"
+toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') // "i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-xml-and-html"
```
[⬆ back to top](#table-of-contents)
@@ -2131,12 +2435,15 @@ const toSnakeCase = str => {
.map(x => x.toLowerCase())
.join('_');
};
-// toSnakeCase("camelCase") -> 'camel_case'
-// toSnakeCase("some text") -> 'some_text'
-// toSnakeCase("some-javascript-property") -> 'some_javascript_property'
-// toSnakeCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some_mixed_string_with_spaces_underscores_and_hyphens'
-// toSnakeCase("AllThe-small Things") -> "all_the_small_things"
-// toSnakeCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html"
+```
+
+```js
+toSnakeCase("camelCase") // 'camel_case'
+toSnakeCase("some text") // 'some_text'
+toSnakeCase("some-javascript-property") // 'some_javascript_property'
+toSnakeCase("some-mixed_string With spaces_underscores-and-hyphens") // 'some_mixed_string_with_spaces_underscores_and_hyphens'
+toSnakeCase("AllThe-small Things") // "all_the_smal_things"
+toSnakeCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') // "i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html"
```
[⬆ back to top](#table-of-contents)
@@ -2151,7 +2458,10 @@ Return the string truncated to the desired length, with `...` appended to the en
```js
const truncateString = (str, num) =>
str.length > num ? str.slice(0, num > 3 ? num - 3 : num) + '...' : str;
-// truncateString('boomerang', 7) -> 'boom...'
+```
+
+```js
+truncateString('boomerang', 7) // 'boom...'
```
[⬆ back to top](#table-of-contents)
@@ -2165,8 +2475,11 @@ Omit the second argument to use the default regex.
```js
const words = (str, pattern = /[^a-zA-Z-]+/) => str.split(pattern).filter(Boolean);
-// words("I love javaScript!!") -> ["I", "love", "javaScript"]
-// words("python, javaScript & coffee") -> ["python", "javaScript", "coffee"]
+```
+
+```js
+words("I love javaScript!!") // ["I", "love", "javaScript"]
+words("python, javaScript & coffee") // ["python", "javaScript", "coffee"]
```
[⬆ back to top](#table-of-contents)
@@ -2179,8 +2492,11 @@ Returns the first non-null/undefined argument.
Use `Array.find()` to return the first non `null`/`undefined` argument.
```js
-const coalesce = (...args) => args.find(_ => ![undefined, null].includes(_));
-// coalesce(null,undefined,"",NaN, "Waldo") -> ""
+const coalesce = (...args) => args.find(_ => ![undefined, null].includes(_))
+```
+
+```js
+coalesce(null,undefined,"",NaN, "Waldo") // ""
```
[⬆ back to top](#table-of-contents)
@@ -2193,8 +2509,11 @@ Use `Array.find()` to return the first argument that returns `true` from the pro
```js
const coalesceFactory = valid => (...args) => args.find(valid);
-// const customCoalesce = coalesceFactory(_ => ![null, undefined, "", NaN].includes(_))
-// customCoalesce(undefined, null, NaN, "", "Waldo") //-> "Waldo"
+```
+
+```js
+const customCoalesce = coalesceFactory(_ => ![null, undefined, "", NaN].includes(_))
+customCoalesce(undefined, null, NaN, "", "Waldo") // "Waldo"
```
[⬆ back to top](#table-of-contents)
@@ -2207,9 +2526,12 @@ Use `Array.map()`, `split()` and `Array.join()` to join the mapped array for con
`String.slice()` is used to remove `#` from string start since it's added once.
```js
const extendHex = shortHex =>
- '#' + shortHex.slice(shortHex.startsWith('#') ? 1 : 0).split('').map(x => x + x).join('');
-// extendHex('#03f') -> '#0033ff'
-// extendHex('05a') -> '#0055aa'
+ '#' + shortHex.slice(shortHex.startsWith('#') ? 1 : 0).split('').map(x => x+x).join('')
+```
+
+```js
+extendHex('#03f') // '#0033ff'
+extendHex('05a') // '#0055aa'
```
[⬆ back to top](#table-of-contents)
@@ -2223,7 +2545,10 @@ Returns lowercased constructor name of value, "undefined" or "null" if value is
```js
const getType = v =>
v === undefined ? 'undefined' : v === null ? 'null' : v.constructor.name.toLowerCase();
-// getType(new Set([1,2,3])) -> "set"
+```
+
+```js
+getType(new Set([1,2,3])) // "set"
```
[⬆ back to top](#table-of-contents)
@@ -2246,9 +2571,12 @@ const hexToRGB = hex => {
((h & (alpha ? 0x0000ff00 : 0x0000ff)) >>> (alpha ? 8 : 0)) +
(alpha ? `, ${(h & 0x000000ff)}` : '') + ')';
};
-// hexToRGB('#27ae60ff') -> 'rgba(39, 174, 96, 255)'
-// hexToRGB('27ae60') -> 'rgb(39, 174, 96)'
-// hexToRGB('#fff') -> 'rgb(255, 255, 255)'
+```
+
+```js
+hexToRGB('#27ae60ff') // 'rgba(39, 174, 96, 255)'
+hexToRGB('27ae60') // 'rgb(39, 174, 96)'
+hexToRGB('#fff') // 'rgb(255, 255, 255)'
```
[⬆ back to top](#table-of-contents)
@@ -2261,8 +2589,11 @@ Use `Array.isArray()` to check if a value is classified as an array.
```js
const isArray = val => !!val && Array.isArray(val);
-// isArray(null) -> false
-// isArray([1]) -> true
+```
+
+```js
+isArray(null) // false
+isArray([1]) // true
```
[⬆ back to top](#table-of-contents)
@@ -2275,8 +2606,11 @@ Use `typeof` to check if a value is classified as a boolean primitive.
```js
const isBoolean = val => typeof val === 'boolean';
-// isBoolean(null) -> false
-// isBoolean(false) -> true
+```
+
+```js
+isBoolean(null) // false
+isBoolean(false) // true
```
[⬆ back to top](#table-of-contents)
@@ -2289,8 +2623,11 @@ Use `typeof` to check if a value is classified as a function primitive.
```js
const isFunction = val => val && typeof val === 'function';
-// isFunction('x') -> false
-// isFunction(x => x) -> true
+```
+
+```js
+isFunction('x') // false
+isFunction(x => x) // true
```
[⬆ back to top](#table-of-contents)
@@ -2303,10 +2640,12 @@ Use `typeof` to check if a value is classified as a number primitive.
```js
const isNumber = val => typeof val === 'number';
-// isNumber('1') -> false
-// isNumber(1) -> true
```
+```js
+isNumber('1') // false
+isNumber(1) // true
+```
[⬆ back to top](#table-of-contents)
### isString
@@ -2317,8 +2656,11 @@ Use `typeof` to check if a value is classified as a string primitive.
```js
const isString = val => typeof val === 'string';
-// isString(10) -> false
-// isString('10') -> true
+```
+
+```js
+isString(10) // false
+isString('10') // true
```
[⬆ back to top](#table-of-contents)
@@ -2331,27 +2673,30 @@ Use `typeof` to check if a value is classified as a symbol primitive.
```js
const isSymbol = val => typeof val === 'symbol';
-// isSymbol('x') -> false
-// isSymbol(Symbol('x')) -> true
+```
+
+```js
+isSymbol('x') // false
+isSymbol(Symbol('x')) // true
```
[⬆ back to top](#table-of-contents)
-### randomHexColor
+### randomHexColorCode
Generates a random hexadecimal color code.
-Use `Math.random` to generate a random 24-bit(6x4bits) hexadecimal number. Use bit shifting and then convert it to an hexadecimal String using `toString(16)`.
+Use `Math.random` to generate a random 24-bit(6x4bits) hexadecimal number. Use bit shifting and then convert it to an hexadecimal String using `toString(16)`.
```js
-const randomHexColor = () => {
- let n = (Math.random() * 0xfffff | 0).toString(16);
- return '#' + (n.length !== 6
- ? (Math.random() * 0xf | 0).toString(16) + n : n);
+const randomHexColorCode = () => '#'+(Math.random()*0xFFFFFF<<0).toString(16);
};
-// randomHexColorCode() -> "#e34155"
-// randomHexColorCode() -> "#fd73a6"
-// randomHexColorCode() -> "#4144c6"
+```
+
+```js
+randomHexColorCode() // "#e34155"
+randomHexColorCode() // "#fd73a6"
+randomHexColorCode() // "#4144c6"
```
[⬆ back to top](#table-of-contents)
@@ -2364,7 +2709,32 @@ Convert given RGB parameters to hexadecimal string using bitwise left-shift oper
```js
const RGBToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0');
-// RGBToHex(255, 165, 1) -> 'ffa501'
+```
+
+```js
+RGBToHex(255, 165, 1) // 'ffa501'
+```
+
+[⬆ back to top](#table-of-contents)
+
+### sbdm
+
+This algorithm is a simple hash-algorithm that hashes it input string `s` into a whole number.
+
+Use `split('')` and `Array.reduce()` to create a hash of the input string, utilizing bit shifting.
+
+``` js
+const sdbm = str => {
+ let arr = str.split('');
+ return arr.reduce((hashCode, currentVal) =>
+ hashCode = currentVal.charCodeAt(0) + (hashCode << 6) + (hashCode << 16) - hashCode
+ ,0)
+}
+```
+
+```js
+console.log(sdbm("name")) // -3521204949
+console.log(sdbm("age")) // 808122783
```
[⬆ back to top](#table-of-contents)
@@ -2380,7 +2750,10 @@ const timeTaken = callback => {
console.time('timeTaken'); const r = callback();
console.timeEnd('timeTaken'); return r;
};
-// timeTaken(() => Math.pow(2, 10)) -> 1024
+```
+
+```js
+timeTaken(() => Math.pow(2, 10)) // 1024
// (logged): timeTaken: 0.02099609375ms
```
@@ -2391,8 +2764,11 @@ const timeTaken = callback => {
Use `toLocaleString()` to convert a float-point arithmetic to the [Decimal mark](https://en.wikipedia.org/wiki/Decimal_mark) form. It makes a comma separated string from a number.
```js
-const toDecimalMark = num => num.toLocaleString('en-US');
-// toDecimalMark(12305030388.9087) -> "12,305,030,388.9087"
+const toDecimalMark = num => num.toLocaleString("en-US");
+```
+
+```js
+toDecimalMark(12305030388.9087) // "12,305,030,388.9087"
```
[⬆ back to top](#table-of-contents)
@@ -2412,7 +2788,10 @@ const toOrdinalSuffix = num => {
tPattern = [11, 12, 13, 14, 15, 16, 17, 18, 19];
return oPattern.includes(digits[0]) && !tPattern.includes(digits[1]) ? int + ordinals[digits[0] - 1] : int + ordinals[3];
};
-// toOrdinalSuffix("123") -> "123rd"
+```
+
+```js
+toOrdinalSuffix("123") // "123rd"
```
[⬆ back to top](#table-of-contents)
@@ -2428,7 +2807,10 @@ const UUIDGenerator = () =>
([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>
(c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
);
-// UUIDGenerator() -> '7982fcfe-5721-4632-bede-6000885be57d'
+```
+
+```js
+UUIDGenerator() // '7982fcfe-5721-4632-bede-6000885be57d'
```
[⬆ back to top](#table-of-contents)
@@ -2443,7 +2825,10 @@ Use `Number()` to check if the coercion holds.
```js
const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == n;
-// validateNumber('10') -> true
+```
+
+```js
+validateNumber('10') // true
```
[⬆ back to top](#table-of-contents)
diff --git a/docs/index.html b/docs/index.html
index 64c55e5af..00ba959b7 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -33,7 +33,7 @@
})
}
function clipboard() {
- const snippets = document.querySelectorAll("pre");
+ const snippets = document.querySelectorAll(":not(pre) + pre");
snippets.forEach(element => {
const button = document.createElement("button");
button.innerHTML = "Copy to clipboard";
@@ -242,50 +242,46 @@
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);
-/*
-Promise.resolve( [ 1, 2, 3 ] ).then( call('map', x => 2 * x ) ).then( console.log ) //[ 2, 4, 6 ]
+const call = ( key, ...args ) => context => context[ key ]( ...args );
+
+Promise.resolve( [ 1, 2, 3 ] ).then( call('map', x => 2 * x ) ).then( console.log ) //[ 2, 4, 6 ]
const map = call.bind(null, 'map')
Promise.resolve( [ 1, 2, 3 ] ).then( map( x => 2 * x ) ).then( console.log ) //[ 2, 4, 6 ]
-*/
collectInto
Changes a function that accepts an array into a variadic function.
Given a function, return a closure that collects all inputs into an array-accepting function.
-
const collectInto = fn => (...args) => fn(args);
-/*
-const Pall = collectInto( Promise.all.bind(Promise) )
+const collectInto = fn => ( ...args ) => fn( args );
+
+const Pall = collectInto( Promise.all.bind(Promise) )
let p1 = Promise.resolve(1)
let p2 = Promise.resolve(2)
let p3 = new Promise((resolve) => setTimeout(resolve,2000,3))
Pall(p1, p2, p3).then(console.log)
-*/
flip
Flip takes a function as an argument, then makes the first argument the last
Return a closure that takes variadic inputs, and splices the last argument to make it the first argument before applying the rest.
const flip = fn => (...args) => fn(args.pop(), ...args);
-/*
-let a = {name: 'John Smith'}
+
+
let a = {name: 'John Smith'}
let b = {}
const mergeFrom = flip(Object.assign)
let mergePerson = mergeFrom.bind(null, a)
mergePerson(b) // == b
b = {}
Object.assign(b, a) // == b
-*/
pipeFunctions
Performs left-to-right function composition.
Use Array.reduce() with the spread operator (...) to perform left-to-right function composition.
The first (leftmost) function can accept one or more arguments; the remaining functions must be unary.
const pipeFunctions = (...fns) => fns.reduce((f, g) => (...args) => g(f(...args)));
-/*
-const add5 = x => x + 5
+
+
const add5 = x => x + 5
const multiply = (x, y) => x * y
const multiplyAndAdd5 = pipeFunctions(multiply, add5)
-multiplyAndAdd5(5, 2) -> 15
-*/
+multiplyAndAdd5(5, 2) // 15
promisify
Converts an asynchronous function to return a promise.
@@ -298,18 +294,18 @@ Use the
...rest operator to pass in all the parameters.
func(...args, (err, result) =>
err ? reject(err) : resolve(result))
);
-// const delay = promisify((d, cb) => setTimeout(cb, d))
-// delay(2000).then(() => console.log('Hi!')) -> Promise resolves after 2s
+
+
const delay = promisify((d, cb) => setTimeout(cb, d))
+delay(2000).then(() => console.log('Hi!')) // // Promise resolves after 2s
spreadOver
Takes a variadic function and returns a closure that accepts an array of arguments to map to the inputs of the function.
Use closures and the spread operator (...) to map the array of arguments to the inputs of the function.
const spreadOver = fn => argsArr => fn(...argsArr);
-/*
-const arrayMax = spreadOver(Math.max)
-arrayMax([1,2,3]) // -> 3
-arrayMax([1,2,4]) // -> 4
-*/
+
+
const arrayMax = spreadOver(Math.max)
+arrayMax([1,2,3]) // 3
+arrayMax([1,2,4]) // 4
Array
arrayGcd
@@ -317,33 +313,37 @@ arrayMax([1,2,4]) // -> 4
Use Array.reduce() and the gcd formula (uses recursion) to calculate the greatest common denominator of an array of numbers.
const arrayGcd = arr => {
const gcd = (x, y) => !y ? x : gcd(y, x % y);
- return arr.reduce((a, b) => gcd(a, b));
-};
-// arrayGcd([1,2,3,4,5]) -> 1
-// arrayGcd([4,8,12]) -> 4
+ return arr.reduce((a,b) => gcd(a,b));
+}
+
+
arrayGcd([1,2,3,4,5]) // 1
+arrayGcd([4,8,12]) // 4
arrayLcm
Calculates the lowest common multiple (lcm) of an array of numbers.
Use Array.reduce() and the lcm formula (uses recursion) to calculate the lowest common multiple of an array of numbers.
const arrayLcm = arr => {
const gcd = (x, y) => !y ? x : gcd(y, x % y);
- const lcm = (x, y) => (x * y) / gcd(x, y);
- return arr.reduce((a, b) => lcm(a, b));
-};
-// arrayLcm([1,2,3,4,5]) -> 60
-// arrayLcm([4,8,12]) -> 24
+ const lcm = (x, y) => (x*y)/gcd(x, y);
+ return arr.reduce((a,b) => lcm(a,b));
+}
+
+
arrayLcm([1,2,3,4,5]) // 60
+arrayLcm([4,8,12]) // 24
arrayMax
Returns the maximum value in an array.
Use Math.max() combined with the spread operator (...) to get the maximum value in the array.
const arrayMax = arr => Math.max(...arr);
-// arrayMax([10, 1, 5]) -> 10
+
+
arrayMax([10, 1, 5]) // 10
arrayMin
Returns the minimum value in an array.
Use Math.min() combined with the spread operator (...) to get the minimum value in the array.
const arrayMin = arr => Math.min(...arr);
-// arrayMin([10, 1, 5]) -> 1
+
+
arrayMin([10, 1, 5]) // 1
chunk
Chunks an array into smaller arrays of a specified size.
@@ -352,19 +352,22 @@ Use
Array.slice() to map each element of the new array to a chunk t
If the original array can't be split evenly, the final chunk will contain the remaining elements.
const chunk = (arr, size) =>
Array.from({length: Math.ceil(arr.length / size)}, (v, i) => arr.slice(i * size, i * size + size));
-// chunk([1,2,3,4,5], 2) -> [[1,2],[3,4],[5]]
+
+
chunk([1,2,3,4,5], 2) // [[1,2],[3,4],[5]]
compact
Removes falsey values from an array.
Use Array.filter() to filter out falsey values (false, null, 0, "", undefined, and NaN).
const compact = arr => arr.filter(Boolean);
-// compact([0, 1, false, 2, '', 3, 'a', 'e'*23, NaN, 's', 34]) -> [ 1, 2, 3, 'a', 's', 34 ]
+
+
compact([0, 1, false, 2, '', 3, 'a', 'e'*23, NaN, 's', 34]) // [ 1, 2, 3, 'a', 's', 34 ]
countOccurrences
Counts the occurrences of a value in an array.
Use Array.reduce() to increment a counter each time you encounter the specific value inside the array.
const countOccurrences = (arr, value) => arr.reduce((a, v) => v === value ? a + 1 : a + 0, 0);
-// countOccurrences([1,1,2,1,2,3], 1) -> 3
+
+
countOccurrences([1,1,2,1,2,3], 1) // 3
deepFlatten
Deep flattens an array.
@@ -372,25 +375,29 @@ If the original array can't be split evenly, the final chunk will contain the re
Use
Array.concat() with an empty array (
[]) and the spread operator (
...) to flatten an array.
Recursively flatten each element that is an array.
const deepFlatten = arr => [].concat(...arr.map(v => Array.isArray(v) ? deepFlatten(v) : v));
-// deepFlatten([1,[2],[[3],4],5]) -> [1,2,3,4,5]
+
+
deepFlatten([1,[2],[[3],4],5]) // [1,2,3,4,5]
difference
Returns the difference between two arrays.
Create a Set from b, then use Array.filter() on a to only keep values not contained in b.
const difference = (a, b) => { const s = new Set(b); return a.filter(x => !s.has(x)); };
-// difference([1,2,3], [1,2,4]) -> [3]
+
+
difference([1,2,3], [1,2,4]) // [3]
differenceWith
Filters out all values from an array for which the comparator function does not return true.
Use Array.filter() and Array.find() to find the appropriate values.
-
const differenceWith = (arr, val, comp) => arr.filter(a => !val.find(b => comp(a, b)));
-// differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) -> [1, 1.2]
+const differenceWith = (arr, val, comp) => arr.filter(a => !val.find(b => comp(a, b)))
+
+differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) // [1, 1.2]
distinctValuesOfArray
Returns all the distinct values of an array.
Use ES6 Set and the ...rest operator to discard all duplicated values.
const distinctValuesOfArray = arr => [...new Set(arr)];
-// distinctValuesOfArray([1,2,2,3,4,4,5]) -> [1,2,3,4,5]
+
+
distinctValuesOfArray([1,2,2,3,4,4,5]) // [1,2,3,4,5]
dropElements
Removes elements in an array until the passed function returns true. Returns the remaining elements in the array.
@@ -400,33 +407,38 @@ Returns the remaining elements.
while (arr.length > 0 && !func(arr[0])) arr = arr.slice(1);
return arr;
};
-// dropElements([1, 2, 3, 4], n => n >= 3) -> [3,4]
+
+
dropElements([1, 2, 3, 4], n => n >= 3) // [3,4]
dropRight
Returns a new array with n elements removed from the right.
Use Array.slice() to slice the remove the specified number of elements from the right.
const dropRight = (arr, n = 1) => arr.slice(0, -n);
-// dropRight([1,2,3]) -> [1,2]
-// dropRight([1,2,3], 2) -> [1]
-// dropRight([1,2,3], 42) -> []
+
+
dropRight([1,2,3]) // [1,2]
+dropRight([1,2,3], 2) // [1]
+dropRight([1,2,3], 42) // []
everyNth
Returns every nth element in an array.
Use Array.filter() to create a new array that contains every nth element of a given array.
const everyNth = (arr, nth) => arr.filter((e, i) => i % nth === nth - 1);
-// everyNth([1,2,3,4,5,6], 2) -> [ 2, 4, 6 ]
+
+
everyNth([1,2,3,4,5,6], 2) // [ 2, 4, 6 ]
filterNonUnique
Filters out the non-unique values in an array.
Use Array.filter() for an array containing only the unique values.
const filterNonUnique = arr => arr.filter(i => arr.indexOf(i) === arr.lastIndexOf(i));
-// filterNonUnique([1,2,2,3,4,4,5]) -> [1,3,5]
+
+
filterNonUnique([1,2,2,3,4,4,5]) // [1,3,5]
flatten
Flattens an array.
Use a new array and concatenate it with the spread input array causing a shallow denesting of any contained arrays.
-
const flatten = arr => [ ].concat(...arr);
-// flatten([1,[2],3,4]) -> [1,2,3,4]
+const flatten = arr => [ ].concat( ...arr );
+
+flatten([1,[2],3,4]) // [1,2,3,4]
flattenDepth
Flattens an array up to the specified depth.
@@ -437,7 +449,8 @@ Omit the second element,
depth to flatten only to a depth of
const flattenDepth = (arr, depth = 1) =>
depth != 1 ? arr.reduce((a, v) => a.concat(Array.isArray(v) ? flattenDepth(v, depth - 1) : v), [])
: arr.reduce((a, v) => a.concat(v), []);
-// flattenDepth([1,[2],[[[3],4],5]], 2) -> [1,2,[3],4,5]
+
+flatten([1,[2],3,4]) // [1,2,3,4]
groupBy
Groups the elements of an array based on the given function.
@@ -446,26 +459,30 @@ Use
Array.reduce() to create an object, where the keys are produced
const groupBy = (arr, func) =>
arr.map(typeof func === 'function' ? func : val => val[func])
.reduce((acc, val, i) => { acc[val] = (acc[val] || []).concat(arr[i]); return acc; }, {});
-// groupBy([6.1, 4.2, 6.3], Math.floor) -> {4: [4.2], 6: [6.1, 6.3]}
-// groupBy(['one', 'two', 'three'], 'length') -> {3: ['one', 'two'], 5: ['three']}
+
+
groupBy([6.1, 4.2, 6.3], Math.floor) // {4: [4.2], 6: [6.1, 6.3]}
+groupBy(['one', 'two', 'three'], 'length') // {3: ['one', 'two'], 5: ['three']}
head
Returns the head of a list.
Use arr[0] to return the first element of the passed array.
const head = arr => arr[0];
-// head([1,2,3]) -> 1
+
+
head([1,2,3]) // 1
initial
Returns all the elements of an array except the last one.
Use arr.slice(0,-1) to return all but the last element of the array.
const initial = arr => arr.slice(0, -1);
-// initial([1,2,3]) -> [1,2]
+
+
initial([1,2,3]) // [1,2]
initialize2DArray
Initializes a 2D array of given width and height and value.
Use Array.map() to generate h rows where each is a new array of size w initialize with value. If the value is not provided, default to null.
const initialize2DArray = (w, h, val = null) => Array(h).fill().map(() => Array(w).fill(val));
-// initializeArrayWithRange(2, 2, 0) -> [[0,0], [0,0]]
+
+
initialize2DArray(2, 2, 0) // [[0,0], [0,0]]
initializeArrayWithRange
Initializes an array containing the numbers in the specified range where start and end are inclusive.
@@ -473,53 +490,58 @@ Use
Array.reduce() to create an object, where the keys are produced
You can omit
start to use a default value of
0.
const initializeArrayWithRange = (end, start = 0) =>
Array.from({ length: (end + 1) - start }).map((v, i) => i + start);
-// initializeArrayWithRange(5) -> [0,1,2,3,4,5]
-// initializeArrayWithRange(7, 3) -> [3,4,5,6,7]
+
+
initializeArrayWithRange(5) // [0,1,2,3,4,5]
+initializeArrayWithRange(7, 3) // [3,4,5,6,7]
initializeArrayWithValues
Initializes and fills an array with the specified values.
Use Array(n) to create an array of the desired length, fill(v) to fill it with the desired values.
You can omit value to use a default value of 0.
const initializeArrayWithValues = (n, value = 0) => Array(n).fill(value);
-// initializeArrayWithValues(5, 2) -> [2,2,2,2,2]
+
+
initializeArrayWithValues(5, 2) // [2,2,2,2,2]
intersection
Returns a list of elements that exist in both arrays.
Create a Set from b, then use Array.filter() on a to only keep values contained in b.
const intersection = (a, b) => { const s = new Set(b); return a.filter(x => s.has(x)); };
-// intersection([1,2,3], [4,3,2]) -> [2,3]
+
+
intersection([1,2,3], [4,3,2]) // [2,3]
last
Returns the last element in an array.
Use arr.length - 1 to compute the index of the last element of the given array and returning it.
const last = arr => arr[arr.length - 1];
-// last([1,2,3]) -> 3
+
+
last([1,2,3]) // 3
mapObject
Maps the values of an array to an object using a function, where the key-value pairs consist of the original value as the key and the mapped value.
Use an anonymous inner function scope to declare an undefined memory space, using closures to store a return value. Use a new Array to store the array with a map of the function over its data set and a comma operator to return a second step, without needing to move from one context to another (due to closures and order of operations).
const mapObject = (arr, fn) =>
- (a => (a = [arr, arr.map(fn)], a[0].reduce((acc, val, ind) => (acc[val] = a[1][ind], acc), {})))();
-/*
-const squareIt = arr => mapObject(arr, a => a*a)
+ (a => (a = [arr, arr.map(fn)], a[0].reduce( (acc,val,ind) => (acc[val] = a[1][ind], acc), {}) )) ( );
+
+
const squareIt = arr => mapObject(arr, a => a*a)
squareIt([1,2,3]) // { 1: 1, 2: 4, 3: 9 }
-*/
nthElement
Returns the nth element of an array.
Use Array.slice() to get an array containing the nth element at the first place.
If the index is out of bounds, return [].
Omit the second argument, n, to get the first element of the array.
-
const nthElement = (arr, n = 0) => (n > 0 ? arr.slice(n, n + 1) : arr.slice(n))[0];
-// nthElement(['a','b','c'],1) -> 'b'
-// nthElement(['a','b','b'],-3) -> 'a'
+const nthElement = (arr, n=0) => (n>0? arr.slice(n,n+1) : arr.slice(n))[0];
+
+nthElement(['a','b','c'],1) // 'b'
+nthElement(['a','b','b'],-3) // 'a'
pick
Picks the key-value pairs corresponding to the given keys from an object.
Use Array.reduce() to convert the filtered/picked keys back to an object with the corresponding key-value pair if the key exists in the obj.
const pick = (obj, arr) =>
arr.reduce((acc, curr) => (curr in obj && (acc[curr] = obj[curr]), acc), {});
-// pick({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c']) -> { 'a': 1, 'c': 3 }
+
+
pick({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c']) // { 'a': 1, 'c': 3 }
pull
Mutates the original array to filter out the values specified.
@@ -532,14 +554,14 @@ Use
Array.length = 0 to mutate the passed in an array by resetting
arr.length = 0;
pulled.forEach(v => arr.push(v));
};
+
+
let myArray1 = ['a', 'b', 'c', 'a', 'b', 'c'];
+pull(myArray1, 'a', 'c');
+console.log(myArray1) // [ 'b', 'b' ]
-// let myArray1 = ['a', 'b', 'c', 'a', 'b', 'c'];
-// pull(myArray1, 'a', 'c');
-// console.log(myArray1) -> [ 'b', 'b' ]
-
-// let myArray2 = ['a', 'b', 'c', 'a', 'b', 'c'];
-// pull(myArray2, ['a', 'c']);
-// console.log(myArray2) -> [ 'b', 'b' ]
+let myArray2 = ['a', 'b', 'c', 'a', 'b', 'c'];
+pull(myArray2, ['a', 'c']);
+console.log(myArray2) // [ 'b', 'b' ]
pullAtIndex
Mutates the original array to filter out the values at the specified indexes.
@@ -549,17 +571,17 @@ Use
Array.push() to keep track of pulled values
const pullAtIndex = (arr, pullArr) => {
let removed = [];
let pulled = arr.map((v, i) => pullArr.includes(i) ? removed.push(v) : v)
- .filter((v, i) => !pullArr.includes(i));
+ .filter((v, i) => !pullArr.includes(i))
arr.length = 0;
pulled.forEach(v => arr.push(v));
return removed;
-};
+}
+
+
let myArray = ['a', 'b', 'c', 'd'];
+let pulled = pullAtIndex(myArray, [1, 3]);
-// let myArray = ['a', 'b', 'c', 'd'];
-// let pulled = pullAtIndex(myArray, [1, 3]);
-
-// console.log(myArray); -> [ 'a', 'c' ]
-// console.log(pulled); -> [ 'b', 'd' ]
+console.log(myArray); // [ 'a', 'c' ]
+console.log(pulled); // [ 'b', 'd' ]
pullAtValue
Mutates the original array to filter out the values specified. Returns the removed elements.
@@ -573,13 +595,12 @@ Use
Array.push() to keep track of pulled values
arr.length = 0;
mutateTo.forEach(v => arr.push(v));
return removed;
-};
-/*
-let myArray = ['a', 'b', 'c', 'd'];
+}
+
+
let myArray = ['a', 'b', 'c', 'd'];
let pulled = pullAtValue(myArray, ['b', 'd']);
-console.log(myArray); -> [ 'a', 'c' ]
-console.log(pulled); -> [ 'b', 'd' ]
-*/
+console.log(myArray); // [ 'a', 'c' ]
+console.log(pulled); // [ 'b', 'd' ]
remove
Removes elements from an array for which the given function returns false.
@@ -590,14 +611,16 @@ The
func is invoked with three arguments (
value, index, array
arr.splice(arr.indexOf(val), 1); return acc.concat(val);
}, [])
: [];
-// remove([1, 2, 3, 4], n => n % 2 == 0) -> [2, 4]
+
+
remove([1, 2, 3, 4], n => n % 2 == 0) // [2, 4]
sample
Returns a random element from an array.
Use Math.random() to generate a random number, multiply it by length and round it of to the nearest whole number using Math.floor().
This method also works with strings.
const sample = arr => arr[Math.floor(Math.random() * arr.length)];
-// sample([3, 7, 9, 11]) -> 9
+
+
sample([3, 7, 9, 11]) // 9
shuffle
Randomizes the order of the values of an array, returning a new array.
@@ -610,15 +633,17 @@ This method also works with strings.
}
return arr;
};
-// const foo = [1,2,3]
-// shuffle(foo) -> [2,3,1]
-// console.log(foo) -> [1,2,3]
+
+
const foo = [1,2,3]
+shuffle(foo) // [2,3,1]
+console.log(foo) // [1,2,3]
similarity
Returns an array of elements that appear in both arrays.
Use filter() to remove values that are not part of values, determined using includes().
const similarity = (arr, values) => arr.filter(v => values.includes(v));
-// similarity([1,2,3], [1,2,4]) -> [1,2]
+
+
similarity([1,2,3], [1,2,4]) // [1,2]
symmetricDifference
Returns the symmetric difference between two arrays.
@@ -626,42 +651,48 @@ This method also works with strings.
const symmetricDifference = (a, b) => {
const sA = new Set(a), sB = new Set(b);
return [...a.filter(x => !sB.has(x)), ...b.filter(x => !sA.has(x))];
-};
-// symmetricDifference([1,2,3], [1,2,4]) -> [3,4]
+}
+
+
symmetricDifference([1,2,3], [1,2,4]) // [3,4]
tail
Returns all elements in an array except for the first one.
Return arr.slice(1) if the array's length is more than 1, otherwise, return the whole array.
const tail = arr => arr.length > 1 ? arr.slice(1) : arr;
-// tail([1,2,3]) -> [2,3]
-// tail([1]) -> [1]
+
+
tail([1,2,3]) // [2,3]
+tail([1]) // [1]
take
Returns an array with n elements removed from the beginning.
Use Array.slice() to create a slice of the array with n elements taken from the beginning.
const take = (arr, n = 1) => arr.slice(0, n);
-// take([1, 2, 3], 5) -> [1, 2, 3]
-// take([1, 2, 3], 0) -> []
+
+
take([1, 2, 3], 5) // [1, 2, 3]
+take([1, 2, 3], 0) // []
takeRight
Returns an array with n elements removed from the end.
Use Array.slice() to create a slice of the array with n elements taken from the end.
const takeRight = (arr, n = 1) => arr.slice(arr.length - n, arr.length);
-// takeRight([1, 2, 3], 2) -> [ 2, 3 ]
-// takeRight([1, 2, 3]) -> [3]
+
+
takeRight([1, 2, 3], 2) // [ 2, 3 ]
+takeRight([1, 2, 3]) // [3]
union
Returns every element that exists in any of the two arrays once.
Create a Set with all values of a and b and convert to an array.
const union = (a, b) => Array.from(new Set([...a, ...b]));
-// union([1,2,3], [4,3,2]) -> [1,2,3,4]
+
+
union([1,2,3], [4,3,2]) // [1,2,3,4]
without
Filters out the elements of an array, that have one of the specified values.
Use Array.filter() to create an array excluding(using !Array.includes()) all given values.
(For a snippet that mutates the original array see pull )
const without = (arr, ...args) => arr.filter(v => !args.includes(v));
-// without([2, 1, 2, 3], 1, 2) -> [3]
+
+
without([2, 1, 2, 3], 1, 2) // [3]
zip
Creates an array of elements, grouped based on the position in the original arrays.
@@ -671,45 +702,51 @@ If lengths of the argument-arrays vary,
undefined is used where no
const zip = (...arrays) => {
const maxLength = Math.max(...arrays.map(x => x.length));
return Array.from({length: maxLength}).map((_, i) => {
- return Array.from({length: arrays.length}, (_, k) => arrays[k][i]);
- });
-};
-// zip(['a', 'b'], [1, 2], [true, false]); -> [['a', 1, true], ['b', 2, false]]
-// zip(['a'], [1, 2], [true, false]); -> [['a', 1, true], [undefined, 2, false]]
+ return Array.from({length: arrays.length}, (_, k) => arrays[k][i]);
+ })
+}
+
+
zip(['a', 'b'], [1, 2], [true, false]); // [['a', 1, true], ['b', 2, false]]
+zip(['a'], [1, 2], [true, false]); // [['a', 1, true], [undefined, 2, false]]
zipObject
Given an array of valid property identifiers and an array of values, return an object associating the properties to the values.
Since an object can have undefined values but not undefined property pointers, the array of properties is used to decide the structure of the resulting object using Array.reduce().
-
const zipObject = (props, values) => props.reduce((obj, prop, index) => (obj[prop] = values[index], obj), {});
-// zipObject(['a','b','c'], [1,2]) -> {a: 1, b: 2, c: undefined}
-// zipObject(['a','b'], [1,2,3]) -> {a: 1, b: 2}
+const zipObject = ( props, values ) => props.reduce( ( obj, prop, index ) => ( obj[prop] = values[index], obj ), {} )
+
+zipObject(['a','b','c'], [1,2]) // {a: 1, b: 2, c: undefined}
+zipObject(['a','b'], [1,2,3]) // {a: 1, b: 2}
Browser
arrayToHtmlList
Converts the given array elements into <li> tags and appends them to the list of the given id.
Use Array.map() and document.querySelector() to create a list of html tags.
-
const arrayToHtmlList = (arr, listID) => arr.map(item => document.querySelector('#' + listID).innerHTML += `<li>${item}</li>`);
-// arrayToHtmlList(['item 1', 'item 2'],'myListID')
+const arrayToHtmlList = (arr, listID) => arr.map(item => document.querySelector("#"+listID).innerHTML+=`<li>${item}</li>`);
+
+arrayToHtmlList(['item 1', 'item 2'],'myListID')
bottomVisible
Returns true if the bottom of the page is visible, false otherwise.
Use scrollY, scrollHeight and clientHeight to determine if the bottom of the page is visible.
const bottomVisible = () =>
document.documentElement.clientHeight + window.scrollY >= (document.documentElement.scrollHeight || document.documentElement.clientHeight);
-// bottomVisible() -> true
+
+
// bottomVisible() // true
currentURL
Returns the current URL.
Use window.location.href to get current URL.
const currentURL = () => window.location.href;
-// currentUrl() -> 'https://google.com'
+
+
currentUrl() // 'https://google.com'
detectDeviceType
Detects wether the website is being opened in a mobile device or a desktop/laptop.
Use a regular expression to test the navigator.userAgent property to figure out if the device is a mobile device or a desktop/laptop.
-
const detectDeviceType = () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ? 'Mobile' : 'Desktop';
-// detectDeviceType() -> "Mobile"
-// detectDeviceType() -> "Desktop"
+const detectDeviceType = () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ? "Mobile" : "Desktop";
+
+detectDeviceType() // "Mobile"
+detectDeviceType() // "Desktop"
elementIsVisibleInViewport
Returns true if the element specified is visible in the viewport, false otherwise.
@@ -725,9 +762,10 @@ it is partially visible.
((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth))
: top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth;
};
-// e.g. 100x100 viewport and a 10x10px element at position {top: -1, left: 0, bottom: 9, right: 10}
-// elementIsVisibleInViewport(el) -> false (not fully visible)
-// elementIsVisibleInViewport(el, true) -> true (partially visible)
+
+
// e.g. 100x100 viewport and a 10x10px element at position {top: -1, left: 0, bottom: 9, right: 10}
+elementIsVisibleInViewport(el) // false // (not fully visible)
+elementIsVisibleInViewport(el, true) // true // (partially visible)
Returns the scroll position of the current page.
@@ -736,7 +774,8 @@ You can omit
el to use a default value of
window.
const getScrollPosition = (el = window) =>
({x: (el.pageXOffset !== undefined) ? el.pageXOffset : el.scrollLeft,
y: (el.pageYOffset !== undefined) ? el.pageYOffset : el.scrollTop});
-// getScrollPosition() -> {x: 0, y: 200}
+
+
getScrollPosition() // {x: 0, y: 200}
getURLParameters
Returns an object containing the parameters of the current URL.
@@ -746,7 +785,8 @@ Pass
location.search as the argument to apply to the current
url.match(/([^?=&]+)(=([^&]*))/g).reduce(
(a, v) => (a[v.slice(0, v.indexOf('='))] = v.slice(v.indexOf('=') + 1), a), {}
);
-// getURLParameters('http://url.com/page?name=Adam&surname=Smith') -> {name: 'Adam', surname: 'Smith'}
+
+
getURLParameters('http://url.com/page?name=Adam&surname=Smith') // {name: 'Adam', surname: 'Smith'}
httpsRedirect
Redirects the page to HTTPS if its currently in HTTP. Also, pressing the back button doesn't take it back to the HTTP page as its replaced in the history.
@@ -761,7 +801,8 @@ Pass
location.search as the argument to apply to the current
Pass a second argument to simulate a link click (true - default) or an HTTP redirect (false).
const redirect = (url, asLink = true) =>
asLink ? window.location.href = url : window.location.replace(url);
-// redirect('https://google.com')
+
+redirect('https://google.com')
Smooth-scrolls to the top of the page.
@@ -774,14 +815,16 @@ Scroll by a fraction of the distance from the top. Use
window.requestAnima
window.scrollTo(0, c - c / 8);
}
};
-// scrollToTop()
+
+
scrollToTop()
Date
getDaysDiffBetweenDates
Returns the difference (in days) between two dates.
Calculate the difference (in days) between two Date objects.
const getDaysDiffBetweenDates = (dateInitial, dateFinal) => (dateFinal - dateInitial) / (1000 * 3600 * 24);
-// getDaysDiffBetweenDates(new Date("2017-12-13"), new Date("2017-12-22")) -> 9
+
+
getDaysDiffBetweenDates(new Date("2017-12-13"), new Date("2017-12-22")) // 9
JSONToDate
Converts a JSON object to a date.
@@ -790,14 +833,16 @@ Scroll by a fraction of the distance from the top. Use
window.requestAnima
const dt = new Date(parseInt(arr.toString().substr(6)));
return `${dt.getDate()}/${dt.getMonth() + 1}/${dt.getFullYear()}`;
};
-// JSONToDate(/Date(1489525200000)/) -> "14/3/2017"
+
+
JSONToDate(/Date(1489525200000)/) // "14/3/2017"
toEnglishDate
Converts a date from American format to English format.
Use Date.toISOString(), split('T') and replace() to convert a date from American format to the English format.
Throws an error if the passed time cannot be converted to a date.
const toEnglishDate = (time) => { try { return new Date(time).toISOString().split('T')[0].replace(/-/g, '/'); } catch (e) {} };
-// toEnglishDate('09/21/2010') -> '21/09/2010'
+
+
toEnglishDate('09/21/2010') // '21/09/2010'
tomorrow
Results in a string representation of tomorrow's date.
@@ -810,25 +855,23 @@ Use new Date() to get today's date, adding 86400000 of
Chains asynchronous functions.
Loop through an array of functions containing asynchronous events, calling next when each asynchronous event has completed.
const chainAsync = fns => { let curr = 0; const next = () => fns[curr++](next); next(); };
-/*
-chainAsync([
+
+
chainAsync([
next => { console.log('0 seconds'); setTimeout(next, 1000); },
next => { console.log('1 second'); setTimeout(next, 1000); },
next => { console.log('2 seconds'); }
])
-*/
compose
Performs right-to-left function composition.
Use Array.reduce() to perform right-to-left function composition.
The last (rightmost) function can accept one or more arguments; the remaining functions must be unary.
const compose = (...fns) => fns.reduce((f, g) => (...args) => f(g(...args)));
-/*
-const add5 = x => x + 5
+
+
const add5 = x => x + 5
const multiply = (x, y) => x * y
const multiplyAndAdd5 = compose(add5, multiply)
-multiplyAndAdd5(5, 2) -> 15
-*/
+multiplyAndAdd5(5, 2) // 15
curry
Curries a function.
@@ -840,83 +883,92 @@ If you want to curry a function that accepts a variable number of arguments (a v
arity <= args.length
? fn(...args)
: curry.bind(null, fn, arity, ...args);
-// curry(Math.pow)(2)(10) -> 1024
-// curry(Math.min, 3)(10)(50)(2) -> 2
+
+
curry(Math.pow)(2)(10) // 1024
+curry(Math.min, 3)(10)(50)(2) // 2
functionName
Logs the name of a function.
Use console.debug() and the name property of the passed method to log the method's name to the debug channel of the console.
const functionName = fn => (console.debug(fn.name), fn);
-// functionName(Math.max) -> max (logged in debug channel of console)
+
+
functionName(Math.max) // max (logged in debug channel of console)
runPromisesInSeries
Runs an array of promises in series.
Use Array.reduce() to create a promise chain, where each promise returns the next promise when resolved.
const runPromisesInSeries = ps => ps.reduce((p, next) => p.then(next), Promise.resolve());
-// const delay = (d) => new Promise(r => setTimeout(r, d))
-// runPromisesInSeries([() => delay(1000), () => delay(2000)]) -> executes each promise sequentially, taking a total of 3 seconds to complete
+
+
const delay = (d) => new Promise(r => setTimeout(r, d))
+runPromisesInSeries([() => delay(1000), () => delay(2000)]) // //executes each promise sequentially, taking a total of 3 seconds to complete
sleep
Delays the execution of an asynchronous function.
Delay executing part of an async function, by putting it to sleep, returning a Promise.
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
-/*
-async function sleepyWork() {
+
+
async function sleepyWork() {
console.log('I\'m going to sleep for 1 second.');
await sleep(1000);
console.log('I woke up after 1 second.');
}
-*/
Logic
negate
Negates a predicate function.
Take a predicate function and apply not to it with its arguments.
const negate = func => (...args) => !func(...args);
-// filter([1, 2, 3, 4, 5, 6], negate(isEven)) -> [1, 3, 5]
-// negate(isOdd)(1) -> false
+
+
filter([1, 2, 3, 4, 5, 6], negate(isEven)) // [1, 3, 5]
+negate(isOdd)(1) // false
Math
arrayAverage
Returns the average of an array of numbers.
Use Array.reduce() to add each value to an accumulator, initialized with a value of 0, divide by the length of the array.
const arrayAverage = arr => arr.reduce((acc, val) => acc + val, 0) / arr.length;
-// arrayAverage([1,2,3]) -> 2
+
+
arrayAverage([1,2,3]) // 2
arraySum
Returns the sum of an array of numbers.
Use Array.reduce() to add each value to an accumulator, initialized with a value of 0.
const arraySum = arr => arr.reduce((acc, val) => acc + val, 0);
-// arraySum([1,2,3,4]) -> 10
+
+
arraySum([1,2,3,4]) // 10
clampNumber
-
Clamps num within the inclusive range specified by the boundary values a and b
+
Clamps num within the inclusive range specified by the boundary values a and b.
If num falls within the range, return num.
Otherwise, return the nearest number in the range.
const clampNumber = (num, a, b) => Math.max(Math.min(num, Math.max(a,b)),Math.min(a,b));
-// clampNumber(2, 3, 5) -> 3
-// clampNumber(1, -1, -5) -> -1
-// clampNumber(3, 2, 4) -> 3
+
+
clampNumber(2, 3, 5) // 3
+clampNumber(1, -1, -5) // -1
+clampNumber(3, 2, 4) // 3
collatz
Applies the Collatz algorithm.
If n is even, return n/2. Otherwise, return 3n+1.
const collatz = n => (n % 2 == 0) ? (n / 2) : (3 * n + 1);
-// collatz(8) --> 4
-// collatz(5) --> 16
+
+
collatz(8) // 4
+collatz(5) // 16
digitize
Converts a number to an array of digits.
Convert the number to a string, using spread operators in ES6([...string]) build an array.
Use Array.map() and parseInt() to transform each value to an integer.
-
const digitize = n => [...'' + n].map(i => parseInt(i));
-// digitize(2334) -> [2, 3, 3, 4]
+const digitize = n => [...''+n].map(i => parseInt(i));
+
+differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) // [1, 1.2]
distance
Returns the distance between two points.
Use Math.hypot() to calculate the Euclidean distance between two points.
const distance = (x0, y0, x1, y1) => Math.hypot(x1 - x0, y1 - y0);
-// distance(1,1, 2,3) -> 2.23606797749979
+
+
distance(1,1, 2,3) // 2.23606797749979
factorial
Calculates the factorial of a number.
@@ -927,7 +979,8 @@ Throws an exception if
n is a negative number.
const factorial = n =>
n < 0 ? (() => { throw new TypeError('Negative numbers are not allowed!'); })()
: n <= 1 ? 1 : n * factorial(n - 1);
-// factorial(6) -> 720
+
+
factorial(6) // 720
fibonacci
Generates an array, containing the Fibonacci sequence, up until the nth term.
@@ -935,14 +988,16 @@ Throws an exception if
n is a negative number.
Use
Array.reduce() to add values into the array, using the sum of the last two values, except for the first two.
const fibonacci = n =>
Array.from({ length: n}).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []);
-// fibonacci(5) -> [0,1,1,2,3]
+
+
factorial(6) // 720
fibonacciCountUntilNum
Returns the number of fibonnacci numbers up to num(0 and num inclusive).
Use a mathematical formula to calculate the number of fibonacci numbers until num.
const fibonacciCountUntilNum = num =>
- Math.ceil(Math.log(num * Math.sqrt(5) + 1 / 2) / Math.log((Math.sqrt(5) + 1) / 2));
-// fibonacciCountUntilNum(10) -> 7
+ Math.ceil(Math.log(num * Math.sqrt(5) + 1/2) / Math.log((Math.sqrt(5)+1)/2));
+
+
fibonacciCountUntilNum(10) // 7
fibonacciUntilNum
Generates an array, containing the Fibonacci sequence, up until the nth term.
@@ -952,8 +1007,9 @@ Uses a mathematical formula to calculate the length of the array required.
const fibonacciUntilNum = num => {
let n = Math.ceil(Math.log(num * Math.sqrt(5) + 1 / 2) / Math.log((Math.sqrt(5) + 1) / 2));
return Array.from({ length: n}).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []);
-};
-// fibonacciUntilNum(15) -> [0,1,1,2,3,5,8,13]
+}
+
+
fibonacciCountUntilNum(10) // 7
gcd
Calculates the greatest common divisor between two numbers.
@@ -961,7 +1017,8 @@ Uses a mathematical formula to calculate the length of the array required.
Base case is when
y equals
0. In this case, return
x.
Otherwise, return the GCD of
y and the remainder of the division
x/y.
const gcd = (x, y) => !y ? x : gcd(y, x % y);
-// gcd (8, 36) -> 4
+
+
gcd (8, 36) // 4
hammingDistance
Calculates the Hamming distance between two values.
@@ -969,42 +1026,47 @@ Otherwise, return the GCD of
y and the remainder of the division
1s in the string, using match(/1/g).
const hammingDistance = (num1, num2) =>
((num1 ^ num2).toString(2).match(/1/g) || '').length;
-// hammingDistance(2,3) -> 1
+
+hammingDistance(2,3) // 1
inRange
Checks if the given number falls within the given range.
Use arithmetic comparison to check if the given number is in the specified range.
If the second parameter, end, is not specified, the range is considered to be from 0 to start.
-
const inRange = (n, start, end = null) => {
- if (end && start > end) end = [start, start = end][0];
- return (end == null) ? (n >= 0 && n < start) : (n >= start && n < end);
-};
-// inRange(3, 2, 5) -> true
-// inRange(3, 4) -> true
-// inRange(2, 3, 5) -> false
-// inrange(3, 2) -> false
+const inRange = (n, start, end=null) => {
+ if(end && start > end) end = [start, start=end][0];
+ return (end == null) ? (n>=0 && n<start) : (n>=start && n<end);
+}
+
+inRange(3, 2, 5) // true
+inRange(3, 4) // true
+inRange(2, 3, 5) // false
+inrange(3, 2) // false
isArmstrongNumber
Checks if the given number is an Armstrong number or not.
Convert the given number into an array of digits. Use Math.pow() to get the appropriate power for each digit and sum them up. If the sum is equal to the number itself, return true otherwise false.
const isArmstrongNumber = digits =>
- (arr => arr.reduce((a, d) => a + Math.pow(parseInt(d), arr.length), 0) == digits)((digits + '').split(''));
-// isArmstrongNumber(1634) -> true
-// isArmstrongNumber(371) -> true
-// isArmstrongNumber(56) -> false
+ ( arr => arr.reduce( ( a, d ) => a + Math.pow( parseInt( d ), arr.length ), 0 ) == digits ? true : false )( ( digits+'' ).split( '' ) );
+
+
isArmstrongNumber(1634) // true
+isArmstrongNumber(371) // true
+isArmstrongNumber(56) // false
isDivisible
Checks if the first numeric argument is divisible by the second one.
Use the modulo operator (%) to check if the remainder is equal to 0.
const isDivisible = (dividend, divisor) => dividend % divisor === 0;
-// isDivisible(6,3) -> true
+
+
isDivisible(6,3) // true
isEven
Returns true if the given number is even, false otherwise.
Checks whether a number is odd or even using the modulo (%) operator.
Returns true if the number is even, false if the number is odd.
const isEven = num => num % 2 === 0;
-// isEven(3) -> false
+
+
isEven(3) // false
isPrime
Checks if the provided integer is a prime number.
@@ -1015,8 +1077,9 @@ Return
false if any of them divides the given number, else return <
for (var i = 2; i * i <= boundary; i++) if (num % i == 0) return false;
return num >= 2;
};
-// isPrime(11) -> true
-// isPrime(12) -> false
+
+
isPrime(11) // true
+isPrime(12) // false
lcm
Returns the least common multiple of two numbers.
@@ -1026,7 +1089,8 @@ The GCD formula uses recursion.
const gcd = (x, y) => !y ? x : gcd(y, x % y);
return Math.abs(x * y) / (gcd(x, y));
};
-// lcm(12,7) -> 84
+
+
lcm(12,7) // 84
Returns the median of an array of numbers.
@@ -1036,8 +1100,9 @@ Return the number at the midpoint if
length is odd, otherwise the a
const mid = Math.floor(arr.length / 2), nums = [...arr].sort((a, b) => a - b);
return arr.length % 2 !== 0 ? nums[mid] : (nums[mid - 1] + nums[mid]) / 2;
};
-// median([5,6,50,1,-5]) -> 5
-// median([0,10,-2,7]) -> 3.5
+
+
median([5,6,50,1,-5]) // 5
+median([0,10,-2,7]) // 3.5
palindrome
Returns true if the given string is a palindrome, false otherwise.
@@ -1047,52 +1112,59 @@ Then,
split('') into individual characters,
reverse(),
const s = str.toLowerCase().replace(/[\W_]/g,'');
return s === s.split('').reverse().join('');
}
-// palindrome('taco cat') -> true
+
+
palindrome('taco cat') // true
percentile
Uses the percentile formula to calculate how many numbers in the given array are less or equal to the given value.
Use Array.reduce() to calculate how many numbers are below the value and how many are the same value and apply the percentile formula.
const percentile = (arr, val) =>
100 * arr.reduce((acc,v) => acc + (v < val ? 1 : 0) + (v === val ? 0.5 : 0), 0) / arr.length;
-// percentile([1,2,3,4,5,6,7,8,9,10], 6) -> 55
+
+
percentile([1,2,3,4,5,6,7,8,9,10], 6) // 55
powerset
Returns the powerset of a given array of numbers.
Use Array.reduce() combined with Array.map() to iterate over elements and combine into an array containing all combinations.
const powerset = arr =>
arr.reduce((a, v) => a.concat(a.map(r => [v].concat(r))), [[]]);
-// powerset([1,2]) -> [[], [1], [2], [2,1]]
+
+
powerset([1,2]) // [[], [1], [2], [2,1]]
primes
Generates primes up to a given number, using the Sieve of Eratosthenes.
Generate an array from 2 to the given number. Use Array.filter() to filter out the values divisible by any number from 2 to the square root of the provided number.
const primes = num => {
- let arr = Array.from({length: num - 1}).map((x, i) => i + 2),
- sqroot = Math.floor(Math.sqrt(num)),
- numsTillSqroot = Array.from({length: sqroot - 1}).map((x, i) => i + 2);
- numsTillSqroot.forEach(x => arr = arr.filter(y => ((y % x) !== 0) || (y == x)));
+ let arr = Array.from({length:num-1}).map((x,i)=> i+2),
+ sqroot = Math.floor(Math.sqrt(num)),
+ numsTillSqroot = Array.from({length:sqroot-1}).map((x,i)=> i+2);
+ numsTillSqroot.forEach(x => arr = arr.filter(y => ((y%x)!==0)||(y==x)));
return arr;
-};
-// primes(10) -> [2,3,5,7]
+}
+
+
primes(10) // [2,3,5,7]
randomIntegerInRange
Returns a random integer in the specified range.
Use Math.random() to generate a random number and map it to the desired range, using Math.floor() to make it an integer.
const randomIntegerInRange = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
-// randomIntegerInRange(0, 5) -> 2
+
+
randomIntegerInRange(0, 5) // 2
randomNumberInRange
Returns a random number in the specified range.
Use Math.random() to generate a random value, map it to the desired range using multiplication.
const randomNumberInRange = (min, max) => Math.random() * (max - min) + min;
-// randomNumberInRange(2,10) -> 6.0211363285087005
+
+
randomNumberInRange(2,10) // 6.0211363285087005
round
Rounds a number to a specified amount of digits.
Use Math.round() and template literals to round the number to the specified number of digits.
Omit the second argument, decimals to round to an integer.
-
const round = (n, decimals = 0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`);
-// round(1.005, 2) -> 1.01
+const round = (n, decimals=0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`);
+
+round(1.005, 2) // 1.01
sdbmHashAlgorithm
This algorithm is a simple hash-algorithm that hashes it input string s into a whole number.
@@ -1118,8 +1190,9 @@ You can omit the second argument to get the sample standard deviation or set it
.reduce((acc, val) => acc + val, 0) / (arr.length - (usePopulation ? 0 : 1))
);
};
-// standardDeviation([10,2,38,23,38,23,21]) -> 13.284434142114991 (sample)
-// standardDeviation([10,2,38,23,38,23,21], true) -> 12.29899614287479 (population)
+
+
standardDeviation([10,2,38,23,38,23,21]) // 13.284434142114991 (sample)
+standardDeviation([10,2,38,23,38,23,21], true) // 12.29899614287479 (population)
Media
speechSynthesis
@@ -1132,15 +1205,17 @@ Use
window.speechSynthesis.speak() to play the message.
msg.voice = window.speechSynthesis.getVoices()[0];
window.speechSynthesis.speak(msg);
};
-// speechSynthesis('Hello, World') -> plays the message
+
+
speechSynthesis('Hello, World') // // plays the message
Node
JSONToFile
Writes a JSON object to a file.
Use fs.writeFile(), template literals and JSON.stringify() to write a json object to a .json file.
const fs = require('fs');
-const JSONToFile = (obj, filename) => fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2));
-// JSONToFile({test: "is passed"}, 'testJsonFile') -> writes the object to 'testJsonFile.json'
+const JSONToFile = (obj, filename) => fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2))
+
+
JSONToFile({test: "is passed"}, 'testJsonFile') // writes the object to 'testJsonFile.json'
readFileLines
Returns an array of lines from the specified file.
@@ -1148,16 +1223,25 @@ const JSONToFile = (obj, filename) => fs.writeFile(`${filename}.json`, JSON.s
convert buffer to string using
toString(encoding) function.
creating an array from contents of file by
spliting file content line by line (each
\n).
const fs = require('fs');
-const readFileLines = filename => fs.readFileSync(filename).toString('UTF8').split(/\r?\n/);
-/*
- contents of test.txt :
- line1
- line2
- line3
- ___________________________
- let arr = readFileLines('test.txt')
- console.log(arr) // -> ['line1', 'line2', 'line3']
- */
+const readFileLines = filename => fs.readFileSync(filename).toString('UTF8').split('\n');
+
+
/*
+contents of test.txt :
+ line1
+ line2
+ line3
+ ___________________________
+*/
+let arr = readFileLines('test.txt')
+console.log(arr) // ['line1', 'line2', 'line3']
+
+
contents of test.txt :
+ line1
+ line2
+ line3
+ ___________________________
+let arr = readFileLines('test.txt')
+console.log(arr) // // ['line1', 'line2', 'line3']
Object
cleanObj
@@ -1174,22 +1258,23 @@ Also if you give it a special key (
childIndicator) it will search d
});
return obj;
};
-/*
- const testObj = {a: 1, b: 2, children: {a: 1, b: 2}}
- cleanObj(testObj, ["a"],"children") // { a: 1, children : { a: 1}}
-*/
+
+
const testObj = {a: 1, b: 2, children: {a: 1, b: 2}}
+cleanObj(testObj, ["a"],"children") // { a: 1, children : { a: 1}}
objectFromPairs
Creates an object from the given key-value pairs.
Use Array.reduce() to create and combine key-value pairs.
const objectFromPairs = arr => arr.reduce((a, v) => (a[v[0]] = v[1], a), {});
-// objectFromPairs([['a',1],['b',2]]) -> {a: 1, b: 2}
+
+
objectFromPairs([['a',1],['b',2]]) // {a: 1, b: 2}
objectToPairs
Creates an array of key-value pair arrays from an object.
Use Object.keys() and Array.map() to iterate over the object's keys and produce an array with key-value pairs.
const objectToPairs = obj => Object.keys(obj).map(k => [k, obj[k]]);
-// objectToPairs({a: 1, b: 2}) -> [['a',1],['b',2]])
+
+
objectToPairs({a: 1, b: 2}) // [['a',1],['b',2]])
orderBy
Returns a sorted array of objects ordered by properties and orders.
@@ -1205,37 +1290,36 @@ If no orders array is passed it sort by 'asc' by default.
return acc;
}, 0)
);
-/*
-const users = [{ 'name': 'fred', 'age': 48 },{ 'name': 'barney', 'age': 36 },
+
+
const users = [{ 'name': 'fred', 'age': 48 },{ 'name': 'barney', 'age': 36 },
{ 'name': 'fred', 'age': 40 },{ 'name': 'barney', 'age': 34 }];
-orderby(users, ['name', 'age'], ['asc', 'desc']) -> [{name: 'barney', age: 36}, {name: 'barney', age: 34}, {name: 'fred', age: 48}, {name: 'fred', age: 40}]
-orderby(users, ['name', 'age']) -> [{name: 'barney', age: 34}, {name: 'barney', age: 36}, {name: 'fred', age: 40}, {name: 'fred', age: 48}]
-*/
+orderby(users, ['name', 'age'], ['asc', 'desc']) // [{name: 'barney', age: 36}, {name: 'barney', age: 34}, {name: 'fred', age: 48}, {name: 'fred', age: 40}]
+orderby(users, ['name', 'age']) // [{name: 'barney', age: 34}, {name: 'barney', age: 36}, {name: 'fred', age: 40}, {name: 'fred', age: 48}]
select
Retrieve a property that indicated by the selector from an object.
If the property does not exists returns undefined.
const select = (from, selector) =>
selector.split('.').reduce((prev, cur) => prev && prev[cur], from);
-
-// const obj = {selector: {to: {val: 'val to select'}}};
-// select(obj, 'selector.to.val'); -> 'val to select'
+
+
const obj = {selector: {to: {val: 'val to select'}}};
+select(obj, 'selector.to.val'); // 'val to select'
shallowClone
Creates a shallow clone of an object.
Use Object.assign() and an empty object ({}) to create a shallow clone of the original.
const shallowClone = obj => Object.assign({}, obj);
-/*
-const a = { x: true, y: 1 };
+
+
const a = { x: true, y: 1 };
const b = shallowClone(a);
-a === b -> false
-*/
+a === b // false
truthCheckCollection
Checks if the predicate (second argument) is truthy on all elements of a collection (first argument).
Use Array.every() to check if each passed object has the specified property and if it returns a truthy value.
const truthCheckCollection = (collection, pre) => (collection.every(obj => obj[pre]));
-// truthCheckCollection([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}], "sex") -> true
+
+
truthCheckCollection([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}], "sex") // true
String
anagrams
@@ -1249,7 +1333,8 @@ Base cases are for string
length equal to
2 or
1
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']
+
+
anagrams('abc') // ['abc','acb','bac','bca','cab','cba']
Capitalize
Capitalizes the first letter of a string.
@@ -1257,27 +1342,31 @@ Base cases are for string
length equal to
2 or
1
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) =>
first.toUpperCase() + (lowerRest ? rest.join('').toLowerCase() : rest.join(''));
-// capitalize('myName') -> 'MyName'
-// capitalize('myName', true) -> 'Myname'
+
+capitalize('fooBar') // 'FooBar'
+capitalize('fooBar', true) // 'Foobar'
capitalizeEveryWord
Capitalizes the first letter of every word in a string.
Use replace() to match the first character of each word and toUpperCase() to capitalize it.
const capitalizeEveryWord = str => str.replace(/\b[a-z]/g, char => char.toUpperCase());
-// capitalizeEveryWord('hello world!') -> 'Hello World!'
+
+
capitalizeEveryWord('hello world!') // 'Hello World!'
countVowels
Retuns number of vowels in provided string.
Use a regular expression to count the number of vowels (A, E, I, O, U) in a string.
const countVowels = str => (str.match(/[aeiou]/ig) || []).length;
-// countVowels('foobar') -> 3
-// countVowels('gym') -> 0
+
+
countVowels('foobar') // 3
+countVowels('gym') // 0
escapeRegExp
Escapes a string to use in a regular expression.
Use replace() to escape special characters.
const escapeRegExp = str => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
-// escapeRegExp('(test)') -> \\(test\\)
+
+
escapeRegExp('(test)') // \\(test\\)
fromCamelCase
Converts a string from camelcase.
@@ -1286,32 +1375,36 @@ Omit the second argument to use a default separator of
_.
const fromCamelCase = (str, separator = '_') =>
str.replace(/([a-z\d])([A-Z])/g, '$1' + separator + '$2')
.replace(/([A-Z]+)([A-Z][a-z\d]+)/g, '$1' + separator + '$2').toLowerCase();
-// fromCamelCase('someDatabaseFieldName', ' ') -> 'some database field name'
-// fromCamelCase('someLabelThatNeedsToBeCamelized', '-') -> 'some-label-that-needs-to-be-camelized'
-// fromCamelCase('someJavascriptProperty', '_') -> 'some_javascript_property'
+
+
fromCamelCase('someDatabaseFieldName', ' ') // 'some database field name'
+fromCamelCase('someLabelThatNeedsToBeCamelized', '-') // 'some-label-that-needs-to-be-camelized'
+fromCamelCase('someJavascriptProperty', '_') // 'some_javascript_property'
repeatString
Repeats a string n times using String.repeat()
If no string is provided the default is "" and the default number of times is 2.
-
const repeatString = (str = '', num = 2) => {
- return num >= 0 ? str.repeat(num) : str;
-};
-// repeatString("abc",3) -> 'abcabcabc'
-// repeatString("abc") -> 'abcabc'
+const repeatString = (str="",num=2) => {
+ return num >= 0 ? str.repeat(num) : str;
+}
+
+repeatString("abc",3) // 'abcabcabc'
+repeatString("abc") // 'abcabc'
reverseString
Reverses a string.
Use split('') and Array.reverse() to reverse the order of the characters in the string.
Combine characters to get a string using join('').
const reverseString = str => str.split('').reverse().join('');
-// reverseString('foobar') -> 'raboof'
+
+
reverseString('foobar') // 'raboof'
sortCharactersInString
Alphabetically sorts the characters in a string.
Split the string using split(''), Array.sort() utilizing localeCompare(), recombine using join('').
const sortCharactersInString = str =>
str.split('').sort((a, b) => a.localeCompare(b)).join('');
-// sortCharactersInString('cabbage') -> 'aabbceg'
+
+
sortCharactersInString('cabbage') // 'aabbceg'
words
Converts a given string into an array of words.
Use String.split() with a supplied pattern (defaults to non-alpha as a regex) to convert to an array of strings. Use Array.filter() to remove any empty strings.
Omit the second argument to use the default regex.
const words = (str, pattern = /[^a-zA-Z-]+/) => str.split(pattern).filter(Boolean);
-// words("I love javaScript!!") -> ["I", "love", "javaScript"]
-// words("python, javaScript & coffee") -> ["python", "javaScript", "coffee"]
+
+
words("I love javaScript!!") // ["I", "love", "javaScript"]
+words("python, javaScript & coffee") // ["python", "javaScript", "coffee"]
Utility
coalesce
Returns the first non-null/undefined argument.
Use Array.find() to return the first non null/undefined argument.
-
const coalesce = (...args) => args.find(_ => ![undefined, null].includes(_));
-// coalesce(null,undefined,"",NaN, "Waldo") -> ""
+const coalesce = (...args) => args.find(_ => ![undefined, null].includes(_))
+
+coalesce(null,undefined,"",NaN, "Waldo") // ""
coalesceFactory
Returns a customized coalesce function that returns the first argument that returns true from the provided argument validation function.
Use Array.find() to return the first argument that returns true from the provided argument validation function.
const coalesceFactory = valid => (...args) => args.find(valid);
-// const customCoalesce = coalesceFactory(_ => ![null, undefined, "", NaN].includes(_))
-// customCoalesce(undefined, null, NaN, "", "Waldo") //-> "Waldo"
+
+
const customCoalesce = coalesceFactory(_ => ![null, undefined, "", NaN].includes(_))
+customCoalesce(undefined, null, NaN, "", "Waldo") // "Waldo"
extendHex
Extends a 3-digit color code to a 6-digit color code.
Use Array.map(), split() and Array.join() to join the mapped array for converting a 3-digit RGB notated hexadecimal color-code to the 6-digit form.
String.slice() is used to remove # from string start since it's added once.
const extendHex = shortHex =>
- '#' + shortHex.slice(shortHex.startsWith('#') ? 1 : 0).split('').map(x => x + x).join('');
-// extendHex('#03f') -> '#0033ff'
-// extendHex('05a') -> '#0055aa'
+ '#' + shortHex.slice(shortHex.startsWith('#') ? 1 : 0).split('').map(x => x+x).join('')
+
+
extendHex('#03f') // '#0033ff'
+extendHex('05a') // '#0055aa'
getType
Returns the native type of a value.
Returns lowercased constructor name of value, "undefined" or "null" if value is undefined or null
const getType = v =>
v === undefined ? 'undefined' : v === null ? 'null' : v.constructor.name.toLowerCase();
-// getType(new Set([1,2,3])) -> "set"
+
+
getType(new Set([1,2,3])) // "set"
hexToRGB
Converts a color code to a rgb() or rgba() string if alpha value is provided.
@@ -1418,51 +1520,58 @@ Omit the second argument to use the default regex.
((h & (alpha ? 0x0000ff00 : 0x0000ff)) >>> (alpha ? 8 : 0)) +
(alpha ? `, ${(h & 0x000000ff)}` : '') + ')';
};
-// hexToRGB('#27ae60ff') -> 'rgba(39, 174, 96, 255)'
-// hexToRGB('27ae60') -> 'rgb(39, 174, 96)'
-// hexToRGB('#fff') -> 'rgb(255, 255, 255)'
+
+
hexToRGB('#27ae60ff') // 'rgba(39, 174, 96, 255)'
+hexToRGB('27ae60') // 'rgb(39, 174, 96)'
+hexToRGB('#fff') // 'rgb(255, 255, 255)'
isArray
Checks if the given argument is an array.
Use Array.isArray() to check if a value is classified as an array.
const isArray = val => !!val && Array.isArray(val);
-// isArray(null) -> false
-// isArray([1]) -> true
+
+
isArray(null) // false
+isArray([1]) // true
isBoolean
Checks if the given argument is a native boolean element.
Use typeof to check if a value is classified as a boolean primitive.
const isBoolean = val => typeof val === 'boolean';
-// isBoolean(null) -> false
-// isBoolean(false) -> true
+
+
isBoolean(null) // false
+isBoolean(false) // true
isFunction
Checks if the given argument is a function.
Use typeof to check if a value is classified as a function primitive.
const isFunction = val => val && typeof val === 'function';
-// isFunction('x') -> false
-// isFunction(x => x) -> true
+
+
isFunction('x') // false
+isFunction(x => x) // true
isNumber
Checks if the given argument is a number.
Use typeof to check if a value is classified as a number primitive.
const isNumber = val => typeof val === 'number';
-// isNumber('1') -> false
-// isNumber(1) -> true
+
+
isNumber('1') // false
+isNumber(1) // true
isString
Checks if the given argument is a string.
Use typeof to check if a value is classified as a string primitive.
const isString = val => typeof val === 'string';
-// isString(10) -> false
-// isString('10') -> true
+
+
isString(10) // false
+isString('10') // true
isSymbol
Checks if the given argument is a symbol.
Use typeof to check if a value is classified as a symbol primitive.
const isSymbol = val => typeof val === 'symbol';
-// isSymbol('x') -> false
-// isSymbol(Symbol('x')) -> true
+
+
isSymbol('x') // false
+isSymbol(Symbol('x')) // true
randomHexColor
Generates a random hexadecimal color code.
@@ -1472,15 +1581,17 @@ Omit the second argument to use the default regex.
return '#' + (n.length !== 6
? (Math.random() * 0xf | 0).toString(16) + n : n);
};
-// randomHexColorCode() -> "#e34155"
-// randomHexColorCode() -> "#fd73a6"
-// randomHexColorCode() -> "#4144c6"
+
+
randomHexColorCode() // "#e34155"
+randomHexColorCode() // "#fd73a6"
+randomHexColorCode() // "#4144c6"
RGBToHex
Converts the values of RGB components to a color code.
Convert given RGB parameters to hexadecimal string using bitwise left-shift operator (<<) and toString(16), then padStart(6,'0') to get a 6-digit hexadecimal value.
const RGBToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0');
-// RGBToHex(255, 165, 1) -> 'ffa501'
+
+
RGBToHex(255, 165, 1) // 'ffa501'
Measures the time taken by a function to execute.
@@ -1489,13 +1600,15 @@ Omit the second argument to use the default regex.
console.time('timeTaken'); const r = callback();
console.timeEnd('timeTaken'); return r;
};
-// timeTaken(() => Math.pow(2, 10)) -> 1024
-// (logged): timeTaken: 0.02099609375ms
+
+
timeTaken(() => Math.pow(2, 10)) // 1024
+(logged): timeTaken: 0.02099609375ms
toDecimalMark
Use toLocaleString() to convert a float-point arithmetic to the Decimal mark form. It makes a comma separated string from a number.
-
const toDecimalMark = num => num.toLocaleString('en-US');
-// toDecimalMark(12305030388.9087) -> "12,305,030,388.9087"
+const toDecimalMark = num => num.toLocaleString("en-US");
+
+toDecimalMark(12305030388.9087) // "12,305,030,388.9087"
toOrdinalSuffix
Adds an ordinal suffix to a number.
@@ -1508,7 +1621,8 @@ If digit is found in teens pattern, use teens ordinal.
tPattern = [11, 12, 13, 14, 15, 16, 17, 18, 19];
return oPattern.includes(digits[0]) && !tPattern.includes(digits[1]) ? int + ordinals[digits[0] - 1] : int + ordinals[3];
};
-// toOrdinalSuffix("123") -> "123rd"
+
+
toOrdinalSuffix("123") // "123rd"
UUIDGenerator
Generates a UUID.
@@ -1517,7 +1631,8 @@ If digit is found in teens pattern, use teens ordinal.
([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>
(c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
);
-// UUIDGenerator() -> '7982fcfe-5721-4632-bede-6000885be57d'
+
+
UUIDGenerator() // '7982fcfe-5721-4632-bede-6000885be57d'
validateNumber
Returns true if the given value is a number, false otherwise.
@@ -1525,7 +1640,8 @@ If digit is found in teens pattern, use teens ordinal.
Use
isFinite() to check if the number is finite.
Use
Number() to check if the coercion holds.
const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == n;
-// validateNumber('10') -> true
+
+
validateNumber('10') // true
diff --git a/docs/mini.css b/docs/mini.css
index 76d9b3229..789147cb0 100644
--- a/docs/mini.css
+++ b/docs/mini.css
@@ -1 +1 @@
-:root{--fore-color:#111;--secondary-fore-color:#444;--back-color:#f8f8f8;--secondary-back-color:#f0f0f0;--blockquote-color:#f57c00;--pre-color:#1565c0;--border-color:#aaa;--secondary-border-color:#ddd;--heading-ratio:1.19;--universal-margin:.5rem;--universal-padding:.5rem;--universal-border-radius:.125rem;--a-link-color:#0277bd;--a-visited-color:#01579b}html{font-size:16px}a,b,del,em,i,ins,q,span,strong,u{font-size:1em}html,*{font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, "Helvetica Neue", Helvetica, sans-serif;line-height:1.5;-webkit-text-size-adjust:100%}*{font-size:1rem}body{margin:0;color:var(--fore-color);background:var(--back-color)}details{display:block}summary{display:list-item}abbr[title]{border-bottom:none;text-decoration:underline dotted}input{overflow:visible}img{max-width:100%;height:auto}h1,h2,h3,h4,h5,h6{line-height:1.2;margin:calc(1.5 * var(--universal-margin)) var(--universal-margin);font-weight:500}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:var(--secondary-fore-color);display:block;margin-top:-.25rem}h1{font-size:calc(1rem * var(--heading-ratio) * var(--heading-ratio) * var(--heading-ratio) * var(--heading-ratio))}h2{font-size:calc(1rem * var(--heading-ratio) * var(--heading-ratio) * var(--heading-ratio))}h3{font-size:calc(1rem * var(--heading-ratio) * var(--heading-ratio))}h4{font-size:calc(1rem * var(--heading-ratio))}h5{font-size:1rem}h6{font-size:calc(1rem / var(--heading-ratio))}p{margin:var(--universal-margin)}ol,ul{margin:var(--universal-margin);padding-left:calc(2 * var(--universal-margin))}b,strong{font-weight:700}hr{box-sizing:content-box;border:0;line-height:1.25em;margin:var(--universal-margin);height:.0625rem;background:linear-gradient(to right, transparent, var(--border-color) 20%, var(--border-color) 80%, transparent)}blockquote{display:block;position:relative;font-style:italic;color:var(--secondary-fore-color);margin:var(--universal-margin);padding:calc(3 * var(--universal-padding));border:.0625rem solid var(--secondary-border-color);border-left:.375rem solid var(--blockquote-color);border-radius:0 var(--universal-border-radius) var(--universal-border-radius) 0}blockquote:before{position:absolute;top:calc(0rem - var(--universal-padding));left:0;font-family:sans-serif;font-size:3rem;font-weight:700;content:"\201c";color:var(--blockquote-color)}blockquote[cite]:after{font-style:normal;font-size:.75em;font-weight:700;content:"\a— " attr(cite);white-space:pre}code,kbd,pre,samp{font-family:Menlo, Consolas, monospace;font-size:.85em}code{background:var(--secondary-back-color);border-radius:var(--universal-border-radius);padding:calc(var(--universal-padding) / 4) calc(var(--universal-padding) / 2)}kbd{background:var(--fore-color);color:var(--back-color);border-radius:var(--universal-border-radius);padding:calc(var(--universal-padding) / 4) calc(var(--universal-padding) / 2)}pre{overflow:auto;background:var(--secondary-back-color);padding:calc(1.5 * var(--universal-padding));margin:var(--universal-margin);border:.0625rem solid var(--secondary-border-color);border-left:.25rem solid var(--pre-color);border-radius:0 var(--universal-border-radius) var(--universal-border-radius) 0}sup,sub,code,kbd{line-height:0;position:relative;vertical-align:baseline}small,sup,sub,figcaption{font-size:.75em}sup{top:-.5em}sub{bottom:-.25em}figure{margin:var(--universal-margin)}figcaption{color:var(--secondary-fore-color)}a{text-decoration:none}a:link{color:var(--a-link-color)}a:visited{color:var(--a-visited-color)}a:hover,a:focus{text-decoration:underline}.container{margin:0 auto;padding:0 calc(1.5 * var(--universal-padding))}.row{box-sizing:border-box;display:flex;flex:0 1 auto;flex-flow:row wrap}.col-sm,[class^='col-sm-'],[class^='col-sm-offset-'],.row[class*='cols-sm-']>*{box-sizing:border-box;flex:0 0 auto;padding:0 calc(var(--universal-padding) / 2)}.col-sm,.row.cols-sm>*{max-width:100%;flex-grow:1;flex-basis:0}.col-sm-1,.row.cols-sm-1>*{max-width:8.33333%;flex-basis:8.33333%}.col-sm-offset-0{margin-left:0}.col-sm-2,.row.cols-sm-2>*{max-width:16.66667%;flex-basis:16.66667%}.col-sm-offset-1{margin-left:8.33333%}.col-sm-3,.row.cols-sm-3>*{max-width:25%;flex-basis:25%}.col-sm-offset-2{margin-left:16.66667%}.col-sm-4,.row.cols-sm-4>*{max-width:33.33333%;flex-basis:33.33333%}.col-sm-offset-3{margin-left:25%}.col-sm-5,.row.cols-sm-5>*{max-width:41.66667%;flex-basis:41.66667%}.col-sm-offset-4{margin-left:33.33333%}.col-sm-6,.row.cols-sm-6>*{max-width:50%;flex-basis:50%}.col-sm-offset-5{margin-left:41.66667%}.col-sm-7,.row.cols-sm-7>*{max-width:58.33333%;flex-basis:58.33333%}.col-sm-offset-6{margin-left:50%}.col-sm-8,.row.cols-sm-8>*{max-width:66.66667%;flex-basis:66.66667%}.col-sm-offset-7{margin-left:58.33333%}.col-sm-9,.row.cols-sm-9>*{max-width:75%;flex-basis:75%}.col-sm-offset-8{margin-left:66.66667%}.col-sm-10,.row.cols-sm-10>*{max-width:83.33333%;flex-basis:83.33333%}.col-sm-offset-9{margin-left:75%}.col-sm-11,.row.cols-sm-11>*{max-width:91.66667%;flex-basis:91.66667%}.col-sm-offset-10{margin-left:83.33333%}.col-sm-12,.row.cols-sm-12>*{max-width:100%;flex-basis:100%}.col-sm-offset-11{margin-left:91.66667%}.col-sm-normal{order:initial}.col-sm-first{order:-999}.col-sm-last{order:999}@media screen and (min-width: 768px){.col-md,[class^='col-md-'],[class^='col-md-offset-'],.row[class*='cols-md-']>*{box-sizing:border-box;flex:0 0 auto;padding:0 calc(var(--universal-padding) / 2)}.col-md,.row.cols-md>*{max-width:100%;flex-grow:1;flex-basis:0}.col-md-1,.row.cols-md-1>*{max-width:8.33333%;flex-basis:8.33333%}.col-md-offset-0{margin-left:0}.col-md-2,.row.cols-md-2>*{max-width:16.66667%;flex-basis:16.66667%}.col-md-offset-1{margin-left:8.33333%}.col-md-3,.row.cols-md-3>*{max-width:25%;flex-basis:25%}.col-md-offset-2{margin-left:16.66667%}.col-md-4,.row.cols-md-4>*{max-width:33.33333%;flex-basis:33.33333%}.col-md-offset-3{margin-left:25%}.col-md-5,.row.cols-md-5>*{max-width:41.66667%;flex-basis:41.66667%}.col-md-offset-4{margin-left:33.33333%}.col-md-6,.row.cols-md-6>*{max-width:50%;flex-basis:50%}.col-md-offset-5{margin-left:41.66667%}.col-md-7,.row.cols-md-7>*{max-width:58.33333%;flex-basis:58.33333%}.col-md-offset-6{margin-left:50%}.col-md-8,.row.cols-md-8>*{max-width:66.66667%;flex-basis:66.66667%}.col-md-offset-7{margin-left:58.33333%}.col-md-9,.row.cols-md-9>*{max-width:75%;flex-basis:75%}.col-md-offset-8{margin-left:66.66667%}.col-md-10,.row.cols-md-10>*{max-width:83.33333%;flex-basis:83.33333%}.col-md-offset-9{margin-left:75%}.col-md-11,.row.cols-md-11>*{max-width:91.66667%;flex-basis:91.66667%}.col-md-offset-10{margin-left:83.33333%}.col-md-12,.row.cols-md-12>*{max-width:100%;flex-basis:100%}.col-md-offset-11{margin-left:91.66667%}.col-md-normal{order:initial}.col-md-first{order:-999}.col-md-last{order:999}}@media screen and (min-width: 1280px){.col-lg,[class^='col-lg-'],[class^='col-lg-offset-'],.row[class*='cols-lg-']>*{box-sizing:border-box;flex:0 0 auto;padding:0 calc(var(--universal-padding) / 2)}.col-lg,.row.cols-lg>*{max-width:100%;flex-grow:1;flex-basis:0}.col-lg-1,.row.cols-lg-1>*{max-width:8.33333%;flex-basis:8.33333%}.col-lg-offset-0{margin-left:0}.col-lg-2,.row.cols-lg-2>*{max-width:16.66667%;flex-basis:16.66667%}.col-lg-offset-1{margin-left:8.33333%}.col-lg-3,.row.cols-lg-3>*{max-width:25%;flex-basis:25%}.col-lg-offset-2{margin-left:16.66667%}.col-lg-4,.row.cols-lg-4>*{max-width:33.33333%;flex-basis:33.33333%}.col-lg-offset-3{margin-left:25%}.col-lg-5,.row.cols-lg-5>*{max-width:41.66667%;flex-basis:41.66667%}.col-lg-offset-4{margin-left:33.33333%}.col-lg-6,.row.cols-lg-6>*{max-width:50%;flex-basis:50%}.col-lg-offset-5{margin-left:41.66667%}.col-lg-7,.row.cols-lg-7>*{max-width:58.33333%;flex-basis:58.33333%}.col-lg-offset-6{margin-left:50%}.col-lg-8,.row.cols-lg-8>*{max-width:66.66667%;flex-basis:66.66667%}.col-lg-offset-7{margin-left:58.33333%}.col-lg-9,.row.cols-lg-9>*{max-width:75%;flex-basis:75%}.col-lg-offset-8{margin-left:66.66667%}.col-lg-10,.row.cols-lg-10>*{max-width:83.33333%;flex-basis:83.33333%}.col-lg-offset-9{margin-left:75%}.col-lg-11,.row.cols-lg-11>*{max-width:91.66667%;flex-basis:91.66667%}.col-lg-offset-10{margin-left:83.33333%}.col-lg-12,.row.cols-lg-12>*{max-width:100%;flex-basis:100%}.col-lg-offset-11{margin-left:91.66667%}.col-lg-normal{order:initial}.col-lg-first{order:-999}.col-lg-last{order:999}}:root{--card-back-color:#f8f8f8;--card-fore-color:#111;--card-border-color:#ddd}.card{display:flex;flex-direction:column;justify-content:space-between;align-self:center;position:relative;width:100%;background:var(--card-back-color);color:var(--card-fore-color);border:.0625rem solid var(--card-border-color);border-radius:var(--universal-border-radius);margin:var(--universal-margin);overflow:hidden}@media screen and (min-width: 320px){.card{max-width:320px}}.card>.section{background:var(--card-back-color);color:var(--card-fore-color);box-sizing:border-box;margin:0;border:0;border-radius:0;border-bottom:.0625rem solid var(--card-border-color);padding:var(--universal-padding);width:100%}.card>.section.media{height:200px;padding:0;-o-object-fit:cover;object-fit:cover}.card>.section:last-child{border-bottom:0}@media screen and (min-width: 240px){.card.small{max-width:240px}}@media screen and (min-width: 480px){.card.large{max-width:480px}}.card.fluid{max-width:100%;width:auto}.card.warning{--card-back-color:#ffca28;--card-border-color:#e8b825}.card.error{--card-back-color:#b71c1c;--card-fore-color:#f8f8f8;--card-border-color:#a71a1a}.card>.section.dark{--card-back-color:#e0e0e0}.card>.section.double-padded{padding:calc(1.5 * var(--universal-padding))}:root{--form-back-color:#f0f0f0;--form-fore-color:#111;--form-border-color:#ddd;--input-back-color:#f8f8f8;--input-fore-color:#111;--input-border-color:#ddd;--input-focus-color:#0288d1;--input-invalid-color:#d32f2f;--button-back-color:#e2e2e2;--button-hover-back-color:#dcdcdc;--button-fore-color:#212121;--button-border-color:transparent;--button-hover-border-color:transparent;--button-group-border-color:rgba(124,124,124,0.54)}form{background:var(--form-back-color);color:var(--form-fore-color);border:.0625rem solid var(--form-border-color);border-radius:var(--universal-border-radius);margin:var(--universal-margin);padding:calc(2 * var(--universal-padding)) var(--universal-padding)}fieldset{border:.0625rem solid var(--form-border-color);border-radius:var(--universal-border-radius);margin:calc(var(--universal-margin) / 4);padding:var(--universal-padding)}legend{box-sizing:border-box;display:table;max-width:100%;white-space:normal;font-weight:700;padding:calc(var(--universal-padding) / 2)}label{padding:calc(var(--universal-padding) / 2) var(--universal-padding)}.input-group{display:inline-block}.input-group.fluid{display:flex;align-items:center;justify-content:center}.input-group.fluid>input{max-width:100%;flex-grow:1;flex-basis:0px}@media screen and (max-width: 767px){.input-group.fluid{align-items:stretch;flex-direction:column}}.input-group.vertical{display:flex;align-items:stretch;flex-direction:column}.input-group.vertical>input{max-width:100%;flex-grow:1;flex-basis:0px}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}input:not([type]),[type="text"],[type="email"],[type="number"],[type="search"],[type="password"],[type="url"],[type="tel"],[type="checkbox"],[type="radio"],textarea,select{box-sizing:border-box;background:var(--input-back-color);color:var(--input-fore-color);border:.0625rem solid var(--input-border-color);border-radius:var(--universal-border-radius);margin:calc(var(--universal-margin) / 2);padding:var(--universal-padding) calc(1.5 * var(--universal-padding))}input:not([type="button"]):not([type="submit"]):not([type="reset"]):hover,input:not([type="button"]):not([type="submit"]):not([type="reset"]):focus,textarea:hover,textarea:focus,select:hover,select:focus{border-color:var(--input-focus-color);box-shadow:none}input:not([type="button"]):not([type="submit"]):not([type="reset"]):invalid,input:not([type="button"]):not([type="submit"]):not([type="reset"]):focus:invalid,textarea:invalid,textarea:focus:invalid,select:invalid,select:focus:invalid{border-color:var(--input-invalid-color);box-shadow:none}input:not([type="button"]):not([type="submit"]):not([type="reset"])[readonly],textarea[readonly],select[readonly]{background:var(--secondary-back-color)}select{max-width:100%}option{overflow:hidden;text-overflow:ellipsis}[type="checkbox"],[type="radio"]{-webkit-appearance:none;-moz-appearance:none;appearance:none;position:relative;height:calc(1rem + var(--universal-padding) / 2);width:calc(1rem + var(--universal-padding) / 2);vertical-align:text-bottom;padding:0;flex-basis:calc(1rem + var(--universal-padding) / 2) !important;flex-grow:0 !important}[type="checkbox"]:checked:before,[type="radio"]:checked:before{position:absolute}[type="checkbox"]:checked:before{content:'\2713';font-family:sans-serif;font-size:calc(1rem + var(--universal-padding) / 2);top:calc(0rem - var(--universal-padding));left:calc(var(--universal-padding) / 4)}[type="radio"]{border-radius:100%}[type="radio"]:checked:before{border-radius:100%;content:'';top:calc(.0625rem + var(--universal-padding) / 2);left:calc(.0625rem + var(--universal-padding) / 2);background:var(--input-fore-color);width:0.5rem;height:0.5rem}:placeholder-shown{color:var(--input-fore-color)}::-ms-placeholder{color:var(--input-fore-color);opacity:0.54}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button{overflow:visible;text-transform:none}button,[type="button"],[type="submit"],[type="reset"],a.button,label.button,.button,a[role="button"],label[role="button"],[role="button"]{display:inline-block;background:var(--button-back-color);color:var(--button-fore-color);border:.0625rem solid var(--button-border-color);border-radius:var(--universal-border-radius);padding:var(--universal-padding) calc(1.5 * var(--universal-padding));margin:var(--universal-margin);text-decoration:none;cursor:pointer;transition:background 0.3s}button:hover,button:focus,[type="button"]:hover,[type="button"]:focus,[type="submit"]:hover,[type="submit"]:focus,[type="reset"]:hover,[type="reset"]:focus,a.button:hover,a.button:focus,label.button:hover,label.button:focus,.button:hover,.button:focus,a[role="button"]:hover,a[role="button"]:focus,label[role="button"]:hover,label[role="button"]:focus,[role="button"]:hover,[role="button"]:focus{background:var(--button-hover-back-color);border-color:var(--button-hover-border-color)}input:disabled,input[disabled],textarea:disabled,textarea[disabled],select:disabled,select[disabled],button:disabled,button[disabled],.button:disabled,.button[disabled],[role="button"]:disabled,[role="button"][disabled]{cursor:not-allowed;opacity:.75}.button-group{display:flex;border:.0625rem solid var(--button-group-border-color);border-radius:var(--universal-border-radius);margin:var(--universal-margin)}.button-group>button,.button-group [type="button"],.button-group>[type="submit"],.button-group>[type="reset"],.button-group>.button,.button-group>[role="button"]{margin:0;max-width:100%;flex:1 1 auto;text-align:center;border:0;border-radius:0;box-shadow:none}.button-group>:not(:first-child){border-left:.0625rem solid var(--button-group-border-color)}@media screen and (max-width: 767px){.button-group{flex-direction:column}.button-group>:not(:first-child){border:0;border-top:.0625rem solid var(--button-group-border-color)}}button.primary,[type="button"].primary,[type="submit"].primary,[type="reset"].primary,.button.primary,[role="button"].primary{--button-back-color:#1976d2;--button-fore-color:#f8f8f8}button.primary:hover,button.primary:focus,[type="button"].primary:hover,[type="button"].primary:focus,[type="submit"].primary:hover,[type="submit"].primary:focus,[type="reset"].primary:hover,[type="reset"].primary:focus,.button.primary:hover,.button.primary:focus,[role="button"].primary:hover,[role="button"].primary:focus{--button-hover-back-color:#1565c0}button.secondary,[type="button"].secondary,[type="submit"].secondary,[type="reset"].secondary,.button.secondary,[role="button"].secondary{--button-back-color:#d32f2f;--button-fore-color:#f8f8f8}button.secondary:hover,button.secondary:focus,[type="button"].secondary:hover,[type="button"].secondary:focus,[type="submit"].secondary:hover,[type="submit"].secondary:focus,[type="reset"].secondary:hover,[type="reset"].secondary:focus,.button.secondary:hover,.button.secondary:focus,[role="button"].secondary:hover,[role="button"].secondary:focus{--button-hover-back-color:#c62828}button.tertiary,[type="button"].tertiary,[type="submit"].tertiary,[type="reset"].tertiary,.button.tertiary,[role="button"].tertiary{--button-back-color:#308732;--button-fore-color:#f8f8f8}button.tertiary:hover,button.tertiary:focus,[type="button"].tertiary:hover,[type="button"].tertiary:focus,[type="submit"].tertiary:hover,[type="submit"].tertiary:focus,[type="reset"].tertiary:hover,[type="reset"].tertiary:focus,.button.tertiary:hover,.button.tertiary:focus,[role="button"].tertiary:hover,[role="button"].tertiary:focus{--button-hover-back-color:#277529}button.inverse,[type="button"].inverse,[type="submit"].inverse,[type="reset"].inverse,.button.inverse,[role="button"].inverse{--button-back-color:#212121;--button-fore-color:#f8f8f8}button.inverse:hover,button.inverse:focus,[type="button"].inverse:hover,[type="button"].inverse:focus,[type="submit"].inverse:hover,[type="submit"].inverse:focus,[type="reset"].inverse:hover,[type="reset"].inverse:focus,.button.inverse:hover,.button.inverse:focus,[role="button"].inverse:hover,[role="button"].inverse:focus{--button-hover-back-color:#111}button.small,[type="button"].small,[type="submit"].small,[type="reset"].small,.button.small,[role="button"].small{padding:calc(0.5 * var(--universal-padding)) calc(0.75 * var(--universal-padding));margin:var(--universal-margin)}button.large,[type="button"].large,[type="submit"].large,[type="reset"].large,.button.large,[role="button"].large{padding:calc(1.5 * var(--universal-padding)) calc(2 * var(--universal-padding));margin:var(--universal-margin)}:root{--header-back-color:#f8f8f8;--header-hover-back-color:#f0f0f0;--header-fore-color:#444;--header-border-color:#ddd;--nav-back-color:#f8f8f8;--nav-hover-back-color:#f0f0f0;--nav-fore-color:#444;--nav-border-color:#ddd;--nav-link-color:#0277bd;--footer-fore-color:#444;--footer-back-color:#f8f8f8;--footer-border-color:#ddd;--footer-link-color:#0277bd;--drawer-back-color:#f8f8f8;--drawer-hover-back-color:#f0f0f0;--drawer-border-color:#ddd;--drawer-close-color:#444}header{height:3.1875rem;background:var(--header-back-color);color:var(--header-fore-color);border-bottom:.0625rem solid var(--header-border-color);padding:calc(var(--universal-padding) / 4) 0;white-space:nowrap;overflow-x:auto;overflow-y:hidden}header.row{box-sizing:content-box}header .logo{color:var(--header-fore-color);font-size:1.75rem;padding:var(--universal-padding) calc(2 * var(--universal-padding));text-decoration:none}header button,header [type="button"],header .button,header [role="button"]{box-sizing:border-box;position:relative;top:calc(0rem - var(--universal-padding) / 4);height:calc(3.1875rem + var(--universal-padding) / 2);background:var(--header-back-color);line-height:calc(3.1875rem - var(--universal-padding) * 1.5);text-align:center;color:var(--header-fore-color);border:0;border-radius:0;margin:0;text-transform:uppercase}header button:hover,header button:focus,header [type="button"]:hover,header [type="button"]:focus,header .button:hover,header .button:focus,header [role="button"]:hover,header [role="button"]:focus{background:var(--header-hover-back-color)}nav{background:var(--nav-back-color);color:var(--nav-fore-color);border:.0625rem solid var(--nav-border-color);border-radius:var(--universal-border-radius);margin:var(--universal-margin)}nav *{padding:var(--universal-padding) calc(1.5 * var(--universal-padding))}nav a,nav a:visited{display:block;color:var(--nav-link-color);border-radius:var(--universal-border-radius);transition:background 0.3s}nav a:hover,nav a:focus,nav a:visited:hover,nav a:visited:focus{text-decoration:none;background:var(--nav-hover-back-color)}nav .sublink-1{position:relative;margin-left:calc(2 * var(--universal-padding))}nav .sublink-1:before{position:absolute;left:calc(var(--universal-padding) - 1 * var(--universal-padding));top:-.0625rem;content:'';height:100%;border:.0625rem solid var(--nav-border-color);border-left:0}nav .sublink-2{position:relative;margin-left:calc(4 * var(--universal-padding))}nav .sublink-2:before{position:absolute;left:calc(var(--universal-padding) - 3 * var(--universal-padding));top:-.0625rem;content:'';height:100%;border:.0625rem solid var(--nav-border-color);border-left:0}footer{background:var(--footer-back-color);color:var(--footer-fore-color);border-top:.0625rem solid var(--footer-border-color);padding:calc(2 * var(--universal-padding)) var(--universal-padding);font-size:.875rem}footer a,footer a:visited{color:var(--footer-link-color)}header.sticky{position:-webkit-sticky;position:sticky;z-index:1101;top:0}footer.sticky{position:-webkit-sticky;position:sticky;z-index:1101;bottom:0}.drawer-toggle:before{display:inline-block;position:relative;vertical-align:bottom;content:'\00a0\2261\00a0';font-family:sans-serif;font-size:1.5em}@media screen and (min-width: 768px){.drawer-toggle:not(.persistent){display:none}}[type="checkbox"].drawer{height:1px;width:1px;margin:-1px;overflow:hidden;position:absolute;clip:rect(0 0 0 0);-webkit-clip-path:inset(100%);clip-path:inset(100%)}[type="checkbox"].drawer+*{display:block;box-sizing:border-box;position:fixed;top:0;width:320px;height:100vh;overflow-y:auto;background:var(--drawer-back-color);border:.0625rem solid var(--drawer-border-color);border-radius:0;margin:0;z-index:1110;left:-320px;transition:left 0.3s}[type="checkbox"].drawer+* .drawer-close{position:absolute;top:var(--universal-margin);right:var(--universal-margin);z-index:1111;width:2rem;height:2rem;border-radius:var(--universal-border-radius);padding:var(--universal-padding);margin:0;cursor:pointer;transition:background 0.3s}[type="checkbox"].drawer+* .drawer-close:before{display:block;content:'\00D7';color:var(--drawer-close-color);position:relative;font-family:sans-serif;font-size:2rem;line-height:1;text-align:center}[type="checkbox"].drawer+* .drawer-close:hover,[type="checkbox"].drawer+* .drawer-close:focus{background:var(--drawer-hover-back-color)}@media screen and (max-width: 320px){[type="checkbox"].drawer+*{width:100%}}[type="checkbox"].drawer:checked+*{left:0}@media screen and (min-width: 768px){[type="checkbox"].drawer:not(.persistent)+*{position:static;height:100%;z-index:1100}[type="checkbox"].drawer:not(.persistent)+* .drawer-close{display:none}}:root{--mark-back-color:#0277bd;--mark-fore-color:#fafafa}mark{background:var(--mark-back-color);color:var(--mark-fore-color);font-size:.95em;line-height:1em;border-radius:var(--universal-border-radius);padding:calc(var(--universal-padding) / 4) calc(var(--universal-padding) / 2)}mark.inline-block{display:inline-block;font-size:1em;line-height:1.5;padding:calc(var(--universal-padding) / 2) var(--universal-padding)}:root{--toast-back-color:#424242;--toast-fore-color:#fafafa}.toast{position:fixed;bottom:calc(var(--universal-margin) * 3);left:50%;transform:translate(-50%, -50%);z-index:1111;color:var(--toast-fore-color);background:var(--toast-back-color);border-radius:calc(var(--universal-border-radius) * 16);padding:var(--universal-padding) calc(var(--universal-padding) * 3)}:root{--tooltip-back-color:#212121;--tooltip-fore-color:#fafafa}.tooltip{position:relative;display:inline-block}.tooltip:before,.tooltip:after{position:absolute;opacity:0;clip:rect(0 0 0 0);-webkit-clip-path:inset(100%);clip-path:inset(100%);transition:all 0.3s;z-index:1010;left:50%}.tooltip:not(.bottom):before,.tooltip:not(.bottom):after{bottom:75%}.tooltip.bottom:before,.tooltip.bottom:after{top:75%}.tooltip:hover:before,.tooltip:hover:after,.tooltip:focus:before,.tooltip:focus:after{opacity:1;clip:auto;-webkit-clip-path:inset(0%);clip-path:inset(0%)}.tooltip:before{content:'';background:transparent;border:var(--universal-margin) solid transparent;left:calc(50% - var(--universal-margin))}.tooltip:not(.bottom):before{border-top-color:#212121}.tooltip.bottom:before{border-bottom-color:#212121}.tooltip:after{content:attr(aria-label);color:var(--tooltip-fore-color);background:var(--tooltip-back-color);border-radius:var(--universal-border-radius);padding:var(--universal-padding);white-space:nowrap;transform:translateX(-50%)}.tooltip:not(.bottom):after{margin-bottom:calc(2 * var(--universal-margin))}.tooltip.bottom:after{margin-top:calc(2 * var(--universal-margin))}:root{--modal-overlay-color:rgba(0,0,0,0.45);--modal-close-color:#444;--modal-close-hover-color:#f0f0f0}[type="checkbox"].modal{height:1px;width:1px;margin:-1px;overflow:hidden;position:absolute;clip:rect(0 0 0 0);-webkit-clip-path:inset(100%);clip-path:inset(100%)}[type="checkbox"].modal+div{position:fixed;top:0;left:0;display:none;width:100vw;height:100vh;background:var(--modal-overlay-color)}[type="checkbox"].modal+div .card{margin:0 auto;max-height:50vh;overflow:auto}[type="checkbox"].modal+div .card .modal-close{position:absolute;top:0;right:0;width:1.75rem;height:1.75rem;border-radius:var(--universal-border-radius);padding:var(--universal-padding);margin:0;cursor:pointer;transition:background 0.3s}[type="checkbox"].modal+div .card .modal-close:before{display:block;content:'\00D7';color:var(--modal-close-color);position:relative;font-family:sans-serif;font-size:1.75rem;line-height:1;text-align:center}[type="checkbox"].modal+div .card .modal-close:hover,[type="checkbox"].modal+div .card .modal-close:focus{background:var(--modal-close-hover-color)}[type="checkbox"].modal:checked+div{display:flex;flex:0 1 auto;z-index:1200}[type="checkbox"].modal:checked+div .card .modal-close{z-index:1211}:root{--collapse-label-back-color:#e8e8e8;--collapse-label-fore-color:#212121;--collapse-label-hover-back-color:#f0f0f0;--collapse-selected-label-back-color:#ececec;--collapse-border-color:#ddd;--collapse-content-back-color:#fafafa;--collapse-selected-label-border-color:#0277bd}.collapse{width:calc(100% - 2 * var(--universal-margin));opacity:1;display:flex;flex-direction:column;margin:var(--universal-margin);border-radius:var(--universal-border-radius)}.collapse>[type="radio"],.collapse>[type="checkbox"]{height:1px;width:1px;margin:-1px;overflow:hidden;position:absolute;clip:rect(0 0 0 0);-webkit-clip-path:inset(100%);clip-path:inset(100%)}.collapse>label{flex-grow:1;display:inline-block;height:1.5rem;cursor:pointer;transition:background 0.3s;color:var(--collapse-label-fore-color);background:var(--collapse-label-back-color);border:.0625rem solid var(--collapse-border-color);padding:calc(1.5 * var(--universal-padding))}.collapse>label:hover,.collapse>label:focus{background:var(--collapse-label-hover-back-color)}.collapse>label+div{flex-basis:auto;height:1px;width:1px;margin:-1px;overflow:hidden;position:absolute;clip:rect(0 0 0 0);-webkit-clip-path:inset(100%);clip-path:inset(100%);transition:max-height 0.3s;max-height:1px}.collapse>:checked+label{background:var(--collapse-selected-label-back-color);border-bottom-color:var(--collapse-selected-label-border-color)}.collapse>:checked+label+div{box-sizing:border-box;position:relative;width:100%;height:auto;overflow:auto;margin:0;background:var(--collapse-content-back-color);border:.0625rem solid var(--collapse-border-color);border-top:0;padding:var(--universal-padding);clip:auto;-webkit-clip-path:inset(0%);clip-path:inset(0%);max-height:400px}.collapse>label:not(:first-of-type){border-top:0}.collapse>label:first-of-type{border-radius:var(--universal-border-radius) var(--universal-border-radius) 0 0}.collapse>label:last-of-type{border-radius:0 0 var(--universal-border-radius) var(--universal-border-radius)}.collapse>:checked:last-of-type+label{border-radius:0}.collapse>:checked:last-of-type+label+div{border-radius:0 0 var(--universal-border-radius) var(--universal-border-radius)}mark.secondary{--mark-back-color:#d32f2f}mark.tertiary{--mark-back-color:#308732}mark.tag{padding:calc(var(--universal-padding)/2) var(--universal-padding);border-radius:1em}html,*{font-family:'Poppins', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, "Helvetica Neue", Helvetica, sans-serif}code,pre,kbd,code *,pre *,kbd *,code[class*="language-"],pre[class*="language-"]{font-family:'Inconsolata', Menlo, Consolas, monospace !important}code,kbd{font-size:1em}code{transform:scale(1)}pre{font-size:1rem;border:0.0625rem solid var(--secondary-border-color);border-radius:var(--universal-border-radius)}.group{position:relative;margin-top:2em;margin-bottom:-1em}.search{font-size:14px;margin-top:-.1em;display:block;width:100%;border:none;border-bottom:1px solid var(--nav-link-color)}.search:focus{outline:none}label#search-label{color:var(--nav-link-color);font-size:18px;font-weight:400;position:absolute;left:5px;top:10px}.search:focus ~ label#search-label,.search:valid ~ label#search-label{top:-20px;font-size:14px;color:var(--nav-link-color)}label#menu-toggle{width:3.4375rem}header h1.logo{margin-top:-0.8rem;text-align:center}header h1.logo a{text-decoration:none;color:#111}header #title{position:relative;top:-1rem}@media screen and (max-width: 500px){header #title{font-size:1rem;display:block}}header h1 small{display:block;font-size:0.875rem;font-style:italic;color:#888;margin-top:-0.8rem}@media screen and (max-width: 768px){header h1 small{font-size:0.75rem}}@media screen and (max-width: 600px){header h1 small{font-size:0.625rem}}@media screen and (max-width: 500px){header h1 small{font-size:0.5rem;margin-top:-1.2rem}}label#menu-toggle{position:absolute;left:0.5rem;top:0.5rem;width:3.4375rem}.card{box-shadow:0 0.25rem 0.25rem 0 rgba(0,0,0,0.125),0 0.125rem 0.125rem -0.125rem rgba(0,0,0,0.25)}main{padding:0}.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string{background:none !important}
+:root{--fore-color:#111;--secondary-fore-color:#444;--back-color:#f8f8f8;--secondary-back-color:#f0f0f0;--blockquote-color:#f57c00;--pre-color:#1565c0;--border-color:#aaa;--secondary-border-color:#ddd;--heading-ratio:1.19;--universal-margin:.5rem;--universal-padding:.5rem;--universal-border-radius:.125rem;--a-link-color:#0277bd;--a-visited-color:#01579b}html{font-size:16px}a,b,del,em,i,ins,q,span,strong,u{font-size:1em}html,*{font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, "Helvetica Neue", Helvetica, sans-serif;line-height:1.5;-webkit-text-size-adjust:100%}*{font-size:1rem}body{margin:0;color:var(--fore-color);background:var(--back-color)}details{display:block}summary{display:list-item}abbr[title]{border-bottom:none;text-decoration:underline dotted}input{overflow:visible}img{max-width:100%;height:auto}h1,h2,h3,h4,h5,h6{line-height:1.2;margin:calc(1.5 * var(--universal-margin)) var(--universal-margin);font-weight:500}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:var(--secondary-fore-color);display:block;margin-top:-.25rem}h1{font-size:calc(1rem * var(--heading-ratio) * var(--heading-ratio) * var(--heading-ratio) * var(--heading-ratio))}h2{font-size:calc(1rem * var(--heading-ratio) * var(--heading-ratio) * var(--heading-ratio))}h3{font-size:calc(1rem * var(--heading-ratio) * var(--heading-ratio))}h4{font-size:calc(1rem * var(--heading-ratio))}h5{font-size:1rem}h6{font-size:calc(1rem / var(--heading-ratio))}p{margin:var(--universal-margin)}ol,ul{margin:var(--universal-margin);padding-left:calc(2 * var(--universal-margin))}b,strong{font-weight:700}hr{box-sizing:content-box;border:0;line-height:1.25em;margin:var(--universal-margin);height:.0625rem;background:linear-gradient(to right, transparent, var(--border-color) 20%, var(--border-color) 80%, transparent)}blockquote{display:block;position:relative;font-style:italic;color:var(--secondary-fore-color);margin:var(--universal-margin);padding:calc(3 * var(--universal-padding));border:.0625rem solid var(--secondary-border-color);border-left:.375rem solid var(--blockquote-color);border-radius:0 var(--universal-border-radius) var(--universal-border-radius) 0}blockquote:before{position:absolute;top:calc(0rem - var(--universal-padding));left:0;font-family:sans-serif;font-size:3rem;font-weight:700;content:"\201c";color:var(--blockquote-color)}blockquote[cite]:after{font-style:normal;font-size:.75em;font-weight:700;content:"\a— " attr(cite);white-space:pre}code,kbd,pre,samp{font-family:Menlo, Consolas, monospace;font-size:.85em}code{background:var(--secondary-back-color);border-radius:var(--universal-border-radius);padding:calc(var(--universal-padding) / 4) calc(var(--universal-padding) / 2)}kbd{background:var(--fore-color);color:var(--back-color);border-radius:var(--universal-border-radius);padding:calc(var(--universal-padding) / 4) calc(var(--universal-padding) / 2)}pre{overflow:auto;background:var(--secondary-back-color);padding:calc(1.5 * var(--universal-padding));margin:var(--universal-margin);border:.0625rem solid var(--secondary-border-color);border-left:.25rem solid var(--pre-color);border-radius:0 var(--universal-border-radius) var(--universal-border-radius) 0}sup,sub,code,kbd{line-height:0;position:relative;vertical-align:baseline}small,sup,sub,figcaption{font-size:.75em}sup{top:-.5em}sub{bottom:-.25em}figure{margin:var(--universal-margin)}figcaption{color:var(--secondary-fore-color)}a{text-decoration:none}a:link{color:var(--a-link-color)}a:visited{color:var(--a-visited-color)}a:hover,a:focus{text-decoration:underline}.container{margin:0 auto;padding:0 calc(1.5 * var(--universal-padding))}.row{box-sizing:border-box;display:flex;flex:0 1 auto;flex-flow:row wrap}.col-sm,[class^='col-sm-'],[class^='col-sm-offset-'],.row[class*='cols-sm-']>*{box-sizing:border-box;flex:0 0 auto;padding:0 calc(var(--universal-padding) / 2)}.col-sm,.row.cols-sm>*{max-width:100%;flex-grow:1;flex-basis:0}.col-sm-1,.row.cols-sm-1>*{max-width:8.33333%;flex-basis:8.33333%}.col-sm-offset-0{margin-left:0}.col-sm-2,.row.cols-sm-2>*{max-width:16.66667%;flex-basis:16.66667%}.col-sm-offset-1{margin-left:8.33333%}.col-sm-3,.row.cols-sm-3>*{max-width:25%;flex-basis:25%}.col-sm-offset-2{margin-left:16.66667%}.col-sm-4,.row.cols-sm-4>*{max-width:33.33333%;flex-basis:33.33333%}.col-sm-offset-3{margin-left:25%}.col-sm-5,.row.cols-sm-5>*{max-width:41.66667%;flex-basis:41.66667%}.col-sm-offset-4{margin-left:33.33333%}.col-sm-6,.row.cols-sm-6>*{max-width:50%;flex-basis:50%}.col-sm-offset-5{margin-left:41.66667%}.col-sm-7,.row.cols-sm-7>*{max-width:58.33333%;flex-basis:58.33333%}.col-sm-offset-6{margin-left:50%}.col-sm-8,.row.cols-sm-8>*{max-width:66.66667%;flex-basis:66.66667%}.col-sm-offset-7{margin-left:58.33333%}.col-sm-9,.row.cols-sm-9>*{max-width:75%;flex-basis:75%}.col-sm-offset-8{margin-left:66.66667%}.col-sm-10,.row.cols-sm-10>*{max-width:83.33333%;flex-basis:83.33333%}.col-sm-offset-9{margin-left:75%}.col-sm-11,.row.cols-sm-11>*{max-width:91.66667%;flex-basis:91.66667%}.col-sm-offset-10{margin-left:83.33333%}.col-sm-12,.row.cols-sm-12>*{max-width:100%;flex-basis:100%}.col-sm-offset-11{margin-left:91.66667%}.col-sm-normal{order:initial}.col-sm-first{order:-999}.col-sm-last{order:999}@media screen and (min-width: 768px){.col-md,[class^='col-md-'],[class^='col-md-offset-'],.row[class*='cols-md-']>*{box-sizing:border-box;flex:0 0 auto;padding:0 calc(var(--universal-padding) / 2)}.col-md,.row.cols-md>*{max-width:100%;flex-grow:1;flex-basis:0}.col-md-1,.row.cols-md-1>*{max-width:8.33333%;flex-basis:8.33333%}.col-md-offset-0{margin-left:0}.col-md-2,.row.cols-md-2>*{max-width:16.66667%;flex-basis:16.66667%}.col-md-offset-1{margin-left:8.33333%}.col-md-3,.row.cols-md-3>*{max-width:25%;flex-basis:25%}.col-md-offset-2{margin-left:16.66667%}.col-md-4,.row.cols-md-4>*{max-width:33.33333%;flex-basis:33.33333%}.col-md-offset-3{margin-left:25%}.col-md-5,.row.cols-md-5>*{max-width:41.66667%;flex-basis:41.66667%}.col-md-offset-4{margin-left:33.33333%}.col-md-6,.row.cols-md-6>*{max-width:50%;flex-basis:50%}.col-md-offset-5{margin-left:41.66667%}.col-md-7,.row.cols-md-7>*{max-width:58.33333%;flex-basis:58.33333%}.col-md-offset-6{margin-left:50%}.col-md-8,.row.cols-md-8>*{max-width:66.66667%;flex-basis:66.66667%}.col-md-offset-7{margin-left:58.33333%}.col-md-9,.row.cols-md-9>*{max-width:75%;flex-basis:75%}.col-md-offset-8{margin-left:66.66667%}.col-md-10,.row.cols-md-10>*{max-width:83.33333%;flex-basis:83.33333%}.col-md-offset-9{margin-left:75%}.col-md-11,.row.cols-md-11>*{max-width:91.66667%;flex-basis:91.66667%}.col-md-offset-10{margin-left:83.33333%}.col-md-12,.row.cols-md-12>*{max-width:100%;flex-basis:100%}.col-md-offset-11{margin-left:91.66667%}.col-md-normal{order:initial}.col-md-first{order:-999}.col-md-last{order:999}}@media screen and (min-width: 1280px){.col-lg,[class^='col-lg-'],[class^='col-lg-offset-'],.row[class*='cols-lg-']>*{box-sizing:border-box;flex:0 0 auto;padding:0 calc(var(--universal-padding) / 2)}.col-lg,.row.cols-lg>*{max-width:100%;flex-grow:1;flex-basis:0}.col-lg-1,.row.cols-lg-1>*{max-width:8.33333%;flex-basis:8.33333%}.col-lg-offset-0{margin-left:0}.col-lg-2,.row.cols-lg-2>*{max-width:16.66667%;flex-basis:16.66667%}.col-lg-offset-1{margin-left:8.33333%}.col-lg-3,.row.cols-lg-3>*{max-width:25%;flex-basis:25%}.col-lg-offset-2{margin-left:16.66667%}.col-lg-4,.row.cols-lg-4>*{max-width:33.33333%;flex-basis:33.33333%}.col-lg-offset-3{margin-left:25%}.col-lg-5,.row.cols-lg-5>*{max-width:41.66667%;flex-basis:41.66667%}.col-lg-offset-4{margin-left:33.33333%}.col-lg-6,.row.cols-lg-6>*{max-width:50%;flex-basis:50%}.col-lg-offset-5{margin-left:41.66667%}.col-lg-7,.row.cols-lg-7>*{max-width:58.33333%;flex-basis:58.33333%}.col-lg-offset-6{margin-left:50%}.col-lg-8,.row.cols-lg-8>*{max-width:66.66667%;flex-basis:66.66667%}.col-lg-offset-7{margin-left:58.33333%}.col-lg-9,.row.cols-lg-9>*{max-width:75%;flex-basis:75%}.col-lg-offset-8{margin-left:66.66667%}.col-lg-10,.row.cols-lg-10>*{max-width:83.33333%;flex-basis:83.33333%}.col-lg-offset-9{margin-left:75%}.col-lg-11,.row.cols-lg-11>*{max-width:91.66667%;flex-basis:91.66667%}.col-lg-offset-10{margin-left:83.33333%}.col-lg-12,.row.cols-lg-12>*{max-width:100%;flex-basis:100%}.col-lg-offset-11{margin-left:91.66667%}.col-lg-normal{order:initial}.col-lg-first{order:-999}.col-lg-last{order:999}}:root{--card-back-color:#f8f8f8;--card-fore-color:#111;--card-border-color:#ddd}.card{display:flex;flex-direction:column;justify-content:space-between;align-self:center;position:relative;width:100%;background:var(--card-back-color);color:var(--card-fore-color);border:.0625rem solid var(--card-border-color);border-radius:var(--universal-border-radius);margin:var(--universal-margin);overflow:hidden}@media screen and (min-width: 320px){.card{max-width:320px}}.card>.section{background:var(--card-back-color);color:var(--card-fore-color);box-sizing:border-box;margin:0;border:0;border-radius:0;border-bottom:.0625rem solid var(--card-border-color);padding:var(--universal-padding);width:100%}.card>.section.media{height:200px;padding:0;-o-object-fit:cover;object-fit:cover}.card>.section:last-child{border-bottom:0}@media screen and (min-width: 240px){.card.small{max-width:240px}}@media screen and (min-width: 480px){.card.large{max-width:480px}}.card.fluid{max-width:100%;width:auto}.card.warning{--card-back-color:#ffca28;--card-border-color:#e8b825}.card.error{--card-back-color:#b71c1c;--card-fore-color:#f8f8f8;--card-border-color:#a71a1a}.card>.section.dark{--card-back-color:#e0e0e0}.card>.section.double-padded{padding:calc(1.5 * var(--universal-padding))}:root{--form-back-color:#f0f0f0;--form-fore-color:#111;--form-border-color:#ddd;--input-back-color:#f8f8f8;--input-fore-color:#111;--input-border-color:#ddd;--input-focus-color:#0288d1;--input-invalid-color:#d32f2f;--button-back-color:#e2e2e2;--button-hover-back-color:#dcdcdc;--button-fore-color:#212121;--button-border-color:transparent;--button-hover-border-color:transparent;--button-group-border-color:rgba(124,124,124,0.54)}form{background:var(--form-back-color);color:var(--form-fore-color);border:.0625rem solid var(--form-border-color);border-radius:var(--universal-border-radius);margin:var(--universal-margin);padding:calc(2 * var(--universal-padding)) var(--universal-padding)}fieldset{border:.0625rem solid var(--form-border-color);border-radius:var(--universal-border-radius);margin:calc(var(--universal-margin) / 4);padding:var(--universal-padding)}legend{box-sizing:border-box;display:table;max-width:100%;white-space:normal;font-weight:700;padding:calc(var(--universal-padding) / 2)}label{padding:calc(var(--universal-padding) / 2) var(--universal-padding)}.input-group{display:inline-block}.input-group.fluid{display:flex;align-items:center;justify-content:center}.input-group.fluid>input{max-width:100%;flex-grow:1;flex-basis:0px}@media screen and (max-width: 767px){.input-group.fluid{align-items:stretch;flex-direction:column}}.input-group.vertical{display:flex;align-items:stretch;flex-direction:column}.input-group.vertical>input{max-width:100%;flex-grow:1;flex-basis:0px}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}input:not([type]),[type="text"],[type="email"],[type="number"],[type="search"],[type="password"],[type="url"],[type="tel"],[type="checkbox"],[type="radio"],textarea,select{box-sizing:border-box;background:var(--input-back-color);color:var(--input-fore-color);border:.0625rem solid var(--input-border-color);border-radius:var(--universal-border-radius);margin:calc(var(--universal-margin) / 2);padding:var(--universal-padding) calc(1.5 * var(--universal-padding))}input:not([type="button"]):not([type="submit"]):not([type="reset"]):hover,input:not([type="button"]):not([type="submit"]):not([type="reset"]):focus,textarea:hover,textarea:focus,select:hover,select:focus{border-color:var(--input-focus-color);box-shadow:none}input:not([type="button"]):not([type="submit"]):not([type="reset"]):invalid,input:not([type="button"]):not([type="submit"]):not([type="reset"]):focus:invalid,textarea:invalid,textarea:focus:invalid,select:invalid,select:focus:invalid{border-color:var(--input-invalid-color);box-shadow:none}input:not([type="button"]):not([type="submit"]):not([type="reset"])[readonly],textarea[readonly],select[readonly]{background:var(--secondary-back-color)}select{max-width:100%}option{overflow:hidden;text-overflow:ellipsis}[type="checkbox"],[type="radio"]{-webkit-appearance:none;-moz-appearance:none;appearance:none;position:relative;height:calc(1rem + var(--universal-padding) / 2);width:calc(1rem + var(--universal-padding) / 2);vertical-align:text-bottom;padding:0;flex-basis:calc(1rem + var(--universal-padding) / 2) !important;flex-grow:0 !important}[type="checkbox"]:checked:before,[type="radio"]:checked:before{position:absolute}[type="checkbox"]:checked:before{content:'\2713';font-family:sans-serif;font-size:calc(1rem + var(--universal-padding) / 2);top:calc(0rem - var(--universal-padding));left:calc(var(--universal-padding) / 4)}[type="radio"]{border-radius:100%}[type="radio"]:checked:before{border-radius:100%;content:'';top:calc(.0625rem + var(--universal-padding) / 2);left:calc(.0625rem + var(--universal-padding) / 2);background:var(--input-fore-color);width:0.5rem;height:0.5rem}:placeholder-shown{color:var(--input-fore-color)}::-ms-placeholder{color:var(--input-fore-color);opacity:0.54}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button{overflow:visible;text-transform:none}button,[type="button"],[type="submit"],[type="reset"],a.button,label.button,.button,a[role="button"],label[role="button"],[role="button"]{display:inline-block;background:var(--button-back-color);color:var(--button-fore-color);border:.0625rem solid var(--button-border-color);border-radius:var(--universal-border-radius);padding:var(--universal-padding) calc(1.5 * var(--universal-padding));margin:var(--universal-margin);text-decoration:none;cursor:pointer;transition:background 0.3s}button:hover,button:focus,[type="button"]:hover,[type="button"]:focus,[type="submit"]:hover,[type="submit"]:focus,[type="reset"]:hover,[type="reset"]:focus,a.button:hover,a.button:focus,label.button:hover,label.button:focus,.button:hover,.button:focus,a[role="button"]:hover,a[role="button"]:focus,label[role="button"]:hover,label[role="button"]:focus,[role="button"]:hover,[role="button"]:focus{background:var(--button-hover-back-color);border-color:var(--button-hover-border-color)}input:disabled,input[disabled],textarea:disabled,textarea[disabled],select:disabled,select[disabled],button:disabled,button[disabled],.button:disabled,.button[disabled],[role="button"]:disabled,[role="button"][disabled]{cursor:not-allowed;opacity:.75}.button-group{display:flex;border:.0625rem solid var(--button-group-border-color);border-radius:var(--universal-border-radius);margin:var(--universal-margin)}.button-group>button,.button-group [type="button"],.button-group>[type="submit"],.button-group>[type="reset"],.button-group>.button,.button-group>[role="button"]{margin:0;max-width:100%;flex:1 1 auto;text-align:center;border:0;border-radius:0;box-shadow:none}.button-group>:not(:first-child){border-left:.0625rem solid var(--button-group-border-color)}@media screen and (max-width: 767px){.button-group{flex-direction:column}.button-group>:not(:first-child){border:0;border-top:.0625rem solid var(--button-group-border-color)}}button.primary,[type="button"].primary,[type="submit"].primary,[type="reset"].primary,.button.primary,[role="button"].primary{--button-back-color:#1976d2;--button-fore-color:#f8f8f8}button.primary:hover,button.primary:focus,[type="button"].primary:hover,[type="button"].primary:focus,[type="submit"].primary:hover,[type="submit"].primary:focus,[type="reset"].primary:hover,[type="reset"].primary:focus,.button.primary:hover,.button.primary:focus,[role="button"].primary:hover,[role="button"].primary:focus{--button-hover-back-color:#1565c0}button.secondary,[type="button"].secondary,[type="submit"].secondary,[type="reset"].secondary,.button.secondary,[role="button"].secondary{--button-back-color:#d32f2f;--button-fore-color:#f8f8f8}button.secondary:hover,button.secondary:focus,[type="button"].secondary:hover,[type="button"].secondary:focus,[type="submit"].secondary:hover,[type="submit"].secondary:focus,[type="reset"].secondary:hover,[type="reset"].secondary:focus,.button.secondary:hover,.button.secondary:focus,[role="button"].secondary:hover,[role="button"].secondary:focus{--button-hover-back-color:#c62828}button.tertiary,[type="button"].tertiary,[type="submit"].tertiary,[type="reset"].tertiary,.button.tertiary,[role="button"].tertiary{--button-back-color:#308732;--button-fore-color:#f8f8f8}button.tertiary:hover,button.tertiary:focus,[type="button"].tertiary:hover,[type="button"].tertiary:focus,[type="submit"].tertiary:hover,[type="submit"].tertiary:focus,[type="reset"].tertiary:hover,[type="reset"].tertiary:focus,.button.tertiary:hover,.button.tertiary:focus,[role="button"].tertiary:hover,[role="button"].tertiary:focus{--button-hover-back-color:#277529}button.inverse,[type="button"].inverse,[type="submit"].inverse,[type="reset"].inverse,.button.inverse,[role="button"].inverse{--button-back-color:#212121;--button-fore-color:#f8f8f8}button.inverse:hover,button.inverse:focus,[type="button"].inverse:hover,[type="button"].inverse:focus,[type="submit"].inverse:hover,[type="submit"].inverse:focus,[type="reset"].inverse:hover,[type="reset"].inverse:focus,.button.inverse:hover,.button.inverse:focus,[role="button"].inverse:hover,[role="button"].inverse:focus{--button-hover-back-color:#111}button.small,[type="button"].small,[type="submit"].small,[type="reset"].small,.button.small,[role="button"].small{padding:calc(0.5 * var(--universal-padding)) calc(0.75 * var(--universal-padding));margin:var(--universal-margin)}button.large,[type="button"].large,[type="submit"].large,[type="reset"].large,.button.large,[role="button"].large{padding:calc(1.5 * var(--universal-padding)) calc(2 * var(--universal-padding));margin:var(--universal-margin)}:root{--header-back-color:#f8f8f8;--header-hover-back-color:#f0f0f0;--header-fore-color:#444;--header-border-color:#ddd;--nav-back-color:#f8f8f8;--nav-hover-back-color:#f0f0f0;--nav-fore-color:#444;--nav-border-color:#ddd;--nav-link-color:#0277bd;--footer-fore-color:#444;--footer-back-color:#f8f8f8;--footer-border-color:#ddd;--footer-link-color:#0277bd;--drawer-back-color:#f8f8f8;--drawer-hover-back-color:#f0f0f0;--drawer-border-color:#ddd;--drawer-close-color:#444}header{height:3.1875rem;background:var(--header-back-color);color:var(--header-fore-color);border-bottom:.0625rem solid var(--header-border-color);padding:calc(var(--universal-padding) / 4) 0;white-space:nowrap;overflow-x:auto;overflow-y:hidden}header.row{box-sizing:content-box}header .logo{color:var(--header-fore-color);font-size:1.75rem;padding:var(--universal-padding) calc(2 * var(--universal-padding));text-decoration:none}header button,header [type="button"],header .button,header [role="button"]{box-sizing:border-box;position:relative;top:calc(0rem - var(--universal-padding) / 4);height:calc(3.1875rem + var(--universal-padding) / 2);background:var(--header-back-color);line-height:calc(3.1875rem - var(--universal-padding) * 1.5);text-align:center;color:var(--header-fore-color);border:0;border-radius:0;margin:0;text-transform:uppercase}header button:hover,header button:focus,header [type="button"]:hover,header [type="button"]:focus,header .button:hover,header .button:focus,header [role="button"]:hover,header [role="button"]:focus{background:var(--header-hover-back-color)}nav{background:var(--nav-back-color);color:var(--nav-fore-color);border:.0625rem solid var(--nav-border-color);border-radius:var(--universal-border-radius);margin:var(--universal-margin)}nav *{padding:var(--universal-padding) calc(1.5 * var(--universal-padding))}nav a,nav a:visited{display:block;color:var(--nav-link-color);border-radius:var(--universal-border-radius);transition:background 0.3s}nav a:hover,nav a:focus,nav a:visited:hover,nav a:visited:focus{text-decoration:none;background:var(--nav-hover-back-color)}nav .sublink-1{position:relative;margin-left:calc(2 * var(--universal-padding))}nav .sublink-1:before{position:absolute;left:calc(var(--universal-padding) - 1 * var(--universal-padding));top:-.0625rem;content:'';height:100%;border:.0625rem solid var(--nav-border-color);border-left:0}nav .sublink-2{position:relative;margin-left:calc(4 * var(--universal-padding))}nav .sublink-2:before{position:absolute;left:calc(var(--universal-padding) - 3 * var(--universal-padding));top:-.0625rem;content:'';height:100%;border:.0625rem solid var(--nav-border-color);border-left:0}footer{background:var(--footer-back-color);color:var(--footer-fore-color);border-top:.0625rem solid var(--footer-border-color);padding:calc(2 * var(--universal-padding)) var(--universal-padding);font-size:.875rem}footer a,footer a:visited{color:var(--footer-link-color)}header.sticky{position:-webkit-sticky;position:sticky;z-index:1101;top:0}footer.sticky{position:-webkit-sticky;position:sticky;z-index:1101;bottom:0}.drawer-toggle:before{display:inline-block;position:relative;vertical-align:bottom;content:'\00a0\2261\00a0';font-family:sans-serif;font-size:1.5em}@media screen and (min-width: 768px){.drawer-toggle:not(.persistent){display:none}}[type="checkbox"].drawer{height:1px;width:1px;margin:-1px;overflow:hidden;position:absolute;clip:rect(0 0 0 0);-webkit-clip-path:inset(100%);clip-path:inset(100%)}[type="checkbox"].drawer+*{display:block;box-sizing:border-box;position:fixed;top:0;width:320px;height:100vh;overflow-y:auto;background:var(--drawer-back-color);border:.0625rem solid var(--drawer-border-color);border-radius:0;margin:0;z-index:1110;left:-320px;transition:left 0.3s}[type="checkbox"].drawer+* .drawer-close{position:absolute;top:var(--universal-margin);right:var(--universal-margin);z-index:1111;width:2rem;height:2rem;border-radius:var(--universal-border-radius);padding:var(--universal-padding);margin:0;cursor:pointer;transition:background 0.3s}[type="checkbox"].drawer+* .drawer-close:before{display:block;content:'\00D7';color:var(--drawer-close-color);position:relative;font-family:sans-serif;font-size:2rem;line-height:1;text-align:center}[type="checkbox"].drawer+* .drawer-close:hover,[type="checkbox"].drawer+* .drawer-close:focus{background:var(--drawer-hover-back-color)}@media screen and (max-width: 320px){[type="checkbox"].drawer+*{width:100%}}[type="checkbox"].drawer:checked+*{left:0}@media screen and (min-width: 768px){[type="checkbox"].drawer:not(.persistent)+*{position:static;height:100%;z-index:1100}[type="checkbox"].drawer:not(.persistent)+* .drawer-close{display:none}}:root{--mark-back-color:#0277bd;--mark-fore-color:#fafafa}mark{background:var(--mark-back-color);color:var(--mark-fore-color);font-size:.95em;line-height:1em;border-radius:var(--universal-border-radius);padding:calc(var(--universal-padding) / 4) calc(var(--universal-padding) / 2)}mark.inline-block{display:inline-block;font-size:1em;line-height:1.5;padding:calc(var(--universal-padding) / 2) var(--universal-padding)}:root{--toast-back-color:#424242;--toast-fore-color:#fafafa}.toast{position:fixed;bottom:calc(var(--universal-margin) * 3);left:50%;transform:translate(-50%, -50%);z-index:1111;color:var(--toast-fore-color);background:var(--toast-back-color);border-radius:calc(var(--universal-border-radius) * 16);padding:var(--universal-padding) calc(var(--universal-padding) * 3)}:root{--tooltip-back-color:#212121;--tooltip-fore-color:#fafafa}.tooltip{position:relative;display:inline-block}.tooltip:before,.tooltip:after{position:absolute;opacity:0;clip:rect(0 0 0 0);-webkit-clip-path:inset(100%);clip-path:inset(100%);transition:all 0.3s;z-index:1010;left:50%}.tooltip:not(.bottom):before,.tooltip:not(.bottom):after{bottom:75%}.tooltip.bottom:before,.tooltip.bottom:after{top:75%}.tooltip:hover:before,.tooltip:hover:after,.tooltip:focus:before,.tooltip:focus:after{opacity:1;clip:auto;-webkit-clip-path:inset(0%);clip-path:inset(0%)}.tooltip:before{content:'';background:transparent;border:var(--universal-margin) solid transparent;left:calc(50% - var(--universal-margin))}.tooltip:not(.bottom):before{border-top-color:#212121}.tooltip.bottom:before{border-bottom-color:#212121}.tooltip:after{content:attr(aria-label);color:var(--tooltip-fore-color);background:var(--tooltip-back-color);border-radius:var(--universal-border-radius);padding:var(--universal-padding);white-space:nowrap;transform:translateX(-50%)}.tooltip:not(.bottom):after{margin-bottom:calc(2 * var(--universal-margin))}.tooltip.bottom:after{margin-top:calc(2 * var(--universal-margin))}:root{--modal-overlay-color:rgba(0,0,0,0.45);--modal-close-color:#444;--modal-close-hover-color:#f0f0f0}[type="checkbox"].modal{height:1px;width:1px;margin:-1px;overflow:hidden;position:absolute;clip:rect(0 0 0 0);-webkit-clip-path:inset(100%);clip-path:inset(100%)}[type="checkbox"].modal+div{position:fixed;top:0;left:0;display:none;width:100vw;height:100vh;background:var(--modal-overlay-color)}[type="checkbox"].modal+div .card{margin:0 auto;max-height:50vh;overflow:auto}[type="checkbox"].modal+div .card .modal-close{position:absolute;top:0;right:0;width:1.75rem;height:1.75rem;border-radius:var(--universal-border-radius);padding:var(--universal-padding);margin:0;cursor:pointer;transition:background 0.3s}[type="checkbox"].modal+div .card .modal-close:before{display:block;content:'\00D7';color:var(--modal-close-color);position:relative;font-family:sans-serif;font-size:1.75rem;line-height:1;text-align:center}[type="checkbox"].modal+div .card .modal-close:hover,[type="checkbox"].modal+div .card .modal-close:focus{background:var(--modal-close-hover-color)}[type="checkbox"].modal:checked+div{display:flex;flex:0 1 auto;z-index:1200}[type="checkbox"].modal:checked+div .card .modal-close{z-index:1211}:root{--collapse-label-back-color:#e8e8e8;--collapse-label-fore-color:#212121;--collapse-label-hover-back-color:#f0f0f0;--collapse-selected-label-back-color:#ececec;--collapse-border-color:#ddd;--collapse-content-back-color:#fafafa;--collapse-selected-label-border-color:#0277bd}.collapse{width:calc(100% - 2 * var(--universal-margin));opacity:1;display:flex;flex-direction:column;margin:var(--universal-margin);border-radius:var(--universal-border-radius)}.collapse>[type="radio"],.collapse>[type="checkbox"]{height:1px;width:1px;margin:-1px;overflow:hidden;position:absolute;clip:rect(0 0 0 0);-webkit-clip-path:inset(100%);clip-path:inset(100%)}.collapse>label{flex-grow:1;display:inline-block;height:1.5rem;cursor:pointer;transition:background 0.3s;color:var(--collapse-label-fore-color);background:var(--collapse-label-back-color);border:.0625rem solid var(--collapse-border-color);padding:calc(1.5 * var(--universal-padding))}.collapse>label:hover,.collapse>label:focus{background:var(--collapse-label-hover-back-color)}.collapse>label+div{flex-basis:auto;height:1px;width:1px;margin:-1px;overflow:hidden;position:absolute;clip:rect(0 0 0 0);-webkit-clip-path:inset(100%);clip-path:inset(100%);transition:max-height 0.3s;max-height:1px}.collapse>:checked+label{background:var(--collapse-selected-label-back-color);border-bottom-color:var(--collapse-selected-label-border-color)}.collapse>:checked+label+div{box-sizing:border-box;position:relative;width:100%;height:auto;overflow:auto;margin:0;background:var(--collapse-content-back-color);border:.0625rem solid var(--collapse-border-color);border-top:0;padding:var(--universal-padding);clip:auto;-webkit-clip-path:inset(0%);clip-path:inset(0%);max-height:400px}.collapse>label:not(:first-of-type){border-top:0}.collapse>label:first-of-type{border-radius:var(--universal-border-radius) var(--universal-border-radius) 0 0}.collapse>label:last-of-type{border-radius:0 0 var(--universal-border-radius) var(--universal-border-radius)}.collapse>:checked:last-of-type+label{border-radius:0}.collapse>:checked:last-of-type+label+div{border-radius:0 0 var(--universal-border-radius) var(--universal-border-radius)}mark.secondary{--mark-back-color:#d32f2f}mark.tertiary{--mark-back-color:#308732}mark.tag{padding:calc(var(--universal-padding)/2) var(--universal-padding);border-radius:1em}html,*{font-family:'Poppins', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, "Helvetica Neue", Helvetica, sans-serif}code,pre,kbd,code *,pre *,kbd *,code[class*="language-"],pre[class*="language-"]{font-family:'Inconsolata', Menlo, Consolas, monospace !important}code,kbd{font-size:1em}code{padding:0;transform:scale(1)}pre{font-size:1rem;border:0.0625rem solid var(--secondary-border-color);border-radius:var(--universal-border-radius)}.group{position:relative;margin-top:2em;margin-bottom:-1em}.search{font-size:14px;margin-top:-.1em;display:block;width:100%;border:none;border-bottom:1px solid var(--nav-link-color)}.search:focus{outline:none}label#search-label{color:var(--nav-link-color);font-size:18px;font-weight:400;position:absolute;left:5px;top:10px}.search:focus ~ label#search-label,.search:valid ~ label#search-label{top:-20px;font-size:14px;color:var(--nav-link-color)}label#menu-toggle{width:3.4375rem}header h1.logo{margin-top:-0.8rem;text-align:center}header h1.logo a{text-decoration:none;color:#111}header #title{position:relative;top:-1rem}@media screen and (max-width: 500px){header #title{font-size:1rem;display:block}}header h1 small{display:block;font-size:0.875rem;font-style:italic;color:#888;margin-top:-0.8rem}@media screen and (max-width: 768px){header h1 small{font-size:0.75rem}}@media screen and (max-width: 600px){header h1 small{font-size:0.625rem}}@media screen and (max-width: 500px){header h1 small{font-size:0.5rem;margin-top:-1.2rem}}label#menu-toggle{position:absolute;left:0.5rem;top:0.5rem;width:3.4375rem}.card{box-shadow:0 0.25rem 0.25rem 0 rgba(0,0,0,0.125),0 0.125rem 0.125rem -0.125rem rgba(0,0,0,0.25)}main{padding:0}.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string{background:none !important}
diff --git a/docs/mini/flavor.scss b/docs/mini/flavor.scss
index 1ac2b1f8c..bed527130 100644
--- a/docs/mini/flavor.scss
+++ b/docs/mini/flavor.scss
@@ -114,7 +114,10 @@ code, pre, kbd, code *, pre *, kbd *, code[class*="language-"], pre[class*="lang
font-family: 'Inconsolata', Menlo, Consolas, monospace !important;
}
code, kbd { font-size: 1em; }
-code { transform: scale(1); } /* Deals with the issue described in #243 */
+code {
+ padding: 0; // Should make the first line's left padding the same as all other lines and avoid that annoying little step.
+ transform: scale(1); /* Deals with the issue described in #243 */
+}
pre { font-size: 1rem; border: 0.0625rem solid var(--secondary-border-color); border-radius: var(--universal-border-radius);}
.group{position:relative;margin-top:2em;margin-bottom:-1em}
.search{font-size:14px;margin-top:-.1em;display:block;width:100%;border:none;border-bottom:1px solid var(--nav-link-color)}
diff --git a/scripts/lint-script.js b/scripts/lint-script.js
index c1f380642..d67980f17 100644
--- a/scripts/lint-script.js
+++ b/scripts/lint-script.js
@@ -25,7 +25,8 @@ try {
console.time(`Linter (${snippet})`);
// Synchronously read data from the snippet, get the code, write it to a temporary file
let snippetData = fs.readFileSync(path.join(snippetsPath,snippet),'utf8');
- let originalCode = snippetData.slice(snippetData.indexOf('```js')+5,snippetData.lastIndexOf('```'));
+ let codeStart = snippetData.indexOf('```js'), codeEnd = snippetData.search(/```[\n\r\s]+```js/g);
+ let originalCode = snippetData.slice(codeStart+5,codeEnd);
while(jobCounter >= 20){
setTimeout(()=>{},1000);
}
@@ -36,7 +37,7 @@ try {
cp.exec(`semistandard "${tempSnippet}.temp.js" --fix`,{},(error, stdOut, stdErr) => {
jobCounter += 1;
let lintedCode = fs.readFileSync(`${tempSnippet}.temp.js`,'utf8');
- fs.writeFile(path.join(snippetsPath,snippet), `${snippetData.slice(0, snippetData.indexOf('```js')+5)+lintedCode+'```\n'}`);
+ fs.writeFile(path.join(snippetsPath,snippet), `${snippetData.slice(0, codeStart+5)+lintedCode+snippetData.slice(codeEnd)}`);
fs.unlink(`${tempSnippet}.temp.js`);
// Log a success message
console.log(`${chalk.green('SUCCESS!')} Linted snippet: ${snippet}`);
diff --git a/snippet-template.md b/snippet-template.md
index f95eabc3d..1ee62a2f0 100644
--- a/snippet-template.md
+++ b/snippet-template.md
@@ -7,5 +7,8 @@ Explain briefly how the snippet works.
```js
const functionName = arguments =>
{functionBody}
-// functionName(sampleInput) -> sampleOutput
-```
\ No newline at end of file
+```
+
+```js
+functionName('sampleInput') // 'sampleOutput'
+```
diff --git a/snippets/JSONToDate.md b/snippets/JSONToDate.md
index 311da31e7..8017eba98 100644
--- a/snippets/JSONToDate.md
+++ b/snippets/JSONToDate.md
@@ -9,5 +9,8 @@ const JSONToDate = arr => {
const dt = new Date(parseInt(arr.toString().substr(6)));
return `${dt.getDate()}/${dt.getMonth() + 1}/${dt.getFullYear()}`;
};
-// JSONToDate(/Date(1489525200000)/) -> "14/3/2017"
+```
+
+```js
+JSONToDate(/Date(1489525200000)/) // "14/3/2017"
```
diff --git a/snippets/JSONToFile.md b/snippets/JSONToFile.md
index 984e516b6..713183838 100644
--- a/snippets/JSONToFile.md
+++ b/snippets/JSONToFile.md
@@ -7,5 +7,8 @@ Use `fs.writeFile()`, template literals and `JSON.stringify()` to write a `json`
```js
const fs = require('fs');
const JSONToFile = (obj, filename) => fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2));
-// JSONToFile({test: "is passed"}, 'testJsonFile') -> writes the object to 'testJsonFile.json'
+```
+
+```js
+JSONToFile({test: "is passed"}, 'testJsonFile') // writes the object to 'testJsonFile.json'
```
diff --git a/snippets/RGBToHex.md b/snippets/RGBToHex.md
index eb13cbeb4..a7f045ab7 100644
--- a/snippets/RGBToHex.md
+++ b/snippets/RGBToHex.md
@@ -6,5 +6,8 @@ Convert given RGB parameters to hexadecimal string using bitwise left-shift oper
```js
const RGBToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0');
-// RGBToHex(255, 165, 1) -> 'ffa501'
+```
+
+```js
+RGBToHex(255, 165, 1) // 'ffa501'
```
diff --git a/snippets/UUIDGenerator.md b/snippets/UUIDGenerator.md
index 316659ea2..2fc772940 100644
--- a/snippets/UUIDGenerator.md
+++ b/snippets/UUIDGenerator.md
@@ -9,5 +9,8 @@ const UUIDGenerator = () =>
([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>
(c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
);
-// UUIDGenerator() -> '7982fcfe-5721-4632-bede-6000885be57d'
+```
+
+```js
+UUIDGenerator() // '7982fcfe-5721-4632-bede-6000885be57d'
```
diff --git a/snippets/anagrams.md b/snippets/anagrams.md
index b89194564..82684871c 100644
--- a/snippets/anagrams.md
+++ b/snippets/anagrams.md
@@ -13,5 +13,8 @@ const anagrams = 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']
+```
+
+```js
+anagrams('abc') // ['abc','acb','bac','bca','cab','cba']
```
diff --git a/snippets/arrayAverage.md b/snippets/arrayAverage.md
index 74c8cef97..1cc3cecb4 100644
--- a/snippets/arrayAverage.md
+++ b/snippets/arrayAverage.md
@@ -6,5 +6,8 @@ Use `Array.reduce()` to add each value to an accumulator, initialized with a val
```js
const arrayAverage = arr => arr.reduce((acc, val) => acc + val, 0) / arr.length;
-// arrayAverage([1,2,3]) -> 2
+```
+
+```js
+arrayAverage([1,2,3]) // 2
```
diff --git a/snippets/arrayGcd.md b/snippets/arrayGcd.md
index fde889d05..6fbb7f2f5 100644
--- a/snippets/arrayGcd.md
+++ b/snippets/arrayGcd.md
@@ -9,6 +9,9 @@ const arrayGcd = arr => {
const gcd = (x, y) => !y ? x : gcd(y, x % y);
return arr.reduce((a, b) => gcd(a, b));
};
-// arrayGcd([1,2,3,4,5]) -> 1
-// arrayGcd([4,8,12]) -> 4
+```
+
+```js
+arrayGcd([1,2,3,4,5]) // 1
+arrayGcd([4,8,12]) // 4
```
diff --git a/snippets/arrayLcm.md b/snippets/arrayLcm.md
index 42cb61906..beca717b4 100644
--- a/snippets/arrayLcm.md
+++ b/snippets/arrayLcm.md
@@ -10,6 +10,9 @@ const arrayLcm = arr => {
const lcm = (x, y) => (x * y) / gcd(x, y);
return arr.reduce((a, b) => lcm(a, b));
};
-// arrayLcm([1,2,3,4,5]) -> 60
-// arrayLcm([4,8,12]) -> 24
+```
+
+```js
+arrayLcm([1,2,3,4,5]) // 60
+arrayLcm([4,8,12]) // 24
```
diff --git a/snippets/arrayMax.md b/snippets/arrayMax.md
index 0c0022996..32178d533 100644
--- a/snippets/arrayMax.md
+++ b/snippets/arrayMax.md
@@ -6,5 +6,8 @@ Use `Math.max()` combined with the spread operator (`...`) to get the maximum va
```js
const arrayMax = arr => Math.max(...arr);
-// arrayMax([10, 1, 5]) -> 10
+```
+
+```js
+arrayMax([10, 1, 5]) // 10
```
diff --git a/snippets/arrayMin.md b/snippets/arrayMin.md
index 5bdd95559..1e256b388 100644
--- a/snippets/arrayMin.md
+++ b/snippets/arrayMin.md
@@ -6,5 +6,8 @@ Use `Math.min()` combined with the spread operator (`...`) to get the minimum va
```js
const arrayMin = arr => Math.min(...arr);
-// arrayMin([10, 1, 5]) -> 1
+```
+
+```js
+arrayMin([10, 1, 5]) // 1
```
diff --git a/snippets/arraySum.md b/snippets/arraySum.md
index 265c7fc60..536a4eb81 100644
--- a/snippets/arraySum.md
+++ b/snippets/arraySum.md
@@ -6,5 +6,8 @@ Use `Array.reduce()` to add each value to an accumulator, initialized with a val
```js
const arraySum = arr => arr.reduce((acc, val) => acc + val, 0);
-// arraySum([1,2,3,4]) -> 10
+```
+
+```js
+arraySum([1,2,3,4]) // 10
```
diff --git a/snippets/arrayToHtmlList.md b/snippets/arrayToHtmlList.md
index 6577ff663..32f98c178 100644
--- a/snippets/arrayToHtmlList.md
+++ b/snippets/arrayToHtmlList.md
@@ -6,5 +6,8 @@ Use `Array.map()` and `document.querySelector()` to create a list of html tags.
```js
const arrayToHtmlList = (arr, listID) => arr.map(item => document.querySelector('#' + listID).innerHTML += `${item} `);
-// arrayToHtmlList(['item 1', 'item 2'],'myListID')
+```
+
+```js
+arrayToHtmlList(['item 1', 'item 2'],'myListID')
```
diff --git a/snippets/bottomVisible.md b/snippets/bottomVisible.md
index adac44881..4608cffd5 100644
--- a/snippets/bottomVisible.md
+++ b/snippets/bottomVisible.md
@@ -7,5 +7,8 @@ Use `scrollY`, `scrollHeight` and `clientHeight` to determine if the bottom of t
```js
const bottomVisible = () =>
document.documentElement.clientHeight + window.scrollY >= (document.documentElement.scrollHeight || document.documentElement.clientHeight);
-// bottomVisible() -> true
+```
+
+```js
+bottomVisible() // true
```
diff --git a/snippets/call.md b/snippets/call.md
index 1cb0d4758..e9f2b4d6c 100644
--- a/snippets/call.md
+++ b/snippets/call.md
@@ -6,9 +6,10 @@ Use a closure to call a stored key with stored arguments.
```js
const call = (key, ...args) => context => context[ key ](...args);
-/*
+```
+
+```js
Promise.resolve( [ 1, 2, 3 ] ).then( call('map', x => 2 * x ) ).then( console.log ) //[ 2, 4, 6 ]
const map = call.bind(null, 'map')
Promise.resolve( [ 1, 2, 3 ] ).then( map( x => 2 * x ) ).then( console.log ) //[ 2, 4, 6 ]
-*/
-```
+```
diff --git a/snippets/capitalize.md b/snippets/capitalize.md
index 9991e279e..ea1c56124 100644
--- a/snippets/capitalize.md
+++ b/snippets/capitalize.md
@@ -8,6 +8,9 @@ Omit the `lowerRest` parameter to keep the rest of the string intact, or set it
```js
const capitalize = ([first, ...rest], lowerRest = false) =>
first.toUpperCase() + (lowerRest ? rest.join('').toLowerCase() : rest.join(''));
-// capitalize('myName') -> 'MyName'
-// capitalize('myName', true) -> 'Myname'
+```
+
+```js
+capitalize('fooBar') // 'FooBar'
+capitalize('fooBar', true) // 'Foobar'
```
diff --git a/snippets/capitalizeEveryWord.md b/snippets/capitalizeEveryWord.md
index bfaaf00b6..dd3193c3e 100644
--- a/snippets/capitalizeEveryWord.md
+++ b/snippets/capitalizeEveryWord.md
@@ -6,5 +6,8 @@ Use `replace()` to match the first character of each word and `toUpperCase()` to
```js
const capitalizeEveryWord = str => str.replace(/\b[a-z]/g, char => char.toUpperCase());
-// capitalizeEveryWord('hello world!') -> 'Hello World!'
+```
+
+```js
+capitalizeEveryWord('hello world!') // 'Hello World!'
```
diff --git a/snippets/chainAsync.md b/snippets/chainAsync.md
index 66fb8a6ab..1fb4067c8 100644
--- a/snippets/chainAsync.md
+++ b/snippets/chainAsync.md
@@ -6,11 +6,12 @@ Loop through an array of functions containing asynchronous events, calling `next
```js
const chainAsync = fns => { let curr = 0; const next = () => fns[curr++](next); next(); };
-/*
+```
+
+```js
chainAsync([
next => { console.log('0 seconds'); setTimeout(next, 1000); },
next => { console.log('1 second'); setTimeout(next, 1000); },
next => { console.log('2 seconds'); }
])
-*/
```
diff --git a/snippets/chunk.md b/snippets/chunk.md
index 8ad2c3ced..f27fe965c 100644
--- a/snippets/chunk.md
+++ b/snippets/chunk.md
@@ -9,5 +9,8 @@ If the original array can't be split evenly, the final chunk will contain the re
```js
const chunk = (arr, size) =>
Array.from({length: Math.ceil(arr.length / size)}, (v, i) => arr.slice(i * size, i * size + size));
-// chunk([1,2,3,4,5], 2) -> [[1,2],[3,4],[5]]
+```
+
+```js
+chunk([1,2,3,4,5], 2) // [[1,2],[3,4],[5]]
```
diff --git a/snippets/clampNumber.md b/snippets/clampNumber.md
index 8880c4282..fc46766be 100644
--- a/snippets/clampNumber.md
+++ b/snippets/clampNumber.md
@@ -1,13 +1,16 @@
### clampNumber
-Clamps `num` within the inclusive range specified by the boundary values `a` and `b`
+Clamps `num` within the inclusive range specified by the boundary values `a` and `b`.
-If `num` falls within the range, return `num`.
+If `num` falls within the range, return `num`.
Otherwise, return the nearest number in the range.
```js
-const clampNumber = (num, a, b) => Math.max(Math.min(num, Math.max(a,b)),Math.min(a,b));
-// clampNumber(2, 3, 5) -> 3
-// clampNumber(1, -1, -5) -> -1
-// clampNumber(3, 2, 4) -> 3
+const clampNumber = (num, a, b) => Math.max(Math.min(num, Math.max(a, b)), Math.min(a, b));
+```
+
+```js
+clampNumber(2, 3, 5) // 3
+clampNumber(1, -1, -5) // -1
+clampNumber(3, 2, 4) // 3
```
diff --git a/snippets/cleanObj.md b/snippets/cleanObj.md
index 3ce8d2cdd..3f5207369 100644
--- a/snippets/cleanObj.md
+++ b/snippets/cleanObj.md
@@ -16,8 +16,9 @@ const cleanObj = (obj, keysToKeep = [], childIndicator) => {
});
return obj;
};
-/*
- const testObj = {a: 1, b: 2, children: {a: 1, b: 2}}
- cleanObj(testObj, ["a"],"children") // { a: 1, children : { a: 1}}
-*/
+```
+
+```js
+const testObj = {a: 1, b: 2, children: {a: 1, b: 2}}
+cleanObj(testObj, ["a"],"children") // { a: 1, children : { a: 1}}
```
diff --git a/snippets/coalesce.md b/snippets/coalesce.md
index 1002df4d2..ce4dfc03d 100644
--- a/snippets/coalesce.md
+++ b/snippets/coalesce.md
@@ -6,5 +6,8 @@ Use `Array.find()` to return the first non `null`/`undefined` argument.
```js
const coalesce = (...args) => args.find(_ => ![undefined, null].includes(_));
-// coalesce(null,undefined,"",NaN, "Waldo") -> ""
+```
+
+```js
+coalesce(null,undefined,"",NaN, "Waldo") // ""
```
diff --git a/snippets/coalesceFactory.md b/snippets/coalesceFactory.md
index 4b9a78924..39bb98714 100644
--- a/snippets/coalesceFactory.md
+++ b/snippets/coalesceFactory.md
@@ -6,6 +6,9 @@ Use `Array.find()` to return the first argument that returns `true` from the pro
```js
const coalesceFactory = valid => (...args) => args.find(valid);
-// const customCoalesce = coalesceFactory(_ => ![null, undefined, "", NaN].includes(_))
-// customCoalesce(undefined, null, NaN, "", "Waldo") //-> "Waldo"
+```
+
+```js
+const customCoalesce = coalesceFactory(_ => ![null, undefined, "", NaN].includes(_))
+customCoalesce(undefined, null, NaN, "", "Waldo") // "Waldo"
```
diff --git a/snippets/collatz.md b/snippets/collatz.md
index 8b8903886..de67f674c 100644
--- a/snippets/collatz.md
+++ b/snippets/collatz.md
@@ -6,6 +6,9 @@ If `n` is even, return `n/2`. Otherwise, return `3n+1`.
```js
const collatz = n => (n % 2 == 0) ? (n / 2) : (3 * n + 1);
-// collatz(8) --> 4
-// collatz(5) --> 16
+```
+
+```js
+collatz(8) // 4
+collatz(5) // 16
```
diff --git a/snippets/collectInto.md b/snippets/collectInto.md
index 69c036764..9446f2bc3 100644
--- a/snippets/collectInto.md
+++ b/snippets/collectInto.md
@@ -6,11 +6,12 @@ Given a function, return a closure that collects all inputs into an array-accept
```js
const collectInto = fn => (...args) => fn(args);
-/*
+```
+
+```js
const Pall = collectInto( Promise.all.bind(Promise) )
let p1 = Promise.resolve(1)
let p2 = Promise.resolve(2)
let p3 = new Promise((resolve) => setTimeout(resolve,2000,3))
Pall(p1, p2, p3).then(console.log)
-*/
-```
+```
diff --git a/snippets/compact.md b/snippets/compact.md
index d09160afe..07f4e9900 100644
--- a/snippets/compact.md
+++ b/snippets/compact.md
@@ -6,5 +6,8 @@ Use `Array.filter()` to filter out falsey values (`false`, `null`, `0`, `""`, `u
```js
const compact = arr => arr.filter(Boolean);
-// compact([0, 1, false, 2, '', 3, 'a', 'e'*23, NaN, 's', 34]) -> [ 1, 2, 3, 'a', 's', 34 ]
+```
+
+```js
+compact([0, 1, false, 2, '', 3, 'a', 'e'*23, NaN, 's', 34]) // [ 1, 2, 3, 'a', 's', 34 ]
```
diff --git a/snippets/compose.md b/snippets/compose.md
index f6b1ce2ea..c271a50e8 100644
--- a/snippets/compose.md
+++ b/snippets/compose.md
@@ -7,10 +7,11 @@ The last (rightmost) function can accept one or more arguments; the remaining fu
```js
const compose = (...fns) => fns.reduce((f, g) => (...args) => f(g(...args)));
-/*
+```
+
+```js
const add5 = x => x + 5
const multiply = (x, y) => x * y
const multiplyAndAdd5 = compose(add5, multiply)
-multiplyAndAdd5(5, 2) -> 15
-*/
+multiplyAndAdd5(5, 2) // 15
```
diff --git a/snippets/countOccurrences.md b/snippets/countOccurrences.md
index f55de0a62..d68c83acf 100644
--- a/snippets/countOccurrences.md
+++ b/snippets/countOccurrences.md
@@ -6,5 +6,8 @@ Use `Array.reduce()` to increment a counter each time you encounter the specific
```js
const countOccurrences = (arr, value) => arr.reduce((a, v) => v === value ? a + 1 : a + 0, 0);
-// countOccurrences([1,1,2,1,2,3], 1) -> 3
+```
+
+```js
+countOccurrences([1,1,2,1,2,3], 1) // 3
```
diff --git a/snippets/countVowels.md b/snippets/countVowels.md
index c91f09442..50cf6cafa 100644
--- a/snippets/countVowels.md
+++ b/snippets/countVowels.md
@@ -6,6 +6,9 @@ Use a regular expression to count the number of vowels `(A, E, I, O, U)` in a `s
```js
const countVowels = str => (str.match(/[aeiou]/ig) || []).length;
-// countVowels('foobar') -> 3
-// countVowels('gym') -> 0
+```
+
+```js
+countVowels('foobar') // 3
+countVowels('gym') // 0
```
diff --git a/snippets/currentURL.md b/snippets/currentURL.md
index a6482a689..0fab76ab3 100644
--- a/snippets/currentURL.md
+++ b/snippets/currentURL.md
@@ -6,5 +6,8 @@ Use `window.location.href` to get current URL.
```js
const currentURL = () => window.location.href;
-// currentUrl() -> 'https://google.com'
+```
+
+```js
+currentUrl() // 'https://google.com'
```
diff --git a/snippets/curry.md b/snippets/curry.md
index c88e3418a..c316acff2 100644
--- a/snippets/curry.md
+++ b/snippets/curry.md
@@ -12,6 +12,9 @@ const curry = (fn, arity = fn.length, ...args) =>
arity <= args.length
? fn(...args)
: curry.bind(null, fn, arity, ...args);
-// curry(Math.pow)(2)(10) -> 1024
-// curry(Math.min, 3)(10)(50)(2) -> 2
+```
+
+```js
+curry(Math.pow)(2)(10) // 1024
+curry(Math.min, 3)(10)(50)(2) // 2
```
diff --git a/snippets/deepFlatten.md b/snippets/deepFlatten.md
index c6f29fb9b..c6c9d2807 100644
--- a/snippets/deepFlatten.md
+++ b/snippets/deepFlatten.md
@@ -8,5 +8,8 @@ Recursively flatten each element that is an array.
```js
const deepFlatten = arr => [].concat(...arr.map(v => Array.isArray(v) ? deepFlatten(v) : v));
-// deepFlatten([1,[2],[[3],4],5]) -> [1,2,3,4,5]
+```
+
+```js
+deepFlatten([1,[2],[[3],4],5]) // [1,2,3,4,5]
```
diff --git a/snippets/detectDeviceType.md b/snippets/detectDeviceType.md
index 291e148c5..3f0ec2357 100644
--- a/snippets/detectDeviceType.md
+++ b/snippets/detectDeviceType.md
@@ -6,6 +6,9 @@ Use a regular expression to test the `navigator.userAgent` property to figure ou
```js
const detectDeviceType = () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ? 'Mobile' : 'Desktop';
-// detectDeviceType() -> "Mobile"
-// detectDeviceType() -> "Desktop"
+```
+
+```js
+detectDeviceType() // "Mobile"
+detectDeviceType() // "Desktop"
```
diff --git a/snippets/difference.md b/snippets/difference.md
index e78a73340..486d4b050 100644
--- a/snippets/difference.md
+++ b/snippets/difference.md
@@ -6,5 +6,8 @@ Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values no
```js
const difference = (a, b) => { const s = new Set(b); return a.filter(x => !s.has(x)); };
-// difference([1,2,3], [1,2,4]) -> [3]
+```
+
+```js
+difference([1,2,3], [1,2,4]) // [3]
```
diff --git a/snippets/differenceWith.md b/snippets/differenceWith.md
index 02f686f4b..384f401b8 100644
--- a/snippets/differenceWith.md
+++ b/snippets/differenceWith.md
@@ -6,5 +6,8 @@ Use `Array.filter()` and `Array.find()` to find the appropriate values.
```js
const differenceWith = (arr, val, comp) => arr.filter(a => !val.find(b => comp(a, b)));
-// differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) -> [1, 1.2]
+```
+
+```js
+differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) // [1, 1.2]
```
diff --git a/snippets/digitize.md b/snippets/digitize.md
index 6a48fafcb..a8a605ef7 100644
--- a/snippets/digitize.md
+++ b/snippets/digitize.md
@@ -7,5 +7,8 @@ Use `Array.map()` and `parseInt()` to transform each value to an integer.
```js
const digitize = n => [...'' + n].map(i => parseInt(i));
-// digitize(2334) -> [2, 3, 3, 4]
+```
+
+```js
+differenceWith([1, 1.2, 1.5, 3], [1.9, 3], (a,b) => Math.round(a) == Math.round(b)) // [1, 1.2]
```
diff --git a/snippets/distance.md b/snippets/distance.md
index 5595ef188..bfc29b8dc 100644
--- a/snippets/distance.md
+++ b/snippets/distance.md
@@ -6,5 +6,8 @@ Use `Math.hypot()` to calculate the Euclidean distance between two points.
```js
const distance = (x0, y0, x1, y1) => Math.hypot(x1 - x0, y1 - y0);
-// distance(1,1, 2,3) -> 2.23606797749979
+```
+
+```js
+distance(1,1, 2,3) // 2.23606797749979
```
diff --git a/snippets/distinctValuesOfArray.md b/snippets/distinctValuesOfArray.md
index 24c0c60c0..509738a40 100644
--- a/snippets/distinctValuesOfArray.md
+++ b/snippets/distinctValuesOfArray.md
@@ -6,5 +6,8 @@ Use ES6 `Set` and the `...rest` operator to discard all duplicated values.
```js
const distinctValuesOfArray = arr => [...new Set(arr)];
-// distinctValuesOfArray([1,2,2,3,4,4,5]) -> [1,2,3,4,5]
+```
+
+```js
+distinctValuesOfArray([1,2,2,3,4,4,5]) // [1,2,3,4,5]
```
diff --git a/snippets/dropElements.md b/snippets/dropElements.md
index adc81d79d..a9632c634 100644
--- a/snippets/dropElements.md
+++ b/snippets/dropElements.md
@@ -10,5 +10,8 @@ const dropElements = (arr, func) => {
while (arr.length > 0 && !func(arr[0])) arr = arr.slice(1);
return arr;
};
-// dropElements([1, 2, 3, 4], n => n >= 3) -> [3,4]
+```
+
+```js
+dropElements([1, 2, 3, 4], n => n >= 3) // [3,4]
```
diff --git a/snippets/dropRight.md b/snippets/dropRight.md
index 3e6716f0e..cdf8fd458 100644
--- a/snippets/dropRight.md
+++ b/snippets/dropRight.md
@@ -6,7 +6,10 @@ Use `Array.slice()` to slice the remove the specified number of elements from th
```js
const dropRight = (arr, n = 1) => arr.slice(0, -n);
-// dropRight([1,2,3]) -> [1,2]
-// dropRight([1,2,3], 2) -> [1]
-// dropRight([1,2,3], 42) -> []
+```
+
+```js
+dropRight([1,2,3]) // [1,2]
+dropRight([1,2,3], 2) // [1]
+dropRight([1,2,3], 42) // []
```
diff --git a/snippets/elementIsVisibleInViewport.md b/snippets/elementIsVisibleInViewport.md
index 01015d4fc..ed2933efe 100644
--- a/snippets/elementIsVisibleInViewport.md
+++ b/snippets/elementIsVisibleInViewport.md
@@ -16,7 +16,10 @@ const elementIsVisibleInViewport = (el, partiallyVisible = false) => {
((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth))
: top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth;
};
-// e.g. 100x100 viewport and a 10x10px element at position {top: -1, left: 0, bottom: 9, right: 10}
-// elementIsVisibleInViewport(el) -> false (not fully visible)
-// elementIsVisibleInViewport(el, true) -> true (partially visible)
+```
+
+```js
+// e.g. 100x100 viewport and a 10x10px element at position {top: -1, left: 0, bottom: 9, right: 10}
+elementIsVisibleInViewport(el) // false // (not fully visible)
+elementIsVisibleInViewport(el, true) // true // (partially visible)
```
diff --git a/snippets/escapeRegExp.md b/snippets/escapeRegExp.md
index caed74069..f82850d2b 100644
--- a/snippets/escapeRegExp.md
+++ b/snippets/escapeRegExp.md
@@ -6,5 +6,8 @@ Use `replace()` to escape special characters.
```js
const escapeRegExp = str => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
-// escapeRegExp('(test)') -> \\(test\\)
+```
+
+```js
+escapeRegExp('(test)') // \\(test\\)
```
diff --git a/snippets/everyNth.md b/snippets/everyNth.md
index f326ebe2b..2fab65d47 100644
--- a/snippets/everyNth.md
+++ b/snippets/everyNth.md
@@ -6,5 +6,8 @@ Use `Array.filter()` to create a new array that contains every nth element of a
```js
const everyNth = (arr, nth) => arr.filter((e, i) => i % nth === nth - 1);
-// everyNth([1,2,3,4,5,6], 2) -> [ 2, 4, 6 ]
+```
+
+```js
+everyNth([1,2,3,4,5,6], 2) // [ 2, 4, 6 ]
```
diff --git a/snippets/extendHex.md b/snippets/extendHex.md
index a134ebd7b..a9d60fdcf 100644
--- a/snippets/extendHex.md
+++ b/snippets/extendHex.md
@@ -7,6 +7,9 @@ Use `Array.map()`, `split()` and `Array.join()` to join the mapped array for con
```js
const extendHex = shortHex =>
'#' + shortHex.slice(shortHex.startsWith('#') ? 1 : 0).split('').map(x => x + x).join('');
-// extendHex('#03f') -> '#0033ff'
-// extendHex('05a') -> '#0055aa'
+```
+
+```js
+extendHex('#03f') // '#0033ff'
+extendHex('05a') // '#0055aa'
```
diff --git a/snippets/factorial.md b/snippets/factorial.md
index e0afbd2c3..5f76f06d3 100644
--- a/snippets/factorial.md
+++ b/snippets/factorial.md
@@ -11,5 +11,8 @@ Throws an exception if `n` is a negative number.
const factorial = n =>
n < 0 ? (() => { throw new TypeError('Negative numbers are not allowed!'); })()
: n <= 1 ? 1 : n * factorial(n - 1);
-// factorial(6) -> 720
+```
+
+```js
+factorial(6) // 720
```
diff --git a/snippets/fibonacci.md b/snippets/fibonacci.md
index e5e2e15fd..1c47024b7 100644
--- a/snippets/fibonacci.md
+++ b/snippets/fibonacci.md
@@ -8,5 +8,8 @@ Use `Array.reduce()` to add values into the array, using the sum of the last two
```js
const fibonacci = n =>
Array.from({ length: n}).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []);
-// fibonacci(5) -> [0,1,1,2,3]
+```
+
+```js
+fibonacci(6) // 720
```
diff --git a/snippets/fibonacciCountUntilNum.md b/snippets/fibonacciCountUntilNum.md
index 8cf904ef0..b822adf0c 100644
--- a/snippets/fibonacciCountUntilNum.md
+++ b/snippets/fibonacciCountUntilNum.md
@@ -7,5 +7,8 @@ Use a mathematical formula to calculate the number of fibonacci numbers until `n
```js
const fibonacciCountUntilNum = num =>
Math.ceil(Math.log(num * Math.sqrt(5) + 1 / 2) / Math.log((Math.sqrt(5) + 1) / 2));
-// fibonacciCountUntilNum(10) -> 7
+```
+
+```js
+fibonacciCountUntilNum(10) // 7
```
diff --git a/snippets/fibonacciUntilNum.md b/snippets/fibonacciUntilNum.md
index 5e1b2c9d7..25303b348 100644
--- a/snippets/fibonacciUntilNum.md
+++ b/snippets/fibonacciUntilNum.md
@@ -11,5 +11,8 @@ const fibonacciUntilNum = num => {
let n = Math.ceil(Math.log(num * Math.sqrt(5) + 1 / 2) / Math.log((Math.sqrt(5) + 1) / 2));
return Array.from({ length: n}).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []);
};
-// fibonacciUntilNum(15) -> [0,1,1,2,3,5,8,13]
+```
+
+```js
+fibonacciCountUntilNum(10) // 7
```
diff --git a/snippets/filterNonUnique.md b/snippets/filterNonUnique.md
index 059d79aa5..cfce97f56 100644
--- a/snippets/filterNonUnique.md
+++ b/snippets/filterNonUnique.md
@@ -6,5 +6,8 @@ Use `Array.filter()` for an array containing only the unique values.
```js
const filterNonUnique = arr => arr.filter(i => arr.indexOf(i) === arr.lastIndexOf(i));
-// filterNonUnique([1,2,2,3,4,4,5]) -> [1,3,5]
+```
+
+```js
+filterNonUnique([1,2,2,3,4,4,5]) // [1,3,5]
```
diff --git a/snippets/flatten.md b/snippets/flatten.md
index 0efd29071..fc4e7e74a 100644
--- a/snippets/flatten.md
+++ b/snippets/flatten.md
@@ -6,5 +6,8 @@ Use a new array and concatenate it with the spread input array causing a shallow
```js
const flatten = arr => [ ].concat(...arr);
-// flatten([1,[2],3,4]) -> [1,2,3,4]
+```
+
+```js
+flatten([1,[2],3,4]) // [1,2,3,4]
```
diff --git a/snippets/flattenDepth.md b/snippets/flattenDepth.md
index c07b837ff..580f51b94 100644
--- a/snippets/flattenDepth.md
+++ b/snippets/flattenDepth.md
@@ -11,5 +11,8 @@ Omit the second element, `depth` to flatten only to a depth of `1` (single flatt
const flattenDepth = (arr, depth = 1) =>
depth != 1 ? arr.reduce((a, v) => a.concat(Array.isArray(v) ? flattenDepth(v, depth - 1) : v), [])
: arr.reduce((a, v) => a.concat(v), []);
-// flattenDepth([1,[2],[[[3],4],5]], 2) -> [1,2,[3],4,5]
+```
+
+```js
+flattenDepth([1,[2],3,4]) // [1,2,3,4]
```
diff --git a/snippets/flip.md b/snippets/flip.md
index 004d838d2..1c3ce1afc 100644
--- a/snippets/flip.md
+++ b/snippets/flip.md
@@ -6,7 +6,9 @@ Return a closure that takes variadic inputs, and splices the last argument to ma
```js
const flip = fn => (...args) => fn(args.pop(), ...args);
-/*
+```
+
+```js
let a = {name: 'John Smith'}
let b = {}
const mergeFrom = flip(Object.assign)
@@ -14,5 +16,4 @@ let mergePerson = mergeFrom.bind(null, a)
mergePerson(b) // == b
b = {}
Object.assign(b, a) // == b
-*/
-```
+```
diff --git a/snippets/fromCamelCase.md b/snippets/fromCamelCase.md
index 3d480dc85..9a74226f7 100644
--- a/snippets/fromCamelCase.md
+++ b/snippets/fromCamelCase.md
@@ -9,7 +9,10 @@ Omit the second argument to use a default separator of `_`.
const fromCamelCase = (str, separator = '_') =>
str.replace(/([a-z\d])([A-Z])/g, '$1' + separator + '$2')
.replace(/([A-Z]+)([A-Z][a-z\d]+)/g, '$1' + separator + '$2').toLowerCase();
-// fromCamelCase('someDatabaseFieldName', ' ') -> 'some database field name'
-// fromCamelCase('someLabelThatNeedsToBeCamelized', '-') -> 'some-label-that-needs-to-be-camelized'
-// fromCamelCase('someJavascriptProperty', '_') -> 'some_javascript_property'
+```
+
+```js
+fromCamelCase('someDatabaseFieldName', ' ') // 'some database field name'
+fromCamelCase('someLabelThatNeedsToBeCamelized', '-') // 'some-label-that-needs-to-be-camelized'
+fromCamelCase('someJavascriptProperty', '_') // 'some_javascript_property'
```
diff --git a/snippets/functionName.md b/snippets/functionName.md
index 54603d39c..17869a6a6 100644
--- a/snippets/functionName.md
+++ b/snippets/functionName.md
@@ -6,5 +6,8 @@ Use `console.debug()` and the `name` property of the passed method to log the me
```js
const functionName = fn => (console.debug(fn.name), fn);
-// functionName(Math.max) -> max (logged in debug channel of console)
+```
+
+```js
+functionName(Math.max) // max (logged in debug channel of console)
```
diff --git a/snippets/gcd.md b/snippets/gcd.md
index 34fb21833..f3faa5057 100644
--- a/snippets/gcd.md
+++ b/snippets/gcd.md
@@ -8,5 +8,8 @@ Otherwise, return the GCD of `y` and the remainder of the division `x/y`.
```js
const gcd = (x, y) => !y ? x : gcd(y, x % y);
-// gcd (8, 36) -> 4
+```
+
+```js
+gcd (8, 36) // 4
```
diff --git a/snippets/getDaysDiffBetweenDates.md b/snippets/getDaysDiffBetweenDates.md
index 3b63440c1..f0f4d5763 100644
--- a/snippets/getDaysDiffBetweenDates.md
+++ b/snippets/getDaysDiffBetweenDates.md
@@ -6,5 +6,8 @@ Calculate the difference (in days) between two `Date` objects.
```js
const getDaysDiffBetweenDates = (dateInitial, dateFinal) => (dateFinal - dateInitial) / (1000 * 3600 * 24);
-// getDaysDiffBetweenDates(new Date("2017-12-13"), new Date("2017-12-22")) -> 9
+```
+
+```js
+getDaysDiffBetweenDates(new Date("2017-12-13"), new Date("2017-12-22")) // 9
```
diff --git a/snippets/getScrollPosition.md b/snippets/getScrollPosition.md
index b51ec3241..4860b0293 100644
--- a/snippets/getScrollPosition.md
+++ b/snippets/getScrollPosition.md
@@ -9,5 +9,8 @@ You can omit `el` to use a default value of `window`.
const getScrollPosition = (el = window) =>
({x: (el.pageXOffset !== undefined) ? el.pageXOffset : el.scrollLeft,
y: (el.pageYOffset !== undefined) ? el.pageYOffset : el.scrollTop});
-// getScrollPosition() -> {x: 0, y: 200}
+```
+
+```js
+getScrollPosition() // {x: 0, y: 200}
```
diff --git a/snippets/getType.md b/snippets/getType.md
index 53f660420..655f62adb 100644
--- a/snippets/getType.md
+++ b/snippets/getType.md
@@ -7,5 +7,8 @@ Returns lowercased constructor name of value, "undefined" or "null" if value is
```js
const getType = v =>
v === undefined ? 'undefined' : v === null ? 'null' : v.constructor.name.toLowerCase();
-// getType(new Set([1,2,3])) -> "set"
+```
+
+```js
+getType(new Set([1,2,3])) // "set"
```
diff --git a/snippets/getURLParameters.md b/snippets/getURLParameters.md
index 77dddd532..b1e138450 100644
--- a/snippets/getURLParameters.md
+++ b/snippets/getURLParameters.md
@@ -10,5 +10,8 @@ const getURLParameters = url =>
url.match(/([^?=&]+)(=([^&]*))/g).reduce(
(a, v) => (a[v.slice(0, v.indexOf('='))] = v.slice(v.indexOf('=') + 1), a), {}
);
-// getURLParameters('http://url.com/page?name=Adam&surname=Smith') -> {name: 'Adam', surname: 'Smith'}
+```
+
+```js
+getURLParameters('http://url.com/page?name=Adam&surname=Smith') // {name: 'Adam', surname: 'Smith'}
```
diff --git a/snippets/groupBy.md b/snippets/groupBy.md
index d83795fdc..bebea215c 100644
--- a/snippets/groupBy.md
+++ b/snippets/groupBy.md
@@ -9,6 +9,9 @@ Use `Array.reduce()` to create an object, where the keys are produced from the m
const groupBy = (arr, func) =>
arr.map(typeof func === 'function' ? func : val => val[func])
.reduce((acc, val, i) => { acc[val] = (acc[val] || []).concat(arr[i]); return acc; }, {});
-// groupBy([6.1, 4.2, 6.3], Math.floor) -> {4: [4.2], 6: [6.1, 6.3]}
-// groupBy(['one', 'two', 'three'], 'length') -> {3: ['one', 'two'], 5: ['three']}
+```
+
+```js
+groupBy([6.1, 4.2, 6.3], Math.floor) // {4: [4.2], 6: [6.1, 6.3]}
+groupBy(['one', 'two', 'three'], 'length') // {3: ['one', 'two'], 5: ['three']}
```
diff --git a/snippets/hammingDistance.md b/snippets/hammingDistance.md
index 97c08d2aa..aedc72ce8 100644
--- a/snippets/hammingDistance.md
+++ b/snippets/hammingDistance.md
@@ -8,5 +8,8 @@ Count and return the number of `1`s in the string, using `match(/1/g)`.
```js
const hammingDistance = (num1, num2) =>
((num1 ^ num2).toString(2).match(/1/g) || '').length;
-// hammingDistance(2,3) -> 1
+```
+
+```js
+hammingDistance(2,3) // 1
```
diff --git a/snippets/head.md b/snippets/head.md
index ece926a50..b48d9bb1d 100644
--- a/snippets/head.md
+++ b/snippets/head.md
@@ -6,5 +6,8 @@ Use `arr[0]` to return the first element of the passed array.
```js
const head = arr => arr[0];
-// head([1,2,3]) -> 1
+```
+
+```js
+head([1,2,3]) // 1
```
diff --git a/snippets/hexToRGB.md b/snippets/hexToRGB.md
index c86004039..89db399ad 100644
--- a/snippets/hexToRGB.md
+++ b/snippets/hexToRGB.md
@@ -16,7 +16,10 @@ const hexToRGB = hex => {
((h & (alpha ? 0x0000ff00 : 0x0000ff)) >>> (alpha ? 8 : 0)) +
(alpha ? `, ${(h & 0x000000ff)}` : '') + ')';
};
-// hexToRGB('#27ae60ff') -> 'rgba(39, 174, 96, 255)'
-// hexToRGB('27ae60') -> 'rgb(39, 174, 96)'
-// hexToRGB('#fff') -> 'rgb(255, 255, 255)'
+```
+
+```js
+hexToRGB('#27ae60ff') // 'rgba(39, 174, 96, 255)'
+hexToRGB('27ae60') // 'rgb(39, 174, 96)'
+hexToRGB('#fff') // 'rgb(255, 255, 255)'
```
diff --git a/snippets/inRange.md b/snippets/inRange.md
index ab4a610e7..aedef5ef1 100644
--- a/snippets/inRange.md
+++ b/snippets/inRange.md
@@ -1,6 +1,6 @@
### inRange
-Checks if the given number falls within the given range.
+Checks if the given number falls within the given range.
Use arithmetic comparison to check if the given number is in the specified range.
If the second parameter, `end`, is not specified, the range is considered to be from `0` to `start`.
@@ -10,8 +10,11 @@ const inRange = (n, start, end = null) => {
if (end && start > end) end = [start, start = end][0];
return (end == null) ? (n >= 0 && n < start) : (n >= start && n < end);
};
-// inRange(3, 2, 5) -> true
-// inRange(3, 4) -> true
-// inRange(2, 3, 5) -> false
-// inrange(3, 2) -> false
+```
+
+```js
+inRange(3, 2, 5) // true
+inRange(3, 4) // true
+inRange(2, 3, 5) // false
+inrange(3, 2) // false
```
diff --git a/snippets/initial.md b/snippets/initial.md
index 7b1c5c68c..be178bcc8 100644
--- a/snippets/initial.md
+++ b/snippets/initial.md
@@ -6,5 +6,8 @@ Use `arr.slice(0,-1)` to return all but the last element of the array.
```js
const initial = arr => arr.slice(0, -1);
-// initial([1,2,3]) -> [1,2]
+```
+
+```js
+initial([1,2,3]) // [1,2]
```
diff --git a/snippets/initialize2DArray.md b/snippets/initialize2DArray.md
index 0cb1df126..bde4ba879 100644
--- a/snippets/initialize2DArray.md
+++ b/snippets/initialize2DArray.md
@@ -6,5 +6,8 @@ Use `Array.map()` to generate h rows where each is a new array of size w initial
```js
const initialize2DArray = (w, h, val = null) => Array(h).fill().map(() => Array(w).fill(val));
-// initializeArrayWithRange(2, 2, 0) -> [[0,0], [0,0]]
+```
+
+```js
+initialize2DArray(2, 2, 0) // [[0,0], [0,0]]
```
diff --git a/snippets/initializeArrayWithRange.md b/snippets/initializeArrayWithRange.md
index 3fefca2ed..9c3b0c8f4 100644
--- a/snippets/initializeArrayWithRange.md
+++ b/snippets/initializeArrayWithRange.md
@@ -8,6 +8,9 @@ You can omit `start` to use a default value of `0`.
```js
const initializeArrayWithRange = (end, start = 0) =>
Array.from({ length: (end + 1) - start }).map((v, i) => i + start);
-// initializeArrayWithRange(5) -> [0,1,2,3,4,5]
-// initializeArrayWithRange(7, 3) -> [3,4,5,6,7]
+```
+
+```js
+initializeArrayWithRange(5) // [0,1,2,3,4,5]
+initializeArrayWithRange(7, 3) // [3,4,5,6,7]
```
diff --git a/snippets/initializeArrayWithValues.md b/snippets/initializeArrayWithValues.md
index 47459fcdd..a8ac57bc5 100644
--- a/snippets/initializeArrayWithValues.md
+++ b/snippets/initializeArrayWithValues.md
@@ -7,5 +7,8 @@ You can omit `value` to use a default value of `0`.
```js
const initializeArrayWithValues = (n, value = 0) => Array(n).fill(value);
-// initializeArrayWithValues(5, 2) -> [2,2,2,2,2]
+```
+
+```js
+initializeArrayWithValues(5, 2) // [2,2,2,2,2]
```
diff --git a/snippets/intersection.md b/snippets/intersection.md
index 1c367cd92..960433b6e 100644
--- a/snippets/intersection.md
+++ b/snippets/intersection.md
@@ -6,5 +6,8 @@ Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values co
```js
const intersection = (a, b) => { const s = new Set(b); return a.filter(x => s.has(x)); };
-// intersection([1,2,3], [4,3,2]) -> [2,3]
+```
+
+```js
+intersection([1,2,3], [4,3,2]) // [2,3]
```
diff --git a/snippets/isArmstrongNumber.md b/snippets/isArmstrongNumber.md
index a680d607e..171019069 100644
--- a/snippets/isArmstrongNumber.md
+++ b/snippets/isArmstrongNumber.md
@@ -7,7 +7,10 @@ Convert the given number into an array of digits. Use `Math.pow()` to get the ap
```js
const isArmstrongNumber = digits =>
(arr => arr.reduce((a, d) => a + Math.pow(parseInt(d), arr.length), 0) == digits)((digits + '').split(''));
-// isArmstrongNumber(1634) -> true
-// isArmstrongNumber(371) -> true
-// isArmstrongNumber(56) -> false
+```
+
+```js
+isArmstrongNumber(1634) // true
+isArmstrongNumber(371) // true
+isArmstrongNumber(56) // false
```
diff --git a/snippets/isArray.md b/snippets/isArray.md
index f6e410719..3fa987f4f 100644
--- a/snippets/isArray.md
+++ b/snippets/isArray.md
@@ -6,6 +6,9 @@ Use `Array.isArray()` to check if a value is classified as an array.
```js
const isArray = val => !!val && Array.isArray(val);
-// isArray(null) -> false
-// isArray([1]) -> true
+```
+
+```js
+isArray(null) // false
+isArray([1]) // true
```
diff --git a/snippets/isBoolean.md b/snippets/isBoolean.md
index ae402c5e4..3e7022df9 100644
--- a/snippets/isBoolean.md
+++ b/snippets/isBoolean.md
@@ -6,6 +6,9 @@ Use `typeof` to check if a value is classified as a boolean primitive.
```js
const isBoolean = val => typeof val === 'boolean';
-// isBoolean(null) -> false
-// isBoolean(false) -> true
+```
+
+```js
+isBoolean(null) // false
+isBoolean(false) // true
```
diff --git a/snippets/isDivisible.md b/snippets/isDivisible.md
index 5adad9453..b7a5614f0 100644
--- a/snippets/isDivisible.md
+++ b/snippets/isDivisible.md
@@ -6,5 +6,8 @@ Use the modulo operator (`%`) to check if the remainder is equal to `0`.
```js
const isDivisible = (dividend, divisor) => dividend % divisor === 0;
-// isDivisible(6,3) -> true
+```
+
+```js
+isDivisible(6,3) // true
```
diff --git a/snippets/isEven.md b/snippets/isEven.md
index 5dfcb414f..2e3312309 100644
--- a/snippets/isEven.md
+++ b/snippets/isEven.md
@@ -7,5 +7,8 @@ Returns `true` if the number is even, `false` if the number is odd.
```js
const isEven = num => num % 2 === 0;
-// isEven(3) -> false
+```
+
+```js
+isEven(3) // false
```
diff --git a/snippets/isFunction.md b/snippets/isFunction.md
index af5960e00..d1c0a722d 100644
--- a/snippets/isFunction.md
+++ b/snippets/isFunction.md
@@ -6,6 +6,9 @@ Use `typeof` to check if a value is classified as a function primitive.
```js
const isFunction = val => val && typeof val === 'function';
-// isFunction('x') -> false
-// isFunction(x => x) -> true
+```
+
+```js
+isFunction('x') // false
+isFunction(x => x) // true
```
diff --git a/snippets/isNumber.md b/snippets/isNumber.md
index 83b33bc11..f14a608e5 100644
--- a/snippets/isNumber.md
+++ b/snippets/isNumber.md
@@ -6,6 +6,9 @@ Use `typeof` to check if a value is classified as a number primitive.
```js
const isNumber = val => typeof val === 'number';
-// isNumber('1') -> false
-// isNumber(1) -> true
```
+
+```js
+isNumber('1') // false
+isNumber(1) // true
+```
\ No newline at end of file
diff --git a/snippets/isPrime.md b/snippets/isPrime.md
index 6f77ebd6c..b0d23c80e 100644
--- a/snippets/isPrime.md
+++ b/snippets/isPrime.md
@@ -2,7 +2,7 @@
Checks if the provided integer is a prime number.
-Check numbers from `2` to the square root of the given number.
+Check numbers from `2` to the square root of the given number.
Return `false` if any of them divides the given number, else return `true`, unless the number is less than `2`.
```js
@@ -11,6 +11,9 @@ const isPrime = num => {
for (var i = 2; i * i <= boundary; i++) if (num % i == 0) return false;
return num >= 2;
};
-// isPrime(11) -> true
-// isPrime(12) -> false
+```
+
+```js
+isPrime(11) // true
+isPrime(12) // false
```
diff --git a/snippets/isString.md b/snippets/isString.md
index 775e050a4..1e0dbcef6 100644
--- a/snippets/isString.md
+++ b/snippets/isString.md
@@ -6,6 +6,9 @@ Use `typeof` to check if a value is classified as a string primitive.
```js
const isString = val => typeof val === 'string';
-// isString(10) -> false
-// isString('10') -> true
+```
+
+```js
+isString(10) // false
+isString('10') // true
```
diff --git a/snippets/isSymbol.md b/snippets/isSymbol.md
index a4ec67dc8..a0ae667eb 100644
--- a/snippets/isSymbol.md
+++ b/snippets/isSymbol.md
@@ -6,6 +6,9 @@ Use `typeof` to check if a value is classified as a symbol primitive.
```js
const isSymbol = val => typeof val === 'symbol';
-// isSymbol('x') -> false
-// isSymbol(Symbol('x')) -> true
+```
+
+```js
+isSymbol('x') // false
+isSymbol(Symbol('x')) // true
```
diff --git a/snippets/last.md b/snippets/last.md
index 481e2d6e0..3dd1cf680 100644
--- a/snippets/last.md
+++ b/snippets/last.md
@@ -6,5 +6,8 @@ Use `arr.length - 1` to compute the index of the last element of the given array
```js
const last = arr => arr[arr.length - 1];
-// last([1,2,3]) -> 3
+```
+
+```js
+last([1,2,3]) // 3
```
diff --git a/snippets/lcm.md b/snippets/lcm.md
index ef8ea7fdc..437f32a5d 100644
--- a/snippets/lcm.md
+++ b/snippets/lcm.md
@@ -10,5 +10,8 @@ const lcm = (x, y) => {
const gcd = (x, y) => !y ? x : gcd(y, x % y);
return Math.abs(x * y) / (gcd(x, y));
};
-// lcm(12,7) -> 84
+```
+
+```js
+lcm(12,7) // 84
```
diff --git a/snippets/mapObject.md b/snippets/mapObject.md
index f9d65ee32..bead463a6 100644
--- a/snippets/mapObject.md
+++ b/snippets/mapObject.md
@@ -7,8 +7,9 @@ Use an anonymous inner function scope to declare an undefined memory space, usin
```js
const mapObject = (arr, fn) =>
(a => (a = [arr, arr.map(fn)], a[0].reduce((acc, val, ind) => (acc[val] = a[1][ind], acc), {})))();
-/*
+```
+
+```js
const squareIt = arr => mapObject(arr, a => a*a)
squareIt([1,2,3]) // { 1: 1, 2: 4, 3: 9 }
-*/
```
diff --git a/snippets/median.md b/snippets/median.md
index c7eea609c..77ec63fdf 100644
--- a/snippets/median.md
+++ b/snippets/median.md
@@ -10,6 +10,9 @@ const median = arr => {
const mid = Math.floor(arr.length / 2), nums = [...arr].sort((a, b) => a - b);
return arr.length % 2 !== 0 ? nums[mid] : (nums[mid - 1] + nums[mid]) / 2;
};
-// median([5,6,50,1,-5]) -> 5
-// median([0,10,-2,7]) -> 3.5
+```
+
+```js
+median([5,6,50,1,-5]) // 5
+median([0,10,-2,7]) // 3.5
```
diff --git a/snippets/negate.md b/snippets/negate.md
index 5f14e4a0f..fd8856b2f 100644
--- a/snippets/negate.md
+++ b/snippets/negate.md
@@ -6,6 +6,9 @@ Take a predicate function and apply `not` to it with its arguments.
```js
const negate = func => (...args) => !func(...args);
-// filter([1, 2, 3, 4, 5, 6], negate(isEven)) -> [1, 3, 5]
-// negate(isOdd)(1) -> false
+```
+
+```js
+filter([1, 2, 3, 4, 5, 6], negate(isEven)) // [1, 3, 5]
+negate(isOdd)(1) // false
```
diff --git a/snippets/nthElement.md b/snippets/nthElement.md
index be1da2ce0..61cabe26e 100644
--- a/snippets/nthElement.md
+++ b/snippets/nthElement.md
@@ -8,6 +8,9 @@ Omit the second argument, `n`, to get the first element of the array.
```js
const nthElement = (arr, n = 0) => (n > 0 ? arr.slice(n, n + 1) : arr.slice(n))[0];
-// nthElement(['a','b','c'],1) -> 'b'
-// nthElement(['a','b','b'],-3) -> 'a'
+```
+
+```js
+nthElement(['a','b','c'],1) // 'b'
+nthElement(['a','b','b'],-3) // 'a'
```
diff --git a/snippets/objectFromPairs.md b/snippets/objectFromPairs.md
index ebdacb92c..5066ff528 100644
--- a/snippets/objectFromPairs.md
+++ b/snippets/objectFromPairs.md
@@ -6,5 +6,8 @@ Use `Array.reduce()` to create and combine key-value pairs.
```js
const objectFromPairs = arr => arr.reduce((a, v) => (a[v[0]] = v[1], a), {});
-// objectFromPairs([['a',1],['b',2]]) -> {a: 1, b: 2}
+```
+
+```js
+objectFromPairs([['a',1],['b',2]]) // {a: 1, b: 2}
```
diff --git a/snippets/objectToPairs.md b/snippets/objectToPairs.md
index 7a6079650..6d73bc93b 100644
--- a/snippets/objectToPairs.md
+++ b/snippets/objectToPairs.md
@@ -6,5 +6,8 @@ Use `Object.keys()` and `Array.map()` to iterate over the object's keys and prod
```js
const objectToPairs = obj => Object.keys(obj).map(k => [k, obj[k]]);
-// objectToPairs({a: 1, b: 2}) -> [['a',1],['b',2]])
+```
+
+```js
+objectToPairs({a: 1, b: 2}) // [['a',1],['b',2]])
```
diff --git a/snippets/orderBy.md b/snippets/orderBy.md
index c80b3667f..48c1d1172 100644
--- a/snippets/orderBy.md
+++ b/snippets/orderBy.md
@@ -16,10 +16,11 @@ const orderBy = (arr, props, orders) =>
return acc;
}, 0)
);
-/*
+```
+
+```js
const users = [{ 'name': 'fred', 'age': 48 },{ 'name': 'barney', 'age': 36 },
{ 'name': 'fred', 'age': 40 },{ 'name': 'barney', 'age': 34 }];
-orderby(users, ['name', 'age'], ['asc', 'desc']) -> [{name: 'barney', age: 36}, {name: 'barney', age: 34}, {name: 'fred', age: 48}, {name: 'fred', age: 40}]
-orderby(users, ['name', 'age']) -> [{name: 'barney', age: 34}, {name: 'barney', age: 36}, {name: 'fred', age: 40}, {name: 'fred', age: 48}]
-*/
+orderby(users, ['name', 'age'], ['asc', 'desc']) // [{name: 'barney', age: 36}, {name: 'barney', age: 34}, {name: 'fred', age: 48}, {name: 'fred', age: 40}]
+orderby(users, ['name', 'age']) // [{name: 'barney', age: 34}, {name: 'barney', age: 36}, {name: 'fred', age: 40}, {name: 'fred', age: 48}]
```
diff --git a/snippets/palindrome.md b/snippets/palindrome.md
index cca1bb729..41993b9d1 100644
--- a/snippets/palindrome.md
+++ b/snippets/palindrome.md
@@ -7,8 +7,11 @@ Then, `split('')` into individual characters, `reverse()`, `join('')` and compar
```js
const palindrome = str => {
- const s = str.toLowerCase().replace(/[\W_]/g,'');
+ const s = str.toLowerCase().replace(/[\W_]/g, '');
return s === s.split('').reverse().join('');
-}
-// palindrome('taco cat') -> true
- ```
+};
+```
+
+```js
+palindrome('taco cat') // true
+```
diff --git a/snippets/percentile.md b/snippets/percentile.md
index 7485494e2..ad7a456d1 100644
--- a/snippets/percentile.md
+++ b/snippets/percentile.md
@@ -6,6 +6,9 @@ Use `Array.reduce()` to calculate how many numbers are below the value and how m
```js
const percentile = (arr, val) =>
- 100 * arr.reduce((acc,v) => acc + (v < val ? 1 : 0) + (v === val ? 0.5 : 0), 0) / arr.length;
-// percentile([1,2,3,4,5,6,7,8,9,10], 6) -> 55
- ```
+ 100 * arr.reduce((acc, v) => acc + (v < val ? 1 : 0) + (v === val ? 0.5 : 0), 0) / arr.length;
+```
+
+```js
+percentile([1,2,3,4,5,6,7,8,9,10], 6) // 55
+```
diff --git a/snippets/pick.md b/snippets/pick.md
index 668c9d30c..f59ff2ba6 100644
--- a/snippets/pick.md
+++ b/snippets/pick.md
@@ -7,5 +7,8 @@ Use `Array.reduce()` to convert the filtered/picked keys back to an object with
```js
const pick = (obj, arr) =>
arr.reduce((acc, curr) => (curr in obj && (acc[curr] = obj[curr]), acc), {});
-// pick({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c']) -> { 'a': 1, 'c': 3 }
+```
+
+```js
+pick({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c']) // { 'a': 1, 'c': 3 }
```
diff --git a/snippets/pipeFunctions.md b/snippets/pipeFunctions.md
index 04c9f3ee1..4b23ba8fd 100644
--- a/snippets/pipeFunctions.md
+++ b/snippets/pipeFunctions.md
@@ -7,10 +7,11 @@ The first (leftmost) function can accept one or more arguments; the remaining fu
```js
const pipeFunctions = (...fns) => fns.reduce((f, g) => (...args) => g(f(...args)));
-/*
+```
+
+```js
const add5 = x => x + 5
const multiply = (x, y) => x * y
const multiplyAndAdd5 = pipeFunctions(multiply, add5)
-multiplyAndAdd5(5, 2) -> 15
-*/
+multiplyAndAdd5(5, 2) // 15
```
diff --git a/snippets/powerset.md b/snippets/powerset.md
index 09b233212..3e1651174 100644
--- a/snippets/powerset.md
+++ b/snippets/powerset.md
@@ -7,5 +7,8 @@ Use `Array.reduce()` combined with `Array.map()` to iterate over elements and co
```js
const powerset = arr =>
arr.reduce((a, v) => a.concat(a.map(r => [v].concat(r))), [[]]);
-// powerset([1,2]) -> [[], [1], [2], [2,1]]
+```
+
+```js
+powerset([1,2]) // [[], [1], [2], [2,1]]
```
diff --git a/snippets/primes.md b/snippets/primes.md
index 109192e7c..c98acca9b 100644
--- a/snippets/primes.md
+++ b/snippets/primes.md
@@ -1,4 +1,4 @@
-### primes
+### primes
Generates primes up to a given number, using the Sieve of Eratosthenes.
@@ -12,5 +12,8 @@ const primes = num => {
numsTillSqroot.forEach(x => arr = arr.filter(y => ((y % x) !== 0) || (y == x)));
return arr;
};
-// primes(10) -> [2,3,5,7]
+```
+
+```js
+primes(10) // [2,3,5,7]
```
diff --git a/snippets/promisify.md b/snippets/promisify.md
index 80a7d48d0..f4a414cc1 100644
--- a/snippets/promisify.md
+++ b/snippets/promisify.md
@@ -14,6 +14,9 @@ const promisify = func =>
func(...args, (err, result) =>
err ? reject(err) : resolve(result))
);
-// const delay = promisify((d, cb) => setTimeout(cb, d))
-// delay(2000).then(() => console.log('Hi!')) -> Promise resolves after 2s
+```
+
+```js
+const delay = promisify((d, cb) => setTimeout(cb, d))
+delay(2000).then(() => console.log('Hi!')) // // Promise resolves after 2s
```
diff --git a/snippets/pull.md b/snippets/pull.md
index 3848e27dd..153732ffd 100644
--- a/snippets/pull.md
+++ b/snippets/pull.md
@@ -14,12 +14,14 @@ const pull = (arr, ...args) => {
arr.length = 0;
pulled.forEach(v => arr.push(v));
};
-
-// let myArray1 = ['a', 'b', 'c', 'a', 'b', 'c'];
-// pull(myArray1, 'a', 'c');
-// console.log(myArray1) -> [ 'b', 'b' ]
-
-// let myArray2 = ['a', 'b', 'c', 'a', 'b', 'c'];
-// pull(myArray2, ['a', 'c']);
-// console.log(myArray2) -> [ 'b', 'b' ]
+```
+
+```js
+let myArray1 = ['a', 'b', 'c', 'a', 'b', 'c'];
+pull(myArray1, 'a', 'c');
+console.log(myArray1) // [ 'b', 'b' ]
+
+let myArray2 = ['a', 'b', 'c', 'a', 'b', 'c'];
+pull(myArray2, ['a', 'c']);
+console.log(myArray2) // [ 'b', 'b' ]
```
diff --git a/snippets/pullAtIndex.md b/snippets/pullAtIndex.md
index e848cc7c7..ba2646d9a 100644
--- a/snippets/pullAtIndex.md
+++ b/snippets/pullAtIndex.md
@@ -4,7 +4,7 @@ Mutates the original array to filter out the values at the specified indexes.
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.
-Use `Array.push()` to keep track of pulled values
+Use `Array.push()` to keep track of pulled values
```js
const pullAtIndex = (arr, pullArr) => {
@@ -15,10 +15,12 @@ const pullAtIndex = (arr, pullArr) => {
pulled.forEach(v => arr.push(v));
return removed;
};
-
-// let myArray = ['a', 'b', 'c', 'd'];
-// let pulled = pullAtIndex(myArray, [1, 3]);
-
-// console.log(myArray); -> [ 'a', 'c' ]
-// console.log(pulled); -> [ 'b', 'd' ]
+```
+
+```js
+let myArray = ['a', 'b', 'c', 'd'];
+let pulled = pullAtIndex(myArray, [1, 3]);
+
+console.log(myArray); // [ 'a', 'c' ]
+console.log(pulled); // [ 'b', 'd' ]
```
diff --git a/snippets/pullAtValue.md b/snippets/pullAtValue.md
index c092933e4..aa38eb625 100644
--- a/snippets/pullAtValue.md
+++ b/snippets/pullAtValue.md
@@ -4,7 +4,7 @@ Mutates the original array to filter out the values specified. Returns the remov
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.
-Use `Array.push()` to keep track of pulled values
+Use `Array.push()` to keep track of pulled values
```js
const pullAtValue = (arr, pullArr) => {
@@ -15,10 +15,11 @@ const pullAtValue = (arr, pullArr) => {
mutateTo.forEach(v => arr.push(v));
return removed;
};
-/*
+```
+
+```js
let myArray = ['a', 'b', 'c', 'd'];
let pulled = pullAtValue(myArray, ['b', 'd']);
-console.log(myArray); -> [ 'a', 'c' ]
-console.log(pulled); -> [ 'b', 'd' ]
-*/
+console.log(myArray); // [ 'a', 'c' ]
+console.log(pulled); // [ 'b', 'd' ]
```
diff --git a/snippets/randomHexColor.md b/snippets/randomHexColor.md
deleted file mode 100644
index f7cdbc26e..000000000
--- a/snippets/randomHexColor.md
+++ /dev/null
@@ -1,16 +0,0 @@
-### randomHexColor
-
-Generates a random hexadecimal color code.
-
-Use `Math.random` to generate a random 24-bit(6x4bits) hexadecimal number. Use bit shifting and then convert it to an hexadecimal String using `toString(16)`.
-
-```js
-const randomHexColor = () => {
- let n = (Math.random() * 0xfffff | 0).toString(16);
- return '#' + (n.length !== 6
- ? (Math.random() * 0xf | 0).toString(16) + n : n);
-};
-// randomHexColorCode() -> "#e34155"
-// randomHexColorCode() -> "#fd73a6"
-// randomHexColorCode() -> "#4144c6"
-```
diff --git a/snippets/randomHexColorCode.md b/snippets/randomHexColorCode.md
new file mode 100644
index 000000000..4b273774b
--- /dev/null
+++ b/snippets/randomHexColorCode.md
@@ -0,0 +1,19 @@
+### randomHexColorCode
+
+Generates a random hexadecimal color code.
+
+Use `Math.random` to generate a random 24-bit(6x4bits) hexadecimal number. Use bit shifting and then convert it to an hexadecimal String using `toString(16)`.
+
+```js
+const randomHexColorCode = () => {
+ let n = (Math.random() * 0xfffff | 0).toString(16);
+ return '#' + (n.length !== 6
+ ? (Math.random() * 0xf | 0).toString(16) + n : n);
+};
+```
+
+```js
+randomHexColorCode() // "#e34155"
+randomHexColorCode() // "#fd73a6"
+randomHexColorCode() // "#4144c6"
+```
diff --git a/snippets/randomIntegerInRange.md b/snippets/randomIntegerInRange.md
index 2d35fd279..95e9383aa 100644
--- a/snippets/randomIntegerInRange.md
+++ b/snippets/randomIntegerInRange.md
@@ -6,5 +6,8 @@ Use `Math.random()` to generate a random number and map it to the desired range,
```js
const randomIntegerInRange = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
-// randomIntegerInRange(0, 5) -> 2
+```
+
+```js
+randomIntegerInRange(0, 5) // 2
```
diff --git a/snippets/randomNumberInRange.md b/snippets/randomNumberInRange.md
index a92dfff54..b249c0e51 100644
--- a/snippets/randomNumberInRange.md
+++ b/snippets/randomNumberInRange.md
@@ -6,5 +6,8 @@ Use `Math.random()` to generate a random value, map it to the desired range usin
```js
const randomNumberInRange = (min, max) => Math.random() * (max - min) + min;
-// randomNumberInRange(2,10) -> 6.0211363285087005
+```
+
+```js
+randomNumberInRange(2,10) // 6.0211363285087005
```
diff --git a/snippets/readFileLines.md b/snippets/readFileLines.md
index 17cb4788f..5568f2268 100644
--- a/snippets/readFileLines.md
+++ b/snippets/readFileLines.md
@@ -8,14 +8,18 @@ creating an array from contents of file by `split`ing file content line by line
```js
const fs = require('fs');
-const readFileLines = filename => fs.readFileSync(filename).toString('UTF8').split(/\r?\n/);
-/*
- contents of test.txt :
- line1
- line2
- line3
- ___________________________
- let arr = readFileLines('test.txt')
- console.log(arr) // -> ['line1', 'line2', 'line3']
- */
+const readFileLines = filename => fs.readFileSync(filename).toString('UTF8').split('\n');
```
+
+```js
+/*
+contents of test.txt :
+ line1
+ line2
+ line3
+ ___________________________
+*/
+let arr = readFileLines('test.txt')
+console.log(arr) // ['line1', 'line2', 'line3']
+```
+
diff --git a/snippets/redirect.md b/snippets/redirect.md
index d98e2caf2..006d5acd0 100644
--- a/snippets/redirect.md
+++ b/snippets/redirect.md
@@ -8,5 +8,8 @@ Pass a second argument to simulate a link click (`true` - default) or an HTTP re
```js
const redirect = (url, asLink = true) =>
asLink ? window.location.href = url : window.location.replace(url);
-// redirect('https://google.com')
+```
+
+```js
+redirect('https://google.com')
```
diff --git a/snippets/remove.md b/snippets/remove.md
index 25606c21b..aec1dab10 100644
--- a/snippets/remove.md
+++ b/snippets/remove.md
@@ -11,5 +11,8 @@ const remove = (arr, func) =>
arr.splice(arr.indexOf(val), 1); return acc.concat(val);
}, [])
: [];
-// remove([1, 2, 3, 4], n => n % 2 == 0) -> [2, 4]
+```
+
+```js
+remove([1, 2, 3, 4], n => n % 2 == 0) // [2, 4]
```
diff --git a/snippets/repeatString.md b/snippets/repeatString.md
index c7478acb2..008e976a6 100644
--- a/snippets/repeatString.md
+++ b/snippets/repeatString.md
@@ -8,6 +8,9 @@ If no string is provided the default is `""` and the default number of times is
const repeatString = (str = '', num = 2) => {
return num >= 0 ? str.repeat(num) : str;
};
-// repeatString("abc",3) -> 'abcabcabc'
-// repeatString("abc") -> 'abcabc'
+```
+
+```js
+repeatString("abc",3) // 'abcabcabc'
+repeatString("abc") // 'abcabc'
```
diff --git a/snippets/reverseString.md b/snippets/reverseString.md
index 5564a5897..d34aac630 100644
--- a/snippets/reverseString.md
+++ b/snippets/reverseString.md
@@ -7,5 +7,8 @@ Combine characters to get a string using `join('')`.
```js
const reverseString = str => str.split('').reverse().join('');
-// reverseString('foobar') -> 'raboof'
+```
+
+```js
+reverseString('foobar') // 'raboof'
```
diff --git a/snippets/round.md b/snippets/round.md
index 81e90dfe0..f6af435bb 100644
--- a/snippets/round.md
+++ b/snippets/round.md
@@ -7,5 +7,8 @@ Omit the second argument, `decimals` to round to an integer.
```js
const round = (n, decimals = 0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`);
-// round(1.005, 2) -> 1.01
+```
+
+```js
+round(1.005, 2) // 1.01
```
diff --git a/snippets/runPromisesInSeries.md b/snippets/runPromisesInSeries.md
index c1cedb147..d45b00d07 100644
--- a/snippets/runPromisesInSeries.md
+++ b/snippets/runPromisesInSeries.md
@@ -6,6 +6,9 @@ Use `Array.reduce()` to create a promise chain, where each promise returns the n
```js
const runPromisesInSeries = ps => ps.reduce((p, next) => p.then(next), Promise.resolve());
-// const delay = (d) => new Promise(r => setTimeout(r, d))
-// runPromisesInSeries([() => delay(1000), () => delay(2000)]) -> executes each promise sequentially, taking a total of 3 seconds to complete
+```
+
+```js
+const delay = (d) => new Promise(r => setTimeout(r, d))
+runPromisesInSeries([() => delay(1000), () => delay(2000)]) // //executes each promise sequentially, taking a total of 3 seconds to complete
```
diff --git a/snippets/sample.md b/snippets/sample.md
index caf1941e3..8a5dc3292 100644
--- a/snippets/sample.md
+++ b/snippets/sample.md
@@ -7,5 +7,8 @@ This method also works with strings.
```js
const sample = arr => arr[Math.floor(Math.random() * arr.length)];
-// sample([3, 7, 9, 11]) -> 9
+```
+
+```js
+sample([3, 7, 9, 11]) // 9
```
diff --git a/snippets/scrollToTop.md b/snippets/scrollToTop.md
index 62cad2588..90c0342a8 100644
--- a/snippets/scrollToTop.md
+++ b/snippets/scrollToTop.md
@@ -13,5 +13,8 @@ const scrollToTop = () => {
window.scrollTo(0, c - c / 8);
}
};
-// scrollToTop()
+```
+
+```js
+scrollToTop()
```
diff --git a/snippets/sdbmHashAlgorithm.md b/snippets/sdbm.md
similarity index 78%
rename from snippets/sdbmHashAlgorithm.md
rename to snippets/sdbm.md
index c68cded64..87c63ebfc 100644
--- a/snippets/sdbmHashAlgorithm.md
+++ b/snippets/sdbm.md
@@ -1,4 +1,4 @@
-### sdbmHashAlgorithm
+### sbdm
This algorithm is a simple hash-algorithm that hashes it input string `s` into a whole number.
@@ -11,6 +11,9 @@ const sdbm = str => {
hashCode = currentVal.charCodeAt(0) + (hashCode << 6) + (hashCode << 16) - hashCode
,0)
}
-// console.log(sdbm("name")) // -3521204949
-// console.log(sdbm("age")) // 808122783
+```
+
+```js
+console.log(sdbm("name")) // -3521204949
+console.log(sdbm("age")) // 808122783
```
diff --git a/snippets/select.md b/snippets/select.md
index ee243bb8e..1c6ff462f 100644
--- a/snippets/select.md
+++ b/snippets/select.md
@@ -7,7 +7,9 @@ If the property does not exists returns `undefined`.
```js
const select = (from, selector) =>
selector.split('.').reduce((prev, cur) => prev && prev[cur], from);
-
-// const obj = {selector: {to: {val: 'val to select'}}};
-// select(obj, 'selector.to.val'); -> 'val to select'
+```
+
+```js
+const obj = {selector: {to: {val: 'val to select'}}};
+select(obj, 'selector.to.val'); // 'val to select'
```
diff --git a/snippets/shallowClone.md b/snippets/shallowClone.md
index 0a6c25d82..2eed68a58 100644
--- a/snippets/shallowClone.md
+++ b/snippets/shallowClone.md
@@ -6,9 +6,10 @@ Use `Object.assign()` and an empty object (`{}`) to create a shallow clone of th
```js
const shallowClone = obj => Object.assign({}, obj);
-/*
+```
+
+```js
const a = { x: true, y: 1 };
const b = shallowClone(a);
-a === b -> false
-*/
+a === b // false
```
diff --git a/snippets/shuffle.md b/snippets/shuffle.md
index fa576b016..4e7f88879 100644
--- a/snippets/shuffle.md
+++ b/snippets/shuffle.md
@@ -13,7 +13,10 @@ const shuffle = ([...arr]) => {
}
return arr;
};
-// const foo = [1,2,3]
-// shuffle(foo) -> [2,3,1]
-// console.log(foo) -> [1,2,3]
+```
+
+```js
+const foo = [1,2,3]
+shuffle(foo) // [2,3,1]
+console.log(foo) // [1,2,3]
```
diff --git a/snippets/similarity.md b/snippets/similarity.md
index 1a2cc7ccb..6a3c89b38 100644
--- a/snippets/similarity.md
+++ b/snippets/similarity.md
@@ -6,5 +6,8 @@ Use `filter()` to remove values that are not part of `values`, determined using
```js
const similarity = (arr, values) => arr.filter(v => values.includes(v));
-// similarity([1,2,3], [1,2,4]) -> [1,2]
+```
+
+```js
+similarity([1,2,3], [1,2,4]) // [1,2]
```
diff --git a/snippets/sleep.md b/snippets/sleep.md
index 66a45d2ff..69fd73059 100644
--- a/snippets/sleep.md
+++ b/snippets/sleep.md
@@ -6,11 +6,12 @@ Delay executing part of an `async` function, by putting it to sleep, returning a
```js
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
-/*
+```
+
+```js
async function sleepyWork() {
console.log('I\'m going to sleep for 1 second.');
await sleep(1000);
console.log('I woke up after 1 second.');
}
-*/
```
diff --git a/snippets/sortCharactersInString.md b/snippets/sortCharactersInString.md
index 79c7acc0f..8bdc6bcce 100644
--- a/snippets/sortCharactersInString.md
+++ b/snippets/sortCharactersInString.md
@@ -7,5 +7,8 @@ Split the string using `split('')`, `Array.sort()` utilizing `localeCompare()`,
```js
const sortCharactersInString = str =>
str.split('').sort((a, b) => a.localeCompare(b)).join('');
-// sortCharactersInString('cabbage') -> 'aabbceg'
+```
+
+```js
+sortCharactersInString('cabbage') // 'aabbceg'
```
diff --git a/snippets/speechSynthesis.md b/snippets/speechSynthesis.md
index cb8d150f4..74a628795 100644
--- a/snippets/speechSynthesis.md
+++ b/snippets/speechSynthesis.md
@@ -13,5 +13,8 @@ const speechSynthesis = message => {
msg.voice = window.speechSynthesis.getVoices()[0];
window.speechSynthesis.speak(msg);
};
-// speechSynthesis('Hello, World') -> plays the message
+```
+
+```js
+speechSynthesis('Hello, World') // // plays the message
```
diff --git a/snippets/spreadOver.md b/snippets/spreadOver.md
index aff6281a6..3c26506c1 100644
--- a/snippets/spreadOver.md
+++ b/snippets/spreadOver.md
@@ -6,9 +6,10 @@ Use closures and the spread operator (`...`) to map the array of arguments to th
```js
const spreadOver = fn => argsArr => fn(...argsArr);
-/*
+```
+
+```js
const arrayMax = spreadOver(Math.max)
-arrayMax([1,2,3]) // -> 3
-arrayMax([1,2,4]) // -> 4
-*/
-```
+arrayMax([1,2,3]) // 3
+arrayMax([1,2,4]) // 4
+```
diff --git a/snippets/standardDeviation.md b/snippets/standardDeviation.md
index 51cf4a0dd..0bddc99e8 100644
--- a/snippets/standardDeviation.md
+++ b/snippets/standardDeviation.md
@@ -14,6 +14,9 @@ const standardDeviation = (arr, usePopulation = false) => {
.reduce((acc, val) => acc + val, 0) / (arr.length - (usePopulation ? 0 : 1))
);
};
-// standardDeviation([10,2,38,23,38,23,21]) -> 13.284434142114991 (sample)
-// standardDeviation([10,2,38,23,38,23,21], true) -> 12.29899614287479 (population)
+```
+
+```js
+standardDeviation([10,2,38,23,38,23,21]) // 13.284434142114991 (sample)
+standardDeviation([10,2,38,23,38,23,21], true) // 12.29899614287479 (population)
```
diff --git a/snippets/symmetricDifference.md b/snippets/symmetricDifference.md
index 596adf28a..8e55bdab4 100644
--- a/snippets/symmetricDifference.md
+++ b/snippets/symmetricDifference.md
@@ -9,5 +9,8 @@ const symmetricDifference = (a, b) => {
const sA = new Set(a), sB = new Set(b);
return [...a.filter(x => !sB.has(x)), ...b.filter(x => !sA.has(x))];
};
-// symmetricDifference([1,2,3], [1,2,4]) -> [3,4]
+```
+
+```js
+symmetricDifference([1,2,3], [1,2,4]) // [3,4]
```
diff --git a/snippets/tail.md b/snippets/tail.md
index 9d84a17f1..cc7fb6130 100644
--- a/snippets/tail.md
+++ b/snippets/tail.md
@@ -6,6 +6,9 @@ Return `arr.slice(1)` if the array's `length` is more than `1`, otherwise, retur
```js
const tail = arr => arr.length > 1 ? arr.slice(1) : arr;
-// tail([1,2,3]) -> [2,3]
-// tail([1]) -> [1]
+```
+
+```js
+tail([1,2,3]) // [2,3]
+tail([1]) // [1]
```
diff --git a/snippets/take.md b/snippets/take.md
index f6afa5dab..d8257f54f 100644
--- a/snippets/take.md
+++ b/snippets/take.md
@@ -6,6 +6,9 @@ Use `Array.slice()` to create a slice of the array with `n` elements taken from
```js
const take = (arr, n = 1) => arr.slice(0, n);
-// take([1, 2, 3], 5) -> [1, 2, 3]
-// take([1, 2, 3], 0) -> []
+```
+
+```js
+take([1, 2, 3], 5) // [1, 2, 3]
+take([1, 2, 3], 0) // []
```
diff --git a/snippets/takeRight.md b/snippets/takeRight.md
index a8fc0e114..13b8d47ed 100644
--- a/snippets/takeRight.md
+++ b/snippets/takeRight.md
@@ -6,6 +6,9 @@ Use `Array.slice()` to create a slice of the array with `n` elements taken from
```js
const takeRight = (arr, n = 1) => arr.slice(arr.length - n, arr.length);
-// takeRight([1, 2, 3], 2) -> [ 2, 3 ]
-// takeRight([1, 2, 3]) -> [3]
+```
+
+```js
+takeRight([1, 2, 3], 2) // [ 2, 3 ]
+takeRight([1, 2, 3]) // [3]
```
diff --git a/snippets/timeTaken.md b/snippets/timeTaken.md
index 05b16fb46..083405afb 100644
--- a/snippets/timeTaken.md
+++ b/snippets/timeTaken.md
@@ -9,6 +9,9 @@ const timeTaken = callback => {
console.time('timeTaken'); const r = callback();
console.timeEnd('timeTaken'); return r;
};
-// timeTaken(() => Math.pow(2, 10)) -> 1024
+```
+
+```js
+timeTaken(() => Math.pow(2, 10)) // 1024
// (logged): timeTaken: 0.02099609375ms
```
diff --git a/snippets/toCamelCase.md b/snippets/toCamelCase.md
index c3c78e8e9..65958acea 100644
--- a/snippets/toCamelCase.md
+++ b/snippets/toCamelCase.md
@@ -12,8 +12,11 @@ const toCamelCase = str => {
.join('');
return s.slice(0, 1).toLowerCase() + s.slice(1);
};
-// toCamelCase("some_database_field_name") -> 'someDatabaseFieldName'
-// toCamelCase("Some label that needs to be camelized") -> 'someLabelThatNeedsToBeCamelized'
-// toCamelCase("some-javascript-property") -> 'someJavascriptProperty'
-// toCamelCase("some-mixed_string with spaces_underscores-and-hyphens") -> 'someMixedStringWithSpacesUnderscoresAndHyphens'
+```
+
+```js
+toCamelCase("some_database_field_name") // 'someDatabaseFieldName'
+toCamelCase("Some label that needs to be camelized") // 'someLabelThatNeedsToBeCamelized'
+toCamelCase("some-javascript-property") // 'someJavascriptProperty'
+toCamelCase("some-mixed_string with spaces_underscores-and-hyphens") // 'someMixedStringWithSpacesUnderscoresAndHyphens'
```
diff --git a/snippets/toDecimalMark.md b/snippets/toDecimalMark.md
index b05429817..726a5a019 100644
--- a/snippets/toDecimalMark.md
+++ b/snippets/toDecimalMark.md
@@ -4,5 +4,8 @@ Use `toLocaleString()` to convert a float-point arithmetic to the [Decimal mark]
```js
const toDecimalMark = num => num.toLocaleString('en-US');
-// toDecimalMark(12305030388.9087) -> "12,305,030,388.9087"
+```
+
+```js
+toDecimalMark(12305030388.9087) // "12,305,030,388.9087"
```
diff --git a/snippets/toEnglishDate.md b/snippets/toEnglishDate.md
index ffbcf6cd7..30a4c1f2c 100644
--- a/snippets/toEnglishDate.md
+++ b/snippets/toEnglishDate.md
@@ -7,5 +7,8 @@ Throws an error if the passed time cannot be converted to a date.
```js
const toEnglishDate = (time) => { try { return new Date(time).toISOString().split('T')[0].replace(/-/g, '/'); } catch (e) {} };
-// toEnglishDate('09/21/2010') -> '21/09/2010'
+```
+
+```js
+toEnglishDate('09/21/2010') // '21/09/2010'
```
diff --git a/snippets/toKebabCase.md b/snippets/toKebabCase.md
index 20c7e2546..b1782726f 100644
--- a/snippets/toKebabCase.md
+++ b/snippets/toKebabCase.md
@@ -10,9 +10,12 @@ const toKebabCase = str =>
str && str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g)
.map(x => x.toLowerCase())
.join('-');
-// toKebabCase("camelCase") -> 'camel-case'
-// toKebabCase("some text") -> 'some-text'
-// toKebabCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some-mixed-string-with-spaces-underscores-and-hyphens'
-// toKebabCase("AllThe-small Things") -> "all-the-small-things"
-// toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-xml-and-html"
+```
+
+```js
+toKebabCase("camelCase") // 'camel-case'
+toKebabCase("some text") // 'some-text'
+toKebabCase("some-mixed_string With spaces_underscores-and-hyphens") // 'some-mixed-string-with-spaces-underscores-and-hyphens'
+toKebabCase("AllThe-small Things") // "all-the-small-things"
+toKebabCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') // "i-am-listening-to-fm-while-loading-different-url-on-my-browser-and-also-editing-xml-and-html"
```
diff --git a/snippets/toOrdinalSuffix.md b/snippets/toOrdinalSuffix.md
index 482286056..bf0f19227 100644
--- a/snippets/toOrdinalSuffix.md
+++ b/snippets/toOrdinalSuffix.md
@@ -13,5 +13,8 @@ const toOrdinalSuffix = num => {
tPattern = [11, 12, 13, 14, 15, 16, 17, 18, 19];
return oPattern.includes(digits[0]) && !tPattern.includes(digits[1]) ? int + ordinals[digits[0] - 1] : int + ordinals[3];
};
-// toOrdinalSuffix("123") -> "123rd"
+```
+
+```js
+toOrdinalSuffix("123") // "123rd"
```
diff --git a/snippets/toSnakeCase.md b/snippets/toSnakeCase.md
index b4022f98d..4b3de32dd 100644
--- a/snippets/toSnakeCase.md
+++ b/snippets/toSnakeCase.md
@@ -11,10 +11,13 @@ const toSnakeCase = str => {
.map(x => x.toLowerCase())
.join('_');
};
-// toSnakeCase("camelCase") -> 'camel_case'
-// toSnakeCase("some text") -> 'some_text'
-// toSnakeCase("some-javascript-property") -> 'some_javascript_property'
-// toSnakeCase("some-mixed_string With spaces_underscores-and-hyphens") -> 'some_mixed_string_with_spaces_underscores_and_hyphens'
-// toSnakeCase("AllThe-small Things") -> "all_the_small_things"
-// toSnakeCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') -> "i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html"
+```
+
+```js
+toSnakeCase("camelCase") // 'camel_case'
+toSnakeCase("some text") // 'some_text'
+toSnakeCase("some-javascript-property") // 'some_javascript_property'
+toSnakeCase("some-mixed_string With spaces_underscores-and-hyphens") // 'some_mixed_string_with_spaces_underscores_and_hyphens'
+toSnakeCase("AllThe-small Things") // "all_the_smal_things"
+toSnakeCase('IAmListeningToFMWhileLoadingDifferentURLOnMyBrowserAndAlsoEditingSomeXMLAndHTML') // "i_am_listening_to_fm_while_loading_different_url_on_my_browser_and_also_editing_some_xml_and_html"
```
diff --git a/snippets/tomorrow.md b/snippets/tomorrow.md
index 29ba4dae0..d0f902db6 100644
--- a/snippets/tomorrow.md
+++ b/snippets/tomorrow.md
@@ -5,5 +5,8 @@ Use `new Date()` to get today's date, adding `86400000` of seconds to it(24 hour
```js
const tomorrow = () => new Date(new Date().getTime() + 86400000).toISOString().split('T')[0];
-// tomorrow() -> 2017-12-27 (if current date is 2017-12-26)
+```
+
+```js
+tomorrow() // 2017-12-27 (if current date is 2017-12-26)
```
diff --git a/snippets/truncateString.md b/snippets/truncateString.md
index 48924b0ae..66fc5d855 100644
--- a/snippets/truncateString.md
+++ b/snippets/truncateString.md
@@ -8,5 +8,8 @@ Return the string truncated to the desired length, with `...` appended to the en
```js
const truncateString = (str, num) =>
str.length > num ? str.slice(0, num > 3 ? num - 3 : num) + '...' : str;
-// truncateString('boomerang', 7) -> 'boom...'
+```
+
+```js
+truncateString('boomerang', 7) // 'boom...'
```
diff --git a/snippets/truthCheckCollection.md b/snippets/truthCheckCollection.md
index 3c592d308..4a8aa7e14 100644
--- a/snippets/truthCheckCollection.md
+++ b/snippets/truthCheckCollection.md
@@ -3,8 +3,11 @@
Checks if the predicate (second argument) is truthy on all elements of a collection (first argument).
Use `Array.every()` to check if each passed object has the specified property and if it returns a truthy value.
-
+
```js
const truthCheckCollection = (collection, pre) => (collection.every(obj => obj[pre]));
-// truthCheckCollection([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}], "sex") -> true
+```
+
+```js
+truthCheckCollection([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}], "sex") // true
```
diff --git a/snippets/union.md b/snippets/union.md
index 27427a9aa..155fbd7c4 100644
--- a/snippets/union.md
+++ b/snippets/union.md
@@ -6,5 +6,8 @@ Create a `Set` with all values of `a` and `b` and convert to an array.
```js
const union = (a, b) => Array.from(new Set([...a, ...b]));
-// union([1,2,3], [4,3,2]) -> [1,2,3,4]
+```
+
+```js
+union([1,2,3], [4,3,2]) // [1,2,3,4]
```
diff --git a/snippets/validateNumber.md b/snippets/validateNumber.md
index 8874cfce2..70840cf88 100644
--- a/snippets/validateNumber.md
+++ b/snippets/validateNumber.md
@@ -8,5 +8,8 @@ Use `Number()` to check if the coercion holds.
```js
const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == n;
-// validateNumber('10') -> true
+```
+
+```js
+validateNumber('10') // true
```
diff --git a/snippets/without.md b/snippets/without.md
index 532ec26d9..594ea2edd 100644
--- a/snippets/without.md
+++ b/snippets/without.md
@@ -8,5 +8,8 @@ _(For a snippet that mutates the original array see [`pull`](#pull))_
```js
const without = (arr, ...args) => arr.filter(v => !args.includes(v));
-// without([2, 1, 2, 3], 1, 2) -> [3]
+```
+
+```js
+without([2, 1, 2, 3], 1, 2) // [3]
```
diff --git a/snippets/words.md b/snippets/words.md
index df6b258b7..3d8097da7 100644
--- a/snippets/words.md
+++ b/snippets/words.md
@@ -7,6 +7,9 @@ Omit the second argument to use the default regex.
```js
const words = (str, pattern = /[^a-zA-Z-]+/) => str.split(pattern).filter(Boolean);
-// words("I love javaScript!!") -> ["I", "love", "javaScript"]
-// words("python, javaScript & coffee") -> ["python", "javaScript", "coffee"]
+```
+
+```js
+words("I love javaScript!!") // ["I", "love", "javaScript"]
+words("python, javaScript & coffee") // ["python", "javaScript", "coffee"]
```
diff --git a/snippets/zip.md b/snippets/zip.md
index 981143fd5..68da486eb 100644
--- a/snippets/zip.md
+++ b/snippets/zip.md
@@ -13,6 +13,9 @@ const zip = (...arrays) => {
return Array.from({length: arrays.length}, (_, k) => arrays[k][i]);
});
};
-// zip(['a', 'b'], [1, 2], [true, false]); -> [['a', 1, true], ['b', 2, false]]
-// zip(['a'], [1, 2], [true, false]); -> [['a', 1, true], [undefined, 2, false]]
+```
+
+```js
+zip(['a', 'b'], [1, 2], [true, false]); // [['a', 1, true], ['b', 2, false]]
+zip(['a'], [1, 2], [true, false]); // [['a', 1, true], [undefined, 2, false]]
```
diff --git a/snippets/zipObject.md b/snippets/zipObject.md
index be9172542..b2673a9ae 100644
--- a/snippets/zipObject.md
+++ b/snippets/zipObject.md
@@ -6,6 +6,9 @@ Since an object can have undefined values but not undefined property pointers, t
```js
const zipObject = (props, values) => props.reduce((obj, prop, index) => (obj[prop] = values[index], obj), {});
-// zipObject(['a','b','c'], [1,2]) -> {a: 1, b: 2, c: undefined}
-// zipObject(['a','b'], [1,2,3]) -> {a: 1, b: 2}
+```
+
+```js
+zipObject(['a','b','c'], [1,2]) // {a: 1, b: 2, c: undefined}
+zipObject(['a','b'], [1,2,3]) // {a: 1, b: 2}
```
diff --git a/static-parts/index-start.html b/static-parts/index-start.html
index a0060d67e..0ecf1810d 100644
--- a/static-parts/index-start.html
+++ b/static-parts/index-start.html
@@ -33,7 +33,7 @@
})
}
function clipboard() {
- const snippets = document.querySelectorAll("pre");
+ const snippets = document.querySelectorAll(":not(pre) + pre");
snippets.forEach(element => {
const button = document.createElement("button");
button.innerHTML = "Copy to clipboard";
diff --git a/tag_database b/tag_database
index 6afffd83c..d9e44d30d 100644
--- a/tag_database
+++ b/tag_database
@@ -94,7 +94,7 @@ promisify:adapter
pull:array
pullAtIndex:array
pullAtValue:array
-randomHexColor:utility
+randomHexColorCode:utility
randomIntegerInRange:math
randomNumberInRange:math
readFileLines:node
@@ -107,7 +107,7 @@ round:math
runPromisesInSeries:function
sample:array
scrollToTop:browser
-sdbmHashAlgorithm:math
+sdbm:utility
select:object
shallowClone:object
shuffle:array