Fixed issues with deepClone, built everything

This commit is contained in:
Angelos Chalaris
2019-01-12 11:42:14 +02:00
parent 3b9ed4f2e0
commit af0f433975
16 changed files with 4816 additions and 4798 deletions

View File

@ -672,7 +672,7 @@ const sum = pipeAsyncFunctions(
x => x + 3,
async x => (await x) + 4
);
(async () => {
(async() => {
console.log(await sum(5)); // 15 (after one second)
})();
```
@ -2314,7 +2314,6 @@ Use `Array.prototype.filter()` to find array elements that return truthy values
The `func` is invoked with three arguments (`value, index, array`).
```js
const remove = (arr, func) =>
Array.isArray(arr)
? arr.filter(func).reduce((acc, val) => {
@ -6692,7 +6691,11 @@ const deepClone = obj => {
Object.keys(clone).forEach(
key => (clone[key] = typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key])
);
return Array.isArray(obj) ? (clone.length = obj.length) && Array.from(clone) : clone;
return Array.isArray(obj) && obj.length
? (clone.length = obj.length) && Array.from(clone)
: Array.isArray(obj)
? Array.from(obj)
: clone;
};
```

452
dist/_30s.es5.js vendored
View File

@ -118,54 +118,6 @@
var crypto = typeof require !== "undefined" && require('crypto');
var CSVToArray = function CSVToArray(data) {
var delimiter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ',';
var omitFirstRow = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
return data.slice(omitFirstRow ? data.indexOf('\n') + 1 : 0).split('\n').map(function (v) {
return v.split(delimiter);
});
};
var CSVToJSON = function CSVToJSON(data) {
var delimiter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ',';
var titles = data.slice(0, data.indexOf('\n')).split(delimiter);
return data.slice(data.indexOf('\n') + 1).split('\n').map(function (v) {
var values = v.split(delimiter);
return titles.reduce(function (obj, title, index) {
return obj[title] = values[index], obj;
}, {});
});
};
var JSONToFile = function JSONToFile(obj, filename) {
return fs.writeFile("".concat(filename, ".json"), JSON.stringify(obj, null, 2));
};
var JSONtoCSV = function JSONtoCSV(arr, columns) {
var delimiter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ',';
return [columns.join(delimiter)].concat(_toConsumableArray(arr.map(function (obj) {
return columns.reduce(function (acc, key) {
return "".concat(acc).concat(!acc.length ? '' : delimiter, "\"").concat(!obj[key] ? '' : obj[key], "\"");
}, '');
}))).join('\n');
};
var RGBToHex = function RGBToHex(r, g, b) {
return ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0');
};
var URLJoin = function URLJoin() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return args.join('/').replace(/[\/]+/g, '/').replace(/^(.+):\//, '$1://').replace(/^file:/, 'file:/').replace(/\/(\?|&|#[^!])/g, '$1').replace(/\?/g, '&').replace('&', '?');
};
var UUIDGeneratorBrowser = function UUIDGeneratorBrowser() {
return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, function (c) {
return (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16);
});
};
var UUIDGeneratorNode = function UUIDGeneratorNode() {
return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, function (c) {
return (c ^ crypto.randomBytes(1)[0] & 15 >> c / 4).toString(16);
});
};
var all = function all(arr) {
var fn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Boolean;
return arr.every(fn);
@ -200,8 +152,8 @@
};
var ary = function ary(fn, n) {
return function () {
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return fn.apply(void 0, _toConsumableArray(args.slice(0, n)));
@ -212,8 +164,8 @@
};
var attempt = function attempt(fn) {
try {
for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
args[_key3 - 1] = arguments[_key3];
for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
args[_key2 - 1] = arguments[_key2];
}
return fn.apply(void 0, args);
@ -222,8 +174,8 @@
}
};
var average = function average() {
for (var _len4 = arguments.length, nums = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
nums[_key4] = arguments[_key4];
for (var _len3 = arguments.length, nums = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
nums[_key3] = arguments[_key3];
}
return nums.reduce(function (acc, val) {
@ -248,21 +200,21 @@
}, [[], []]);
};
var bind = function bind(fn, context) {
for (var _len5 = arguments.length, boundArgs = new Array(_len5 > 2 ? _len5 - 2 : 0), _key5 = 2; _key5 < _len5; _key5++) {
boundArgs[_key5 - 2] = arguments[_key5];
for (var _len4 = arguments.length, boundArgs = new Array(_len4 > 2 ? _len4 - 2 : 0), _key4 = 2; _key4 < _len4; _key4++) {
boundArgs[_key4 - 2] = arguments[_key4];
}
return function () {
for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
args[_key6] = arguments[_key6];
for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
args[_key5] = arguments[_key5];
}
return fn.apply(context, boundArgs.concat(args));
};
};
var bindAll = function bindAll(obj) {
for (var _len7 = arguments.length, fns = new Array(_len7 > 1 ? _len7 - 1 : 0), _key7 = 1; _key7 < _len7; _key7++) {
fns[_key7 - 1] = arguments[_key7];
for (var _len6 = arguments.length, fns = new Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) {
fns[_key6 - 1] = arguments[_key6];
}
return fns.forEach(function (fn) {
@ -272,13 +224,13 @@
});
};
var bindKey = function bindKey(context, fn) {
for (var _len8 = arguments.length, boundArgs = new Array(_len8 > 2 ? _len8 - 2 : 0), _key8 = 2; _key8 < _len8; _key8++) {
boundArgs[_key8 - 2] = arguments[_key8];
for (var _len7 = arguments.length, boundArgs = new Array(_len7 > 2 ? _len7 - 2 : 0), _key7 = 2; _key7 < _len7; _key7++) {
boundArgs[_key7 - 2] = arguments[_key7];
}
return function () {
for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {
args[_key9] = arguments[_key9];
for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
args[_key8] = arguments[_key8];
}
return context[fn].apply(context, boundArgs.concat(args));
@ -308,8 +260,8 @@
return new Blob([str]).size;
};
var call = function call(key) {
for (var _len10 = arguments.length, args = new Array(_len10 > 1 ? _len10 - 1 : 0), _key10 = 1; _key10 < _len10; _key10++) {
args[_key10 - 1] = arguments[_key10];
for (var _len9 = arguments.length, args = new Array(_len9 > 1 ? _len9 - 1 : 0), _key9 = 1; _key9 < _len9; _key9++) {
args[_key9 - 1] = arguments[_key9];
}
return function (context) {
@ -357,8 +309,8 @@
return new RegExp(regExp.source, regExp.flags);
};
var coalesce = function coalesce() {
for (var _len11 = arguments.length, args = new Array(_len11), _key11 = 0; _key11 < _len11; _key11++) {
args[_key11] = arguments[_key11];
for (var _len10 = arguments.length, args = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {
args[_key10] = arguments[_key10];
}
return args.find(function (_) {
@ -367,8 +319,8 @@
};
var coalesceFactory = function coalesceFactory(valid) {
return function () {
for (var _len12 = arguments.length, args = new Array(_len12), _key12 = 0; _key12 < _len12; _key12++) {
args[_key12] = arguments[_key12];
for (var _len11 = arguments.length, args = new Array(_len11), _key11 = 0; _key11 < _len11; _key11++) {
args[_key11] = arguments[_key11];
}
return args.find(valid);
@ -376,16 +328,16 @@
};
var collectInto = function collectInto(fn) {
return function () {
for (var _len13 = arguments.length, args = new Array(_len13), _key13 = 0; _key13 < _len13; _key13++) {
args[_key13] = arguments[_key13];
for (var _len12 = arguments.length, args = new Array(_len12), _key12 = 0; _key12 < _len12; _key12++) {
args[_key12] = arguments[_key12];
}
return fn(args);
};
};
var colorize = function colorize() {
for (var _len14 = arguments.length, args = new Array(_len14), _key14 = 0; _key14 < _len14; _key14++) {
args[_key14] = arguments[_key14];
for (var _len13 = arguments.length, args = new Array(_len13), _key13 = 0; _key13 < _len13; _key13++) {
args[_key13] = arguments[_key13];
}
return {
@ -414,8 +366,8 @@
return str.replace(/\s{2,}/g, ' ');
};
var compose = function compose() {
for (var _len15 = arguments.length, fns = new Array(_len15), _key15 = 0; _key15 < _len15; _key15++) {
fns[_key15] = arguments[_key15];
for (var _len14 = arguments.length, fns = new Array(_len14), _key14 = 0; _key14 < _len14; _key14++) {
fns[_key14] = arguments[_key14];
}
return fns.reduce(function (f, g) {
@ -425,8 +377,8 @@
});
};
var composeRight = function composeRight() {
for (var _len16 = arguments.length, fns = new Array(_len16), _key16 = 0; _key16 < _len16; _key16++) {
fns[_key16] = arguments[_key16];
for (var _len15 = arguments.length, fns = new Array(_len15), _key15 = 0; _key15 < _len15; _key15++) {
fns[_key15] = arguments[_key15];
}
return fns.reduce(function (f, g) {
@ -437,8 +389,8 @@
};
var converge = function converge(converger, fns) {
return function () {
for (var _len17 = arguments.length, args = new Array(_len17), _key17 = 0; _key17 < _len17; _key17++) {
args[_key17] = arguments[_key17];
for (var _len16 = arguments.length, args = new Array(_len16), _key16 = 0; _key16 < _len16; _key16++) {
args[_key16] = arguments[_key16];
}
return converger.apply(void 0, _toConsumableArray(fns.map(function (fn) {
@ -471,11 +423,6 @@
return acc;
}, {});
};
var countOccurrences = function countOccurrences(arr, val) {
return arr.reduce(function (a, v) {
return v === val ? a + 1 : a;
}, 0);
};
var counter = function counter(selector, start, end) {
var step = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;
var duration = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 2000;
@ -491,6 +438,11 @@
return timer;
};
var countOccurrences = function countOccurrences(arr, val) {
return arr.reduce(function (a, v) {
return v === val ? a + 1 : a;
}, 0);
};
var createDirIfNotExists = function createDirIfNotExists(dir) {
return !fs.existsSync(dir) ? fs.mkdirSync(dir) : undefined;
};
@ -519,14 +471,31 @@
}
};
};
var CSVToArray = function CSVToArray(data) {
var delimiter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ',';
var omitFirstRow = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
return data.slice(omitFirstRow ? data.indexOf('\n') + 1 : 0).split('\n').map(function (v) {
return v.split(delimiter);
});
};
var CSVToJSON = function CSVToJSON(data) {
var delimiter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ',';
var titles = data.slice(0, data.indexOf('\n')).split(delimiter);
return data.slice(data.indexOf('\n') + 1).split('\n').map(function (v) {
var values = v.split(delimiter);
return titles.reduce(function (obj, title, index) {
return obj[title] = values[index], obj;
}, {});
});
};
var currentURL = function currentURL() {
return window.location.href;
};
var curry = function curry(fn) {
var arity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : fn.length;
for (var _len18 = arguments.length, args = new Array(_len18 > 2 ? _len18 - 2 : 0), _key18 = 2; _key18 < _len18; _key18++) {
args[_key18 - 2] = arguments[_key18];
for (var _len17 = arguments.length, args = new Array(_len17 > 2 ? _len17 - 2 : 0), _key17 = 2; _key17 < _len17; _key17++) {
args[_key17 - 2] = arguments[_key17];
}
return arity <= args.length ? fn.apply(void 0, args) : curry.bind.apply(curry, [null, fn, arity].concat(args));
@ -540,8 +509,8 @@
return function () {
var _this = this;
for (var _len19 = arguments.length, args = new Array(_len19), _key19 = 0; _key19 < _len19; _key19++) {
args[_key19] = arguments[_key19];
for (var _len18 = arguments.length, args = new Array(_len18), _key18 = 0; _key18 < _len18; _key18++) {
args[_key18] = arguments[_key18];
}
clearTimeout(timeoutId);
@ -563,7 +532,7 @@
Object.keys(clone).forEach(function (key) {
return clone[key] = _typeof(obj[key]) === 'object' ? deepClone(obj[key]) : obj[key];
});
return Array.isArray(obj) ? (clone.length = obj.length) && Array.from(clone) : clone;
return Array.isArray(obj) && obj.length ? (clone.length = obj.length) && Array.from(clone) : Array.isArray(obj) ? Array.from(obj) : clone;
};
var deepFlatten = function deepFlatten(arr) {
var _ref5;
@ -587,15 +556,15 @@
}, {}) : obj;
};
var defaults = function defaults(obj) {
for (var _len20 = arguments.length, defs = new Array(_len20 > 1 ? _len20 - 1 : 0), _key20 = 1; _key20 < _len20; _key20++) {
defs[_key20 - 1] = arguments[_key20];
for (var _len19 = arguments.length, defs = new Array(_len19 > 1 ? _len19 - 1 : 0), _key19 = 1; _key19 < _len19; _key19++) {
defs[_key19 - 1] = arguments[_key19];
}
return Object.assign.apply(Object, [{}, obj].concat(_toConsumableArray(defs.reverse()), [obj]));
};
var defer = function defer(fn) {
for (var _len21 = arguments.length, args = new Array(_len21 > 1 ? _len21 - 1 : 0), _key21 = 1; _key21 < _len21; _key21++) {
args[_key21 - 1] = arguments[_key21];
for (var _len20 = arguments.length, args = new Array(_len20 > 1 ? _len20 - 1 : 0), _key20 = 1; _key20 < _len20; _key20++) {
args[_key20 - 1] = arguments[_key20];
}
return setTimeout.apply(void 0, [fn, 1].concat(args));
@ -604,8 +573,8 @@
return deg * Math.PI / 180.0;
};
var delay = function delay(fn, wait) {
for (var _len22 = arguments.length, args = new Array(_len22 > 2 ? _len22 - 2 : 0), _key22 = 2; _key22 < _len22; _key22++) {
args[_key22 - 2] = arguments[_key22];
for (var _len21 = arguments.length, args = new Array(_len21 > 2 ? _len21 - 2 : 0), _key21 = 2; _key21 < _len21; _key21++) {
args[_key21 - 2] = arguments[_key21];
}
return setTimeout.apply(void 0, [fn, wait].concat(args));
@ -826,8 +795,8 @@
};
var flip = function flip(fn) {
return function (first) {
for (var _len23 = arguments.length, rest = new Array(_len23 > 1 ? _len23 - 1 : 0), _key23 = 1; _key23 < _len23; _key23++) {
rest[_key23 - 1] = arguments[_key23];
for (var _len22 = arguments.length, rest = new Array(_len22 > 1 ? _len22 - 1 : 0), _key22 = 1; _key22 < _len22; _key22++) {
rest[_key22 - 1] = arguments[_key22];
}
return fn.apply(void 0, rest.concat([first]));
@ -836,16 +805,6 @@
var forEachRight = function forEachRight(arr, callback) {
return arr.slice(0).reverse().forEach(callback);
};
var forOwn = function forOwn(obj, fn) {
return Object.keys(obj).forEach(function (key) {
return fn(obj[key], key, obj);
});
};
var forOwnRight = function forOwnRight(obj, fn) {
return Object.keys(obj).reverse().forEach(function (key) {
return fn(obj[key], key, obj);
});
};
var formatDuration = function formatDuration(ms) {
if (ms < 0) ms = -ms;
var time = {
@ -865,6 +824,16 @@
return "".concat(val, " ").concat(key).concat(val !== 1 ? 's' : '');
}).join(', ');
};
var forOwn = function forOwn(obj, fn) {
return Object.keys(obj).forEach(function (key) {
return fn(obj[key], key, obj);
});
};
var forOwnRight = function forOwnRight(obj, fn) {
return Object.keys(obj).reverse().forEach(function (key) {
return fn(obj[key], key, obj);
});
};
var fromCamelCase = function fromCamelCase(str) {
var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '_';
return str.replace(/([a-z\d])([A-Z])/g, '$1' + separator + '$2').replace(/([A-Z]+)([A-Z][a-z\d]+)/g, '$1' + separator + '$2').toLowerCase();
@ -883,8 +852,8 @@
return !y ? x : gcd(y, x % y);
};
for (var _len24 = arguments.length, arr = new Array(_len24), _key24 = 0; _key24 < _len24; _key24++) {
arr[_key24] = arguments[_key24];
for (var _len23 = arguments.length, arr = new Array(_len23), _key23 = 0; _key23 < _len23; _key23++) {
arr[_key23] = arguments[_key23];
}
return arr.concat().reduce(function (a, b) {
@ -901,8 +870,8 @@
});
};
var get = function get(from) {
for (var _len25 = arguments.length, selectors = new Array(_len25 > 1 ? _len25 - 1 : 0), _key25 = 1; _key25 < _len25; _key25++) {
selectors[_key25 - 1] = arguments[_key25];
for (var _len24 = arguments.length, selectors = new Array(_len24 > 1 ? _len24 - 1 : 0), _key24 = 1; _key24 < _len24; _key24++) {
selectors[_key24 - 1] = arguments[_key24];
}
return selectors.concat().map(function (s) {
@ -964,8 +933,8 @@
return el.classList.contains(className);
};
var hasFlags = function hasFlags() {
for (var _len26 = arguments.length, flags = new Array(_len26), _key26 = 0; _key26 < _len26; _key26++) {
flags[_key26] = arguments[_key26];
for (var _len25 = arguments.length, flags = new Array(_len25), _key25 = 0; _key25 < _len25; _key25++) {
flags[_key25] = arguments[_key25];
}
return flags.every(function (flag) {
@ -1004,8 +973,8 @@
return 'rgb' + (alpha ? 'a' : '') + '(' + (h >>> (alpha ? 24 : 16)) + ', ' + ((h & (alpha ? 0x00ff0000 : 0x00ff00)) >>> (alpha ? 16 : 8)) + ', ' + ((h & (alpha ? 0x0000ff00 : 0x0000ff)) >>> (alpha ? 8 : 0)) + (alpha ? ", ".concat(h & 0x000000ff) : '') + ')';
};
var hide = function hide() {
for (var _len27 = arguments.length, el = new Array(_len27), _key27 = 0; _key27 < _len27; _key27++) {
el[_key27] = arguments[_key27];
for (var _len26 = arguments.length, el = new Array(_len26), _key26 = 0; _key26 < _len26; _key26++) {
el[_key26] = arguments[_key26];
}
return el.concat().forEach(function (e) {
@ -1056,17 +1025,6 @@
return 1000 * iterations / (performance.now() - before);
};
var inRange = function inRange(n, start) {
var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
if (end && start > end) {
var _ref12 = [start, end];
end = _ref12[0];
start = _ref12[1];
}
return end == null ? n >= 0 && n < start : n >= start && n < end;
};
var indentString = function indentString(str, count) {
var indent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ' ';
return str.replace(/^/gm, indent.repeat(count));
@ -1112,8 +1070,8 @@
return Array(n).fill(val);
};
var initializeNDArray = function initializeNDArray(val) {
for (var _len28 = arguments.length, args = new Array(_len28 > 1 ? _len28 - 1 : 0), _key28 = 1; _key28 < _len28; _key28++) {
args[_key28 - 1] = arguments[_key28];
for (var _len27 = arguments.length, args = new Array(_len27 > 1 ? _len27 - 1 : 0), _key27 = 1; _key27 < _len27; _key27++) {
args[_key27 - 1] = arguments[_key27];
}
return args.length === 0 ? val : Array.from({
@ -1122,6 +1080,17 @@
return initializeNDArray.apply(void 0, [val].concat(_toConsumableArray(args.slice(1))));
});
};
var inRange = function inRange(n, start) {
var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
if (end && start > end) {
var _ref12 = [start, end];
end = _ref12[0];
start = _ref12[1];
}
return end == null ? n >= 0 && n < start : n >= start && n < end;
};
var insertAfter = function insertAfter(el, htmlString) {
return el.insertAdjacentHTML('afterend', htmlString);
};
@ -1312,6 +1281,17 @@
return i === arr.length - 2 ? acc + val + end : i === arr.length - 1 ? acc + val : acc + val + separator;
}, '');
};
var JSONtoCSV = function JSONtoCSV(arr, columns) {
var delimiter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ',';
return [columns.join(delimiter)].concat(_toConsumableArray(arr.map(function (obj) {
return columns.reduce(function (acc, key) {
return "".concat(acc).concat(!acc.length ? '' : delimiter, "\"").concat(!obj[key] ? '' : obj[key], "\"");
}, '');
}))).join('\n');
};
var JSONToFile = function JSONToFile(obj, filename) {
return fs.writeFile("".concat(filename, ".json"), JSON.stringify(obj, null, 2));
};
var last = function last(arr) {
return arr[arr.length - 1];
};
@ -1324,8 +1304,8 @@
return x * y / gcd(x, y);
};
for (var _len29 = arguments.length, arr = new Array(_len29), _key29 = 0; _key29 < _len29; _key29++) {
arr[_key29] = arguments[_key29];
for (var _len28 = arguments.length, arr = new Array(_len28), _key28 = 0; _key28 < _len28; _key28++) {
arr[_key28] = arguments[_key28];
}
return arr.concat().reduce(function (a, b) {
@ -1333,8 +1313,8 @@
});
};
var longestItem = function longestItem() {
for (var _len30 = arguments.length, vals = new Array(_len30), _key30 = 0; _key30 < _len30; _key30++) {
vals[_key30] = arguments[_key30];
for (var _len29 = arguments.length, vals = new Array(_len29), _key29 = 0; _key29 < _len29; _key29++) {
vals[_key29] = arguments[_key29];
}
return vals.reduce(function (a, x) {
@ -1405,8 +1385,8 @@
var maxDate = function maxDate() {
var _Math$max;
for (var _len31 = arguments.length, dates = new Array(_len31), _key31 = 0; _key31 < _len31; _key31++) {
dates[_key31] = arguments[_key31];
for (var _len30 = arguments.length, dates = new Array(_len30), _key30 = 0; _key30 < _len30; _key30++) {
dates[_key30] = arguments[_key30];
}
return new Date((_Math$max = Math.max).apply.apply(_Math$max, [null].concat(dates)));
@ -1436,8 +1416,8 @@
return cached;
};
var merge = function merge() {
for (var _len32 = arguments.length, objs = new Array(_len32), _key32 = 0; _key32 < _len32; _key32++) {
objs[_key32] = arguments[_key32];
for (var _len31 = arguments.length, objs = new Array(_len31), _key31 = 0; _key31 < _len31; _key31++) {
objs[_key31] = arguments[_key31];
}
return objs.concat().reduce(function (acc, obj) {
@ -1466,8 +1446,8 @@
var minDate = function minDate() {
var _Math$min;
for (var _len33 = arguments.length, dates = new Array(_len33), _key33 = 0; _key33 < _len33; _key33++) {
dates[_key33] = arguments[_key33];
for (var _len32 = arguments.length, dates = new Array(_len32), _key32 = 0; _key32 < _len32; _key32++) {
dates[_key32] = arguments[_key32];
}
return new Date((_Math$min = Math.min).apply.apply(_Math$min, [null].concat(dates)));
@ -1516,8 +1496,8 @@
};
var nthArg = function nthArg(n) {
return function () {
for (var _len34 = arguments.length, args = new Array(_len34), _key34 = 0; _key34 < _len34; _key34++) {
args[_key34] = arguments[_key34];
for (var _len33 = arguments.length, args = new Array(_len33), _key33 = 0; _key33 < _len33; _key33++) {
args[_key33] = arguments[_key33];
}
return args.slice(n)[0];
@ -1588,6 +1568,19 @@
el.addEventListener(evt, opts.target ? delegatorFn : fn, opts.options || false);
if (opts.target) return delegatorFn;
};
var once = function once(fn) {
var called = false;
return function () {
if (called) return;
called = true;
for (var _len34 = arguments.length, args = new Array(_len34), _key34 = 0; _key34 < _len34; _key34++) {
args[_key34] = arguments[_key34];
}
return fn.apply(this, args);
};
};
var onUserInputChange = function onUserInputChange(callback) {
var type = 'mouse',
lastTime = 0;
@ -1603,19 +1596,6 @@
type = 'touch', callback(type), document.addEventListener('mousemove', mousemoveHandler);
});
};
var once = function once(fn) {
var called = false;
return function () {
if (called) return;
called = true;
for (var _len35 = arguments.length, args = new Array(_len35), _key35 = 0; _key35 < _len35; _key35++) {
args[_key35] = arguments[_key35];
}
return fn.apply(this, args);
};
};
var orderBy = function orderBy(arr, props, orders) {
return _toConsumableArray(arr).sort(function (a, b) {
return props.reduce(function (acc, prop, i) {
@ -1633,13 +1613,13 @@
});
};
var over = function over() {
for (var _len36 = arguments.length, fns = new Array(_len36), _key36 = 0; _key36 < _len36; _key36++) {
fns[_key36] = arguments[_key36];
for (var _len35 = arguments.length, fns = new Array(_len35), _key35 = 0; _key35 < _len35; _key35++) {
fns[_key35] = arguments[_key35];
}
return function () {
for (var _len37 = arguments.length, args = new Array(_len37), _key37 = 0; _key37 < _len37; _key37++) {
args[_key37] = arguments[_key37];
for (var _len36 = arguments.length, args = new Array(_len36), _key36 = 0; _key36 < _len36; _key36++) {
args[_key36] = arguments[_key36];
}
return fns.map(function (fn) {
@ -1649,8 +1629,8 @@
};
var overArgs = function overArgs(fn, transforms) {
return function () {
for (var _len38 = arguments.length, args = new Array(_len38), _key38 = 0; _key38 < _len38; _key38++) {
args[_key38] = arguments[_key38];
for (var _len37 = arguments.length, args = new Array(_len37), _key37 = 0; _key37 < _len37; _key37++) {
args[_key37] = arguments[_key37];
}
return fn.apply(void 0, _toConsumableArray(args.map(function (val, i) {
@ -1675,26 +1655,26 @@
}, {});
};
var partial = function partial(fn) {
for (var _len39 = arguments.length, partials = new Array(_len39 > 1 ? _len39 - 1 : 0), _key39 = 1; _key39 < _len39; _key39++) {
partials[_key39 - 1] = arguments[_key39];
for (var _len38 = arguments.length, partials = new Array(_len38 > 1 ? _len38 - 1 : 0), _key38 = 1; _key38 < _len38; _key38++) {
partials[_key38 - 1] = arguments[_key38];
}
return function () {
for (var _len40 = arguments.length, args = new Array(_len40), _key40 = 0; _key40 < _len40; _key40++) {
args[_key40] = arguments[_key40];
for (var _len39 = arguments.length, args = new Array(_len39), _key39 = 0; _key39 < _len39; _key39++) {
args[_key39] = arguments[_key39];
}
return fn.apply(void 0, partials.concat(args));
};
};
var partialRight = function partialRight(fn) {
for (var _len41 = arguments.length, partials = new Array(_len41 > 1 ? _len41 - 1 : 0), _key41 = 1; _key41 < _len41; _key41++) {
partials[_key41 - 1] = arguments[_key41];
for (var _len40 = arguments.length, partials = new Array(_len40 > 1 ? _len40 - 1 : 0), _key40 = 1; _key40 < _len40; _key40++) {
partials[_key40 - 1] = arguments[_key40];
}
return function () {
for (var _len42 = arguments.length, args = new Array(_len42), _key42 = 0; _key42 < _len42; _key42++) {
args[_key42] = arguments[_key42];
for (var _len41 = arguments.length, args = new Array(_len41), _key41 = 0; _key41 < _len41; _key41++) {
args[_key41] = arguments[_key41];
}
return fn.apply(void 0, args.concat(partials));
@ -1732,8 +1712,8 @@
}, {});
};
var pipeAsyncFunctions = function pipeAsyncFunctions() {
for (var _len43 = arguments.length, fns = new Array(_len43), _key43 = 0; _key43 < _len43; _key43++) {
fns[_key43] = arguments[_key43];
for (var _len42 = arguments.length, fns = new Array(_len42), _key42 = 0; _key42 < _len42; _key42++) {
fns[_key42] = arguments[_key42];
}
return function (arg) {
@ -1743,8 +1723,8 @@
};
};
var pipeFunctions = function pipeFunctions() {
for (var _len44 = arguments.length, fns = new Array(_len44), _key44 = 0; _key44 < _len44; _key44++) {
fns[_key44] = arguments[_key44];
for (var _len43 = arguments.length, fns = new Array(_len43), _key43 = 0; _key43 < _len43; _key43++) {
fns[_key43] = arguments[_key43];
}
return fns.reduce(function (f, g) {
@ -1811,8 +1791,8 @@
};
var promisify = function promisify(func) {
return function () {
for (var _len45 = arguments.length, args = new Array(_len45), _key45 = 0; _key45 < _len45; _key45++) {
args[_key45] = arguments[_key45];
for (var _len44 = arguments.length, args = new Array(_len44), _key44 = 0; _key44 < _len44; _key44++) {
args[_key44] = arguments[_key44];
}
return new Promise(function (resolve, reject) {
@ -1823,8 +1803,8 @@
};
};
var pull = function pull(arr) {
for (var _len46 = arguments.length, args = new Array(_len46 > 1 ? _len46 - 1 : 0), _key46 = 1; _key46 < _len46; _key46++) {
args[_key46 - 1] = arguments[_key46];
for (var _len45 = arguments.length, args = new Array(_len45 > 1 ? _len45 - 1 : 0), _key45 = 1; _key45 < _len45; _key45++) {
args[_key45 - 1] = arguments[_key45];
}
var argState = Array.isArray(args[0]) ? args[0] : args;
@ -1864,8 +1844,8 @@
return removed;
};
var pullBy = function pullBy(arr) {
for (var _len47 = arguments.length, args = new Array(_len47 > 1 ? _len47 - 1 : 0), _key47 = 1; _key47 < _len47; _key47++) {
args[_key47 - 1] = arguments[_key47];
for (var _len46 = arguments.length, args = new Array(_len46 > 1 ? _len46 - 1 : 0), _key46 = 1; _key46 < _len46; _key46++) {
args[_key46 - 1] = arguments[_key46];
}
var length = args.length;
@ -1908,8 +1888,8 @@
};
var rearg = function rearg(fn, indexes) {
return function () {
for (var _len48 = arguments.length, args = new Array(_len48), _key48 = 0; _key48 < _len48; _key48++) {
args[_key48] = arguments[_key48];
for (var _len47 = arguments.length, args = new Array(_len47), _key47 = 0; _key47 < _len47; _key47++) {
args[_key47] = arguments[_key47];
}
return fn.apply(void 0, _toConsumableArray(indexes.map(function (i) {
@ -1949,6 +1929,14 @@
var asLink = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
return asLink ? window.location.href = url : window.location.replace(url);
};
var reducedFilter = function reducedFilter(data, keys, fn) {
return data.filter(fn).map(function (el) {
return keys.reduce(function (acc, key) {
acc[key] = el[key];
return acc;
}, {});
});
};
var reduceSuccessive = function reduceSuccessive(arr, fn, acc) {
return arr.reduce(function (res, val, i, arr) {
return res.push(fn(res.slice(-1)[0], val, i, arr)), res;
@ -1962,14 +1950,6 @@
return comparator(a, b) >= 0 ? b : a;
});
};
var reducedFilter = function reducedFilter(data, keys, fn) {
return data.filter(fn).map(function (el) {
return keys.reduce(function (acc, key) {
acc[key] = el[key];
return acc;
}, {});
});
};
var reject = function reject(pred, array) {
return array.filter(function () {
return !pred.apply(void 0, arguments);
@ -1992,6 +1972,9 @@
var reverseString = function reverseString(str) {
return _toConsumableArray(str).reverse().join('');
};
var RGBToHex = function RGBToHex(r, g, b) {
return ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0');
};
var round = function round(n) {
var decimals = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
return Number("".concat(Math.round("".concat(n, "e").concat(decimals)), "e-").concat(decimals));
@ -2062,15 +2045,15 @@
var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var delCount = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
for (var _len49 = arguments.length, elements = new Array(_len49 > 3 ? _len49 - 3 : 0), _key49 = 3; _key49 < _len49; _key49++) {
elements[_key49 - 3] = arguments[_key49];
for (var _len48 = arguments.length, elements = new Array(_len48 > 3 ? _len48 - 3 : 0), _key48 = 3; _key48 < _len48; _key48++) {
elements[_key48 - 3] = arguments[_key48];
}
return arr.slice(0, index).concat(elements).concat(arr.slice(index + delCount));
};
var show = function show() {
for (var _len50 = arguments.length, el = new Array(_len50), _key50 = 0; _key50 < _len50; _key50++) {
el[_key50] = arguments[_key50];
for (var _len49 = arguments.length, el = new Array(_len49), _key49 = 0; _key49 < _len49; _key49++) {
el[_key49] = arguments[_key49];
}
return el.concat().forEach(function (e) {
@ -2189,8 +2172,8 @@
return str.replace(/<[^>]*>/g, '');
};
var sum = function sum() {
for (var _len51 = arguments.length, arr = new Array(_len51), _key51 = 0; _key51 < _len51; _key51++) {
arr[_key51] = arguments[_key51];
for (var _len50 = arguments.length, arr = new Array(_len50), _key50 = 0; _key50 < _len50; _key50++) {
arr[_key50] = arguments[_key50];
}
return arr.concat().reduce(function (acc, val) {
@ -2313,18 +2296,18 @@
}
};
};
var timeTaken = function timeTaken(callback) {
console.time('timeTaken');
var r = callback();
console.timeEnd('timeTaken');
return r;
};
var times = function times(n, fn) {
var context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
var i = 0;
while (fn.call(context, i) !== false && ++i < n) {}
};
var timeTaken = function timeTaken(callback) {
console.time('timeTaken');
var r = callback();
console.timeEnd('timeTaken');
return r;
};
var toCamelCase = function toCamelCase(str) {
var 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(function (x) {
return x.slice(0, 1).toUpperCase() + x.slice(1).toLowerCase();
@ -2341,6 +2324,9 @@
var toDecimalMark = function toDecimalMark(num) {
return num.toLocaleString('en-US');
};
var toggleClass = function toggleClass(el, className) {
return el.classList.toggle(className);
};
var toHash = function toHash(object, key) {
return Array.prototype.reduce.call(object, function (acc, data, index) {
return acc[!key ? index : data[key]] = data, acc;
@ -2351,6 +2337,11 @@
return x.toLowerCase();
}).join('-');
};
var tomorrow = function tomorrow() {
var t = new Date();
t.setDate(t.getDate() + 1);
return t.toISOString().split('T')[0];
};
var toOrdinalSuffix = function toOrdinalSuffix(num) {
var int = parseInt(num),
digits = [int % 10, int % 100],
@ -2372,14 +2363,6 @@
return x.charAt(0).toUpperCase() + x.slice(1);
}).join(' ');
};
var toggleClass = function toggleClass(el, className) {
return el.classList.toggle(className);
};
var tomorrow = function tomorrow() {
var t = new Date();
t.setDate(t.getDate() + 1);
return t.toISOString().split('T')[0];
};
var transform = function transform(obj, fn, acc) {
return Object.keys(obj).reduce(function (a, k) {
return fn(a, obj[k], k, obj);
@ -2414,8 +2397,8 @@
};
};
for (var _len52 = arguments.length, args = new Array(_len52), _key52 = 0; _key52 < _len52; _key52++) {
args[_key52] = arguments[_key52];
for (var _len51 = arguments.length, args = new Array(_len51), _key51 = 0; _key51 < _len51; _key51++) {
args[_key51] = arguments[_key51];
}
if (n > args.length) throw new RangeError('Arguments too few!');
@ -2528,6 +2511,23 @@
return fn.apply(void 0, _toConsumableArray(val));
});
};
var URLJoin = function URLJoin() {
for (var _len52 = arguments.length, args = new Array(_len52), _key52 = 0; _key52 < _len52; _key52++) {
args[_key52] = arguments[_key52];
}
return args.join('/').replace(/[\/]+/g, '/').replace(/^(.+):\//, '$1://').replace(/^file:/, 'file:/').replace(/\/(\?|&|#[^!])/g, '$1').replace(/\?/g, '&').replace('&', '?');
};
var UUIDGeneratorBrowser = function UUIDGeneratorBrowser() {
return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, function (c) {
return (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16);
});
};
var UUIDGeneratorNode = function UUIDGeneratorNode() {
return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, function (c) {
return (c ^ crypto.randomBytes(1)[0] & 15 >> c / 4).toString(16);
});
};
var validateNumber = function validateNumber(n) {
return !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == n;
};
@ -2602,14 +2602,6 @@
});
};
exports.CSVToArray = CSVToArray;
exports.CSVToJSON = CSVToJSON;
exports.JSONToFile = JSONToFile;
exports.JSONtoCSV = JSONtoCSV;
exports.RGBToHex = RGBToHex;
exports.URLJoin = URLJoin;
exports.UUIDGeneratorBrowser = UUIDGeneratorBrowser;
exports.UUIDGeneratorNode = UUIDGeneratorNode;
exports.all = all;
exports.allEqual = allEqual;
exports.any = any;
@ -2649,11 +2641,13 @@
exports.converge = converge;
exports.copyToClipboard = copyToClipboard;
exports.countBy = countBy;
exports.countOccurrences = countOccurrences;
exports.counter = counter;
exports.countOccurrences = countOccurrences;
exports.createDirIfNotExists = createDirIfNotExists;
exports.createElement = createElement;
exports.createEventHub = createEventHub;
exports.CSVToArray = CSVToArray;
exports.CSVToJSON = CSVToJSON;
exports.currentURL = currentURL;
exports.curry = curry;
exports.dayOfYear = dayOfYear;
@ -2699,9 +2693,9 @@
exports.flattenObject = flattenObject;
exports.flip = flip;
exports.forEachRight = forEachRight;
exports.formatDuration = formatDuration;
exports.forOwn = forOwn;
exports.forOwnRight = forOwnRight;
exports.formatDuration = formatDuration;
exports.fromCamelCase = fromCamelCase;
exports.functionName = functionName;
exports.functions = functions;
@ -2729,7 +2723,6 @@
exports.httpPost = httpPost;
exports.httpsRedirect = httpsRedirect;
exports.hz = hz;
exports.inRange = inRange;
exports.indentString = indentString;
exports.indexOfAll = indexOfAll;
exports.initial = initial;
@ -2738,6 +2731,7 @@
exports.initializeArrayWithRangeRight = initializeArrayWithRangeRight;
exports.initializeArrayWithValues = initializeArrayWithValues;
exports.initializeNDArray = initializeNDArray;
exports.inRange = inRange;
exports.insertAfter = insertAfter;
exports.insertBefore = insertBefore;
exports.intersection = intersection;
@ -2781,6 +2775,8 @@
exports.isValidJSON = isValidJSON;
exports.isWritableStream = isWritableStream;
exports.join = join;
exports.JSONtoCSV = JSONtoCSV;
exports.JSONToFile = JSONToFile;
exports.last = last;
exports.lcm = lcm;
exports.longestItem = longestItem;
@ -2818,8 +2814,8 @@
exports.omit = omit;
exports.omitBy = omitBy;
exports.on = on;
exports.onUserInputChange = onUserInputChange;
exports.once = once;
exports.onUserInputChange = onUserInputChange;
exports.orderBy = orderBy;
exports.over = over;
exports.overArgs = overArgs;
@ -2854,14 +2850,15 @@
exports.rearg = rearg;
exports.recordAnimationFrames = recordAnimationFrames;
exports.redirect = redirect;
exports.reducedFilter = reducedFilter;
exports.reduceSuccessive = reduceSuccessive;
exports.reduceWhich = reduceWhich;
exports.reducedFilter = reducedFilter;
exports.reject = reject;
exports.remove = remove;
exports.removeNonASCII = removeNonASCII;
exports.renameKeys = renameKeys;
exports.reverseString = reverseString;
exports.RGBToHex = RGBToHex;
exports.round = round;
exports.runAsync = runAsync;
exports.runPromisesInSeries = runPromisesInSeries;
@ -2902,19 +2899,19 @@
exports.takeRightWhile = takeRightWhile;
exports.takeWhile = takeWhile;
exports.throttle = throttle;
exports.timeTaken = timeTaken;
exports.times = times;
exports.timeTaken = timeTaken;
exports.toCamelCase = toCamelCase;
exports.toCurrency = toCurrency;
exports.toDecimalMark = toDecimalMark;
exports.toggleClass = toggleClass;
exports.toHash = toHash;
exports.toKebabCase = toKebabCase;
exports.tomorrow = tomorrow;
exports.toOrdinalSuffix = toOrdinalSuffix;
exports.toSafeInteger = toSafeInteger;
exports.toSnakeCase = toSnakeCase;
exports.toTitleCase = toTitleCase;
exports.toggleClass = toggleClass;
exports.tomorrow = tomorrow;
exports.transform = transform;
exports.triggerEvent = triggerEvent;
exports.truncateString = truncateString;
@ -2934,6 +2931,9 @@
exports.untildify = untildify;
exports.unzip = unzip;
exports.unzipWith = unzipWith;
exports.URLJoin = URLJoin;
exports.UUIDGeneratorBrowser = UUIDGeneratorBrowser;
exports.UUIDGeneratorNode = UUIDGeneratorNode;
exports.validateNumber = validateNumber;
exports.when = when;
exports.without = without;

File diff suppressed because one or more lines are too long

158
dist/_30s.esm.js vendored
View File

@ -1,51 +1,6 @@
const fs = typeof require !== "undefined" && require('fs');
const crypto = typeof require !== "undefined" && require('crypto');
const CSVToArray = (data, delimiter = ',', omitFirstRow = false) =>
data
.slice(omitFirstRow ? data.indexOf('\n') + 1 : 0)
.split('\n')
.map(v => v.split(delimiter));
const CSVToJSON = (data, delimiter = ',') => {
const titles = data.slice(0, data.indexOf('\n')).split(delimiter);
return data
.slice(data.indexOf('\n') + 1)
.split('\n')
.map(v => {
const values = v.split(delimiter);
return titles.reduce((obj, title, index) => ((obj[title] = values[index]), obj), {});
});
};
const JSONToFile = (obj, filename) =>
fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2));
const JSONtoCSV = (arr, columns, delimiter = ',') =>
[
columns.join(delimiter),
...arr.map(obj =>
columns.reduce(
(acc, key) => `${acc}${!acc.length ? '' : delimiter}"${!obj[key] ? '' : obj[key]}"`,
''
)
)
].join('\n');
const RGBToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0');
const URLJoin = (...args) =>
args
.join('/')
.replace(/[\/]+/g, '/')
.replace(/^(.+):\//, '$1://')
.replace(/^file:/, 'file:/')
.replace(/\/(\?|&|#[^!])/g, '$1')
.replace(/\?/g, '&')
.replace('&', '?');
const UUIDGeneratorBrowser = () =>
([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>
(c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)
);
const UUIDGeneratorNode = () =>
([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>
(c ^ (crypto.randomBytes(1)[0] & (15 >> (c / 4)))).toString(16)
);
const all = (arr, fn = Boolean) => arr.every(fn);
const allEqual = arr => arr.every(val => val === arr[0]);
const any = (arr, fn = Boolean) => arr.some(fn);
@ -169,7 +124,6 @@ const countBy = (arr, fn) =>
acc[val] = (acc[val] || 0) + 1;
return acc;
}, {});
const countOccurrences = (arr, val) => arr.reduce((a, v) => (v === val ? a + 1 : a), 0);
const counter = (selector, start, end, step = 1, duration = 2000) => {
let current = start,
_step = (end - start) * step < 0 ? -step : step,
@ -181,6 +135,7 @@ const counter = (selector, start, end, step = 1, duration = 2000) => {
}, Math.abs(Math.floor(duration / (end - start))));
return timer;
};
const countOccurrences = (arr, val) => arr.reduce((a, v) => (v === val ? a + 1 : a), 0);
const createDirIfNotExists = dir => (!fs.existsSync(dir) ? fs.mkdirSync(dir) : undefined);
const createElement = str => {
const el = document.createElement('div');
@ -201,6 +156,21 @@ const createEventHub = () => ({
if (i > -1) this.hub[event].splice(i, 1);
}
});
const CSVToArray = (data, delimiter = ',', omitFirstRow = false) =>
data
.slice(omitFirstRow ? data.indexOf('\n') + 1 : 0)
.split('\n')
.map(v => v.split(delimiter));
const CSVToJSON = (data, delimiter = ',') => {
const titles = data.slice(0, data.indexOf('\n')).split(delimiter);
return data
.slice(data.indexOf('\n') + 1)
.split('\n')
.map(v => {
const values = v.split(delimiter);
return titles.reduce((obj, title, index) => ((obj[title] = values[index]), obj), {});
});
};
const currentURL = () => window.location.href;
const curry = (fn, arity = fn.length, ...args) =>
arity <= args.length ? fn(...args) : curry.bind(null, fn, arity, ...args);
@ -220,7 +190,7 @@ const deepClone = obj => {
Object.keys(clone).forEach(
key => (clone[key] = typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key])
);
return Array.isArray(obj) ? (clone.length = obj.length) && Array.from(clone) : clone;
return Array.isArray(obj) && obj.length ? (clone.length = obj.length) && Array.from(clone) : Array.isArray(obj) ? Array.from(obj) : clone;
};
const deepFlatten = arr => [].concat(...arr.map(v => (Array.isArray(v) ? deepFlatten(v) : v)));
const deepFreeze = obj =>
@ -374,11 +344,6 @@ const forEachRight = (arr, callback) =>
.slice(0)
.reverse()
.forEach(callback);
const forOwn = (obj, fn) => Object.keys(obj).forEach(key => fn(obj[key], key, obj));
const forOwnRight = (obj, fn) =>
Object.keys(obj)
.reverse()
.forEach(key => fn(obj[key], key, obj));
const formatDuration = ms => {
if (ms < 0) ms = -ms;
const time = {
@ -393,6 +358,11 @@ const formatDuration = ms => {
.map(([key, val]) => `${val} ${key}${val !== 1 ? 's' : ''}`)
.join(', ');
};
const forOwn = (obj, fn) => Object.keys(obj).forEach(key => fn(obj[key], key, obj));
const forOwnRight = (obj, fn) =>
Object.keys(obj)
.reverse()
.forEach(key => fn(obj[key], key, obj));
const fromCamelCase = (str, separator = '_') =>
str
.replace(/([a-z\d])([A-Z])/g, '$1' + separator + '$2')
@ -521,10 +491,6 @@ const hz = (fn, iterations = 100) => {
for (let i = 0; i < iterations; i++) fn();
return (1000 * iterations) / (performance.now() - before);
};
const inRange = (n, start, end = null) => {
if (end && start > end) [end, start] = [start, end];
return end == null ? n >= 0 && n < start : n >= start && n < end;
};
const indentString = (str, count, indent = ' ') => str.replace(/^/gm, indent.repeat(count));
const indexOfAll = (arr, val) => arr.reduce((acc, el, i) => (el === val ? [...acc, i] : acc), []);
const initial = arr => arr.slice(0, -1);
@ -541,6 +507,10 @@ const initializeNDArray = (val, ...args) =>
args.length === 0
? val
: Array.from({ length: args[0] }).map(() => initializeNDArray(val, ...args.slice(1)));
const inRange = (n, start, end = null) => {
if (end && start > end) [end, start] = [start, end];
return end == null ? n >= 0 && n < start : n >= start && n < end;
};
const insertAfter = (el, htmlString) => el.insertAdjacentHTML('afterend', htmlString);
const insertBefore = (el, htmlString) => el.insertAdjacentHTML('beforebegin', htmlString);
const intersection = (a, b) => {
@ -652,6 +622,18 @@ const join = (arr, separator = ',', end = separator) =>
: acc + val + separator,
''
);
const JSONtoCSV = (arr, columns, delimiter = ',') =>
[
columns.join(delimiter),
...arr.map(obj =>
columns.reduce(
(acc, key) => `${acc}${!acc.length ? '' : delimiter}"${!obj[key] ? '' : obj[key]}"`,
''
)
)
].join('\n');
const JSONToFile = (obj, filename) =>
fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2));
const last = arr => arr[arr.length - 1];
const lcm = (...arr) => {
const gcd = (x, y) => (!y ? x : gcd(y, x % y));
@ -784,6 +766,14 @@ const on = (el, evt, fn, opts = {}) => {
el.addEventListener(evt, opts.target ? delegatorFn : fn, opts.options || false);
if (opts.target) return delegatorFn;
};
const once = fn => {
let called = false;
return function(...args) {
if (called) return;
called = true;
return fn.apply(this, args);
};
};
const onUserInputChange = callback => {
let type = 'mouse',
lastTime = 0;
@ -798,14 +788,6 @@ const onUserInputChange = callback => {
(type = 'touch'), callback(type), document.addEventListener('mousemove', mousemoveHandler);
});
};
const once = fn => {
let called = false;
return function(...args) {
if (called) return;
called = true;
return fn.apply(this, args);
};
};
const orderBy = (arr, props, orders) =>
[...arr].sort((a, b) =>
props.reduce((acc, prop, i) => {
@ -964,10 +946,6 @@ const recordAnimationFrames = (callback, autoStart = true) => {
};
const redirect = (url, asLink = true) =>
asLink ? (window.location.href = url) : window.location.replace(url);
const reduceSuccessive = (arr, fn, acc) =>
arr.reduce((res, val, i, arr) => (res.push(fn(res.slice(-1)[0], val, i, arr)), res), [acc]);
const reduceWhich = (arr, comparator = (a, b) => a - b) =>
arr.reduce((a, b) => (comparator(a, b) >= 0 ? b : a));
const reducedFilter = (data, keys, fn) =>
data.filter(fn).map(el =>
keys.reduce((acc, key) => {
@ -975,6 +953,10 @@ const reducedFilter = (data, keys, fn) =>
return acc;
}, {})
);
const reduceSuccessive = (arr, fn, acc) =>
arr.reduce((res, val, i, arr) => (res.push(fn(res.slice(-1)[0], val, i, arr)), res), [acc]);
const reduceWhich = (arr, comparator = (a, b) => a - b) =>
arr.reduce((a, b) => (comparator(a, b) >= 0 ? b : a));
const reject = (pred, array) => array.filter((...args) => !pred(...args));
const remove = (arr, func) =>
Array.isArray(arr)
@ -993,6 +975,7 @@ const renameKeys = (keysMap, obj) =>
{}
);
const reverseString = str => [...str].reverse().join('');
const RGBToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0');
const round = (n, decimals = 0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`);
const runAsync = fn => {
const worker = new Worker(
@ -1167,16 +1150,16 @@ const throttle = (fn, wait) => {
}
};
};
const times = (n, fn, context = undefined) => {
let i = 0;
while (fn.call(context, i) !== false && ++i < n) {}
};
const timeTaken = callback => {
console.time('timeTaken');
const r = callback();
console.timeEnd('timeTaken');
return r;
};
const times = (n, fn, context = undefined) => {
let i = 0;
while (fn.call(context, i) !== false && ++i < n) {}
};
const toCamelCase = str => {
let s =
str &&
@ -1189,6 +1172,7 @@ const toCamelCase = str => {
const toCurrency = (n, curr, LanguageFormat = undefined) =>
Intl.NumberFormat(LanguageFormat, { style: 'currency', currency: curr }).format(n);
const toDecimalMark = num => num.toLocaleString('en-US');
const toggleClass = (el, className) => el.classList.toggle(className);
const toHash = (object, key) =>
Array.prototype.reduce.call(
object,
@ -1201,6 +1185,11 @@ const toKebabCase = 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('-');
const tomorrow = () => {
let t = new Date();
t.setDate(t.getDate() + 1);
return t.toISOString().split('T')[0];
};
const toOrdinalSuffix = num => {
const int = parseInt(num),
digits = [int % 10, int % 100],
@ -1224,12 +1213,6 @@ const toTitleCase = 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.charAt(0).toUpperCase() + x.slice(1))
.join(' ');
const toggleClass = (el, className) => el.classList.toggle(className);
const tomorrow = () => {
let t = new Date();
t.setDate(t.getDate() + 1);
return t.toISOString().split('T')[0];
};
const transform = (obj, fn, acc) => Object.keys(obj).reduce((a, k) => fn(a, obj[k], k, obj), acc);
const triggerEvent = (el, eventType, detail) =>
el.dispatchEvent(new CustomEvent(eventType, { detail }));
@ -1314,6 +1297,23 @@ const unzipWith = (arr, fn) =>
}).map(x => [])
)
.map(val => fn(...val));
const URLJoin = (...args) =>
args
.join('/')
.replace(/[\/]+/g, '/')
.replace(/^(.+):\//, '$1://')
.replace(/^file:/, 'file:/')
.replace(/\/(\?|&|#[^!])/g, '$1')
.replace(/\?/g, '&')
.replace('&', '?');
const UUIDGeneratorBrowser = () =>
([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>
(c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)
);
const UUIDGeneratorNode = () =>
([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>
(c ^ (crypto.randomBytes(1)[0] & (15 >> (c / 4)))).toString(16)
);
const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == n;
const when = (pred, whenTrue) => x => (pred(x) ? whenTrue(x) : x);
const without = (arr, ...args) => arr.filter(v => !args.includes(v));
@ -1337,4 +1337,4 @@ const zipWith = (...array) => {
);
};
export { CSVToArray, CSVToJSON, JSONToFile, JSONtoCSV, RGBToHex, URLJoin, UUIDGeneratorBrowser, UUIDGeneratorNode, all, allEqual, any, approximatelyEqual, arrayToCSV, arrayToHtmlList, ary, atob, attempt, average, averageBy, bifurcate, bifurcateBy, bind, bindAll, bindKey, binomialCoefficient, bottomVisible, btoa, byteSize, call, capitalize, capitalizeEveryWord, castArray, chainAsync, chunk, clampNumber, cloneRegExp, coalesce, coalesceFactory, collectInto, colorize, compact, compactWhitespace, compose, composeRight, converge, copyToClipboard, countBy, countOccurrences, counter, createDirIfNotExists, createElement, createEventHub, currentURL, curry, dayOfYear, debounce, decapitalize, deepClone, deepFlatten, deepFreeze, deepMapKeys, defaults, defer, degreesToRads, delay, detectDeviceType, difference, differenceBy, differenceWith, dig, digitize, distance, drop, dropRight, dropRightWhile, dropWhile, elementContains, elementIsVisibleInViewport, elo, equals, escapeHTML, escapeRegExp, everyNth, extendHex, factorial, fibonacci, filterFalsy, filterNonUnique, filterNonUniqueBy, findKey, findLast, findLastIndex, findLastKey, flatten, flattenObject, flip, forEachRight, forOwn, forOwnRight, formatDuration, fromCamelCase, functionName, functions, gcd, geometricProgression, get, getColonTimeFromDate, getDaysDiffBetweenDates, getImages, getMeridiemSuffixOfInteger, getScrollPosition, getStyle, getType, getURLParameters, groupBy, hammingDistance, hasClass, hasFlags, hashBrowser, hashNode, head, hexToRGB, hide, httpGet, httpPost, httpsRedirect, hz, inRange, indentString, indexOfAll, initial, initialize2DArray, initializeArrayWithRange, initializeArrayWithRangeRight, initializeArrayWithValues, initializeNDArray, insertAfter, insertBefore, intersection, intersectionBy, intersectionWith, invertKeyValues, is, isAbsoluteURL, isAfterDate, isAnagram, isArrayLike, isBeforeDate, isBoolean, isBrowser, isBrowserTabFocused, isDivisible, isDuplexStream, isEmpty, isEven, isFunction, isLowerCase, isNegativeZero, isNil, isNull, isNumber, isObject, isObjectLike, isPlainObject, isPrime, isPrimitive, isPromiseLike, isReadableStream, isSameDate, isSorted, isStream, isString, isSymbol, isTravisCI, isUndefined, isUpperCase, isValidJSON, isWritableStream, join, last, lcm, longestItem, lowercaseKeys, luhnCheck, mapKeys, mapObject, mapString, mapValues, mask, matches, matchesWith, maxBy, maxDate, maxN, median, memoize, merge, midpoint, minBy, minDate, minN, mostPerformant, negate, nest, nodeListToArray, none, nthArg, nthElement, objectFromPairs, objectToPairs, observeMutations, off, offset, omit, omitBy, on, onUserInputChange, once, orderBy, over, overArgs, pad, palindrome, parseCookie, partial, partialRight, partition, percentile, permutations, pick, pickBy, pipeAsyncFunctions, pipeFunctions, pluralize, powerset, prefix, prettyBytes, primes, promisify, pull, pullAtIndex, pullAtValue, pullBy, radsToDegrees, randomHexColorCode, randomIntArrayInRange, randomIntegerInRange, randomNumberInRange, readFileLines, rearg, recordAnimationFrames, redirect, reduceSuccessive, reduceWhich, reducedFilter, reject, remove, removeNonASCII, renameKeys, reverseString, round, runAsync, runPromisesInSeries, sample, sampleSize, scrollToTop, sdbm, serializeCookie, setStyle, shallowClone, shank, show, shuffle, similarity, size, sleep, smoothScroll, sortCharactersInString, sortedIndex, sortedIndexBy, sortedLastIndex, sortedLastIndexBy, splitLines, spreadOver, stableSort, standardDeviation, stringPermutations, stripHTMLTags, sum, sumBy, sumPower, symmetricDifference, symmetricDifferenceBy, symmetricDifferenceWith, tail, take, takeRight, takeRightWhile, takeWhile, throttle, timeTaken, times, toCamelCase, toCurrency, toDecimalMark, toHash, toKebabCase, toOrdinalSuffix, toSafeInteger, toSnakeCase, toTitleCase, toggleClass, tomorrow, transform, triggerEvent, truncateString, truthCheckCollection, unary, uncurry, unescapeHTML, unflattenObject, unfold, union, unionBy, unionWith, uniqueElements, uniqueElementsBy, uniqueElementsByRight, uniqueSymmetricDifference, untildify, unzip, unzipWith, validateNumber, when, without, words, xProd, yesNo, zip, zipObject, zipWith };
export { all, allEqual, any, approximatelyEqual, arrayToCSV, arrayToHtmlList, ary, atob, attempt, average, averageBy, bifurcate, bifurcateBy, bind, bindAll, bindKey, binomialCoefficient, bottomVisible, btoa, byteSize, call, capitalize, capitalizeEveryWord, castArray, chainAsync, chunk, clampNumber, cloneRegExp, coalesce, coalesceFactory, collectInto, colorize, compact, compactWhitespace, compose, composeRight, converge, copyToClipboard, countBy, counter, countOccurrences, createDirIfNotExists, createElement, createEventHub, CSVToArray, CSVToJSON, currentURL, curry, dayOfYear, debounce, decapitalize, deepClone, deepFlatten, deepFreeze, deepMapKeys, defaults, defer, degreesToRads, delay, detectDeviceType, difference, differenceBy, differenceWith, dig, digitize, distance, drop, dropRight, dropRightWhile, dropWhile, elementContains, elementIsVisibleInViewport, elo, equals, escapeHTML, escapeRegExp, everyNth, extendHex, factorial, fibonacci, filterFalsy, filterNonUnique, filterNonUniqueBy, findKey, findLast, findLastIndex, findLastKey, flatten, flattenObject, flip, forEachRight, formatDuration, forOwn, forOwnRight, fromCamelCase, functionName, functions, gcd, geometricProgression, get, getColonTimeFromDate, getDaysDiffBetweenDates, getImages, getMeridiemSuffixOfInteger, getScrollPosition, getStyle, getType, getURLParameters, groupBy, hammingDistance, hasClass, hasFlags, hashBrowser, hashNode, head, hexToRGB, hide, httpGet, httpPost, httpsRedirect, hz, indentString, indexOfAll, initial, initialize2DArray, initializeArrayWithRange, initializeArrayWithRangeRight, initializeArrayWithValues, initializeNDArray, inRange, insertAfter, insertBefore, intersection, intersectionBy, intersectionWith, invertKeyValues, is, isAbsoluteURL, isAfterDate, isAnagram, isArrayLike, isBeforeDate, isBoolean, isBrowser, isBrowserTabFocused, isDivisible, isDuplexStream, isEmpty, isEven, isFunction, isLowerCase, isNegativeZero, isNil, isNull, isNumber, isObject, isObjectLike, isPlainObject, isPrime, isPrimitive, isPromiseLike, isReadableStream, isSameDate, isSorted, isStream, isString, isSymbol, isTravisCI, isUndefined, isUpperCase, isValidJSON, isWritableStream, join, JSONtoCSV, JSONToFile, last, lcm, longestItem, lowercaseKeys, luhnCheck, mapKeys, mapObject, mapString, mapValues, mask, matches, matchesWith, maxBy, maxDate, maxN, median, memoize, merge, midpoint, minBy, minDate, minN, mostPerformant, negate, nest, nodeListToArray, none, nthArg, nthElement, objectFromPairs, objectToPairs, observeMutations, off, offset, omit, omitBy, on, once, onUserInputChange, orderBy, over, overArgs, pad, palindrome, parseCookie, partial, partialRight, partition, percentile, permutations, pick, pickBy, pipeAsyncFunctions, pipeFunctions, pluralize, powerset, prefix, prettyBytes, primes, promisify, pull, pullAtIndex, pullAtValue, pullBy, radsToDegrees, randomHexColorCode, randomIntArrayInRange, randomIntegerInRange, randomNumberInRange, readFileLines, rearg, recordAnimationFrames, redirect, reducedFilter, reduceSuccessive, reduceWhich, reject, remove, removeNonASCII, renameKeys, reverseString, RGBToHex, round, runAsync, runPromisesInSeries, sample, sampleSize, scrollToTop, sdbm, serializeCookie, setStyle, shallowClone, shank, show, shuffle, similarity, size, sleep, smoothScroll, sortCharactersInString, sortedIndex, sortedIndexBy, sortedLastIndex, sortedLastIndexBy, splitLines, spreadOver, stableSort, standardDeviation, stringPermutations, stripHTMLTags, sum, sumBy, sumPower, symmetricDifference, symmetricDifferenceBy, symmetricDifferenceWith, tail, take, takeRight, takeRightWhile, takeWhile, throttle, times, timeTaken, toCamelCase, toCurrency, toDecimalMark, toggleClass, toHash, toKebabCase, tomorrow, toOrdinalSuffix, toSafeInteger, toSnakeCase, toTitleCase, transform, triggerEvent, truncateString, truthCheckCollection, unary, uncurry, unescapeHTML, unflattenObject, unfold, union, unionBy, unionWith, uniqueElements, uniqueElementsBy, uniqueElementsByRight, uniqueSymmetricDifference, untildify, unzip, unzipWith, URLJoin, UUIDGeneratorBrowser, UUIDGeneratorNode, validateNumber, when, without, words, xProd, yesNo, zip, zipObject, zipWith };

188
dist/_30s.js vendored
View File

@ -7,51 +7,6 @@
const fs = typeof require !== "undefined" && require('fs');
const crypto = typeof require !== "undefined" && require('crypto');
const CSVToArray = (data, delimiter = ',', omitFirstRow = false) =>
data
.slice(omitFirstRow ? data.indexOf('\n') + 1 : 0)
.split('\n')
.map(v => v.split(delimiter));
const CSVToJSON = (data, delimiter = ',') => {
const titles = data.slice(0, data.indexOf('\n')).split(delimiter);
return data
.slice(data.indexOf('\n') + 1)
.split('\n')
.map(v => {
const values = v.split(delimiter);
return titles.reduce((obj, title, index) => ((obj[title] = values[index]), obj), {});
});
};
const JSONToFile = (obj, filename) =>
fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2));
const JSONtoCSV = (arr, columns, delimiter = ',') =>
[
columns.join(delimiter),
...arr.map(obj =>
columns.reduce(
(acc, key) => `${acc}${!acc.length ? '' : delimiter}"${!obj[key] ? '' : obj[key]}"`,
''
)
)
].join('\n');
const RGBToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0');
const URLJoin = (...args) =>
args
.join('/')
.replace(/[\/]+/g, '/')
.replace(/^(.+):\//, '$1://')
.replace(/^file:/, 'file:/')
.replace(/\/(\?|&|#[^!])/g, '$1')
.replace(/\?/g, '&')
.replace('&', '?');
const UUIDGeneratorBrowser = () =>
([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>
(c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)
);
const UUIDGeneratorNode = () =>
([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>
(c ^ (crypto.randomBytes(1)[0] & (15 >> (c / 4)))).toString(16)
);
const all = (arr, fn = Boolean) => arr.every(fn);
const allEqual = arr => arr.every(val => val === arr[0]);
const any = (arr, fn = Boolean) => arr.some(fn);
@ -175,7 +130,6 @@
acc[val] = (acc[val] || 0) + 1;
return acc;
}, {});
const countOccurrences = (arr, val) => arr.reduce((a, v) => (v === val ? a + 1 : a), 0);
const counter = (selector, start, end, step = 1, duration = 2000) => {
let current = start,
_step = (end - start) * step < 0 ? -step : step,
@ -187,6 +141,7 @@
}, Math.abs(Math.floor(duration / (end - start))));
return timer;
};
const countOccurrences = (arr, val) => arr.reduce((a, v) => (v === val ? a + 1 : a), 0);
const createDirIfNotExists = dir => (!fs.existsSync(dir) ? fs.mkdirSync(dir) : undefined);
const createElement = str => {
const el = document.createElement('div');
@ -207,6 +162,21 @@
if (i > -1) this.hub[event].splice(i, 1);
}
});
const CSVToArray = (data, delimiter = ',', omitFirstRow = false) =>
data
.slice(omitFirstRow ? data.indexOf('\n') + 1 : 0)
.split('\n')
.map(v => v.split(delimiter));
const CSVToJSON = (data, delimiter = ',') => {
const titles = data.slice(0, data.indexOf('\n')).split(delimiter);
return data
.slice(data.indexOf('\n') + 1)
.split('\n')
.map(v => {
const values = v.split(delimiter);
return titles.reduce((obj, title, index) => ((obj[title] = values[index]), obj), {});
});
};
const currentURL = () => window.location.href;
const curry = (fn, arity = fn.length, ...args) =>
arity <= args.length ? fn(...args) : curry.bind(null, fn, arity, ...args);
@ -226,7 +196,7 @@
Object.keys(clone).forEach(
key => (clone[key] = typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key])
);
return Array.isArray(obj) ? (clone.length = obj.length) && Array.from(clone) : clone;
return Array.isArray(obj) && obj.length ? (clone.length = obj.length) && Array.from(clone) : Array.isArray(obj) ? Array.from(obj) : clone;
};
const deepFlatten = arr => [].concat(...arr.map(v => (Array.isArray(v) ? deepFlatten(v) : v)));
const deepFreeze = obj =>
@ -380,11 +350,6 @@
.slice(0)
.reverse()
.forEach(callback);
const forOwn = (obj, fn) => Object.keys(obj).forEach(key => fn(obj[key], key, obj));
const forOwnRight = (obj, fn) =>
Object.keys(obj)
.reverse()
.forEach(key => fn(obj[key], key, obj));
const formatDuration = ms => {
if (ms < 0) ms = -ms;
const time = {
@ -399,6 +364,11 @@
.map(([key, val]) => `${val} ${key}${val !== 1 ? 's' : ''}`)
.join(', ');
};
const forOwn = (obj, fn) => Object.keys(obj).forEach(key => fn(obj[key], key, obj));
const forOwnRight = (obj, fn) =>
Object.keys(obj)
.reverse()
.forEach(key => fn(obj[key], key, obj));
const fromCamelCase = (str, separator = '_') =>
str
.replace(/([a-z\d])([A-Z])/g, '$1' + separator + '$2')
@ -527,10 +497,6 @@
for (let i = 0; i < iterations; i++) fn();
return (1000 * iterations) / (performance.now() - before);
};
const inRange = (n, start, end = null) => {
if (end && start > end) [end, start] = [start, end];
return end == null ? n >= 0 && n < start : n >= start && n < end;
};
const indentString = (str, count, indent = ' ') => str.replace(/^/gm, indent.repeat(count));
const indexOfAll = (arr, val) => arr.reduce((acc, el, i) => (el === val ? [...acc, i] : acc), []);
const initial = arr => arr.slice(0, -1);
@ -547,6 +513,10 @@
args.length === 0
? val
: Array.from({ length: args[0] }).map(() => initializeNDArray(val, ...args.slice(1)));
const inRange = (n, start, end = null) => {
if (end && start > end) [end, start] = [start, end];
return end == null ? n >= 0 && n < start : n >= start && n < end;
};
const insertAfter = (el, htmlString) => el.insertAdjacentHTML('afterend', htmlString);
const insertBefore = (el, htmlString) => el.insertAdjacentHTML('beforebegin', htmlString);
const intersection = (a, b) => {
@ -658,6 +628,18 @@
: acc + val + separator,
''
);
const JSONtoCSV = (arr, columns, delimiter = ',') =>
[
columns.join(delimiter),
...arr.map(obj =>
columns.reduce(
(acc, key) => `${acc}${!acc.length ? '' : delimiter}"${!obj[key] ? '' : obj[key]}"`,
''
)
)
].join('\n');
const JSONToFile = (obj, filename) =>
fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2));
const last = arr => arr[arr.length - 1];
const lcm = (...arr) => {
const gcd = (x, y) => (!y ? x : gcd(y, x % y));
@ -790,6 +772,14 @@
el.addEventListener(evt, opts.target ? delegatorFn : fn, opts.options || false);
if (opts.target) return delegatorFn;
};
const once = fn => {
let called = false;
return function(...args) {
if (called) return;
called = true;
return fn.apply(this, args);
};
};
const onUserInputChange = callback => {
let type = 'mouse',
lastTime = 0;
@ -804,14 +794,6 @@
(type = 'touch'), callback(type), document.addEventListener('mousemove', mousemoveHandler);
});
};
const once = fn => {
let called = false;
return function(...args) {
if (called) return;
called = true;
return fn.apply(this, args);
};
};
const orderBy = (arr, props, orders) =>
[...arr].sort((a, b) =>
props.reduce((acc, prop, i) => {
@ -970,10 +952,6 @@
};
const redirect = (url, asLink = true) =>
asLink ? (window.location.href = url) : window.location.replace(url);
const reduceSuccessive = (arr, fn, acc) =>
arr.reduce((res, val, i, arr) => (res.push(fn(res.slice(-1)[0], val, i, arr)), res), [acc]);
const reduceWhich = (arr, comparator = (a, b) => a - b) =>
arr.reduce((a, b) => (comparator(a, b) >= 0 ? b : a));
const reducedFilter = (data, keys, fn) =>
data.filter(fn).map(el =>
keys.reduce((acc, key) => {
@ -981,6 +959,10 @@
return acc;
}, {})
);
const reduceSuccessive = (arr, fn, acc) =>
arr.reduce((res, val, i, arr) => (res.push(fn(res.slice(-1)[0], val, i, arr)), res), [acc]);
const reduceWhich = (arr, comparator = (a, b) => a - b) =>
arr.reduce((a, b) => (comparator(a, b) >= 0 ? b : a));
const reject = (pred, array) => array.filter((...args) => !pred(...args));
const remove = (arr, func) =>
Array.isArray(arr)
@ -999,6 +981,7 @@
{}
);
const reverseString = str => [...str].reverse().join('');
const RGBToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0');
const round = (n, decimals = 0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`);
const runAsync = fn => {
const worker = new Worker(
@ -1173,16 +1156,16 @@
}
};
};
const times = (n, fn, context = undefined) => {
let i = 0;
while (fn.call(context, i) !== false && ++i < n) {}
};
const timeTaken = callback => {
console.time('timeTaken');
const r = callback();
console.timeEnd('timeTaken');
return r;
};
const times = (n, fn, context = undefined) => {
let i = 0;
while (fn.call(context, i) !== false && ++i < n) {}
};
const toCamelCase = str => {
let s =
str &&
@ -1195,6 +1178,7 @@
const toCurrency = (n, curr, LanguageFormat = undefined) =>
Intl.NumberFormat(LanguageFormat, { style: 'currency', currency: curr }).format(n);
const toDecimalMark = num => num.toLocaleString('en-US');
const toggleClass = (el, className) => el.classList.toggle(className);
const toHash = (object, key) =>
Array.prototype.reduce.call(
object,
@ -1207,6 +1191,11 @@
.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('-');
const tomorrow = () => {
let t = new Date();
t.setDate(t.getDate() + 1);
return t.toISOString().split('T')[0];
};
const toOrdinalSuffix = num => {
const int = parseInt(num),
digits = [int % 10, int % 100],
@ -1230,12 +1219,6 @@
.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.charAt(0).toUpperCase() + x.slice(1))
.join(' ');
const toggleClass = (el, className) => el.classList.toggle(className);
const tomorrow = () => {
let t = new Date();
t.setDate(t.getDate() + 1);
return t.toISOString().split('T')[0];
};
const transform = (obj, fn, acc) => Object.keys(obj).reduce((a, k) => fn(a, obj[k], k, obj), acc);
const triggerEvent = (el, eventType, detail) =>
el.dispatchEvent(new CustomEvent(eventType, { detail }));
@ -1320,6 +1303,23 @@
}).map(x => [])
)
.map(val => fn(...val));
const URLJoin = (...args) =>
args
.join('/')
.replace(/[\/]+/g, '/')
.replace(/^(.+):\//, '$1://')
.replace(/^file:/, 'file:/')
.replace(/\/(\?|&|#[^!])/g, '$1')
.replace(/\?/g, '&')
.replace('&', '?');
const UUIDGeneratorBrowser = () =>
([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>
(c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)
);
const UUIDGeneratorNode = () =>
([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>
(c ^ (crypto.randomBytes(1)[0] & (15 >> (c / 4)))).toString(16)
);
const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == n;
const when = (pred, whenTrue) => x => (pred(x) ? whenTrue(x) : x);
const without = (arr, ...args) => arr.filter(v => !args.includes(v));
@ -1343,14 +1343,6 @@
);
};
exports.CSVToArray = CSVToArray;
exports.CSVToJSON = CSVToJSON;
exports.JSONToFile = JSONToFile;
exports.JSONtoCSV = JSONtoCSV;
exports.RGBToHex = RGBToHex;
exports.URLJoin = URLJoin;
exports.UUIDGeneratorBrowser = UUIDGeneratorBrowser;
exports.UUIDGeneratorNode = UUIDGeneratorNode;
exports.all = all;
exports.allEqual = allEqual;
exports.any = any;
@ -1390,11 +1382,13 @@
exports.converge = converge;
exports.copyToClipboard = copyToClipboard;
exports.countBy = countBy;
exports.countOccurrences = countOccurrences;
exports.counter = counter;
exports.countOccurrences = countOccurrences;
exports.createDirIfNotExists = createDirIfNotExists;
exports.createElement = createElement;
exports.createEventHub = createEventHub;
exports.CSVToArray = CSVToArray;
exports.CSVToJSON = CSVToJSON;
exports.currentURL = currentURL;
exports.curry = curry;
exports.dayOfYear = dayOfYear;
@ -1440,9 +1434,9 @@
exports.flattenObject = flattenObject;
exports.flip = flip;
exports.forEachRight = forEachRight;
exports.formatDuration = formatDuration;
exports.forOwn = forOwn;
exports.forOwnRight = forOwnRight;
exports.formatDuration = formatDuration;
exports.fromCamelCase = fromCamelCase;
exports.functionName = functionName;
exports.functions = functions;
@ -1470,7 +1464,6 @@
exports.httpPost = httpPost;
exports.httpsRedirect = httpsRedirect;
exports.hz = hz;
exports.inRange = inRange;
exports.indentString = indentString;
exports.indexOfAll = indexOfAll;
exports.initial = initial;
@ -1479,6 +1472,7 @@
exports.initializeArrayWithRangeRight = initializeArrayWithRangeRight;
exports.initializeArrayWithValues = initializeArrayWithValues;
exports.initializeNDArray = initializeNDArray;
exports.inRange = inRange;
exports.insertAfter = insertAfter;
exports.insertBefore = insertBefore;
exports.intersection = intersection;
@ -1522,6 +1516,8 @@
exports.isValidJSON = isValidJSON;
exports.isWritableStream = isWritableStream;
exports.join = join;
exports.JSONtoCSV = JSONtoCSV;
exports.JSONToFile = JSONToFile;
exports.last = last;
exports.lcm = lcm;
exports.longestItem = longestItem;
@ -1559,8 +1555,8 @@
exports.omit = omit;
exports.omitBy = omitBy;
exports.on = on;
exports.onUserInputChange = onUserInputChange;
exports.once = once;
exports.onUserInputChange = onUserInputChange;
exports.orderBy = orderBy;
exports.over = over;
exports.overArgs = overArgs;
@ -1595,14 +1591,15 @@
exports.rearg = rearg;
exports.recordAnimationFrames = recordAnimationFrames;
exports.redirect = redirect;
exports.reducedFilter = reducedFilter;
exports.reduceSuccessive = reduceSuccessive;
exports.reduceWhich = reduceWhich;
exports.reducedFilter = reducedFilter;
exports.reject = reject;
exports.remove = remove;
exports.removeNonASCII = removeNonASCII;
exports.renameKeys = renameKeys;
exports.reverseString = reverseString;
exports.RGBToHex = RGBToHex;
exports.round = round;
exports.runAsync = runAsync;
exports.runPromisesInSeries = runPromisesInSeries;
@ -1643,19 +1640,19 @@
exports.takeRightWhile = takeRightWhile;
exports.takeWhile = takeWhile;
exports.throttle = throttle;
exports.timeTaken = timeTaken;
exports.times = times;
exports.timeTaken = timeTaken;
exports.toCamelCase = toCamelCase;
exports.toCurrency = toCurrency;
exports.toDecimalMark = toDecimalMark;
exports.toggleClass = toggleClass;
exports.toHash = toHash;
exports.toKebabCase = toKebabCase;
exports.tomorrow = tomorrow;
exports.toOrdinalSuffix = toOrdinalSuffix;
exports.toSafeInteger = toSafeInteger;
exports.toSnakeCase = toSnakeCase;
exports.toTitleCase = toTitleCase;
exports.toggleClass = toggleClass;
exports.tomorrow = tomorrow;
exports.transform = transform;
exports.triggerEvent = triggerEvent;
exports.truncateString = truncateString;
@ -1675,6 +1672,9 @@
exports.untildify = untildify;
exports.unzip = unzip;
exports.unzipWith = unzipWith;
exports.URLJoin = URLJoin;
exports.UUIDGeneratorBrowser = UUIDGeneratorBrowser;
exports.UUIDGeneratorNode = UUIDGeneratorNode;
exports.validateNumber = validateNumber;
exports.when = when;
exports.without = without;

View File

@ -133,7 +133,7 @@ Object<span class="token punctuation">.</span><span class="token function">assig
x <span class="token operator">=></span> x <span class="token operator">+</span> <span class="token number">3</span><span class="token punctuation">,</span>
<span class="token keyword">async</span> x <span class="token operator">=></span> <span class="token punctuation">(</span><span class="token keyword">await</span> x<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">4</span>
<span class="token punctuation">);
(</span><span class="token keyword">async</span> <span class="token punctuation">()</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
(</span><span class="token keyword">async</span><span class="token punctuation">()</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">await</span> <span class="token function">sum</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">));</span> <span class="token comment">// 15 (after one second)</span>
<span class="token punctuation">})();</span>
</pre></div><div class="card code-card"><div class="corner intermediate"></div><div class="section card-content"><h4 id="pipefunctions">pipeFunctions</h4><p>Performs left-to-right function composition.</p><p>Use <code>Array.prototype.reduce()</code> with the spread operator (<code>...</code>) to perform left-to-right function composition. The first (leftmost) function can accept one or more arguments; the remaining functions must be unary.</p></div><div class="copy-button-container"><button class="copy-button" aria-label="Copy to clipboard"></button></div><pre class="section card-code language-js"><span class="token keyword">const</span> <span class="token function-variable function">pipeFunctions</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token operator">...</span>fns<span class="token punctuation">)</span> <span class="token operator">=></span> fns<span class="token punctuation">.</span><span class="token function">reduce</span><span class="token punctuation">((</span>f<span class="token punctuation">,</span> g<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">(</span><span class="token operator">...</span>args<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token function">g</span><span class="token punctuation">(</span><span class="token function">f</span><span class="token punctuation">(</span><span class="token operator">...</span>args<span class="token punctuation">)));</span>

View File

@ -407,8 +407,7 @@
</pre></div><div class="card code-card"><div class="corner beginner"></div><div class="section card-content"><h4 id="reject">reject</h4><p>Takes a predicate and array, like <code>Array.prototype.filter()</code>, but only keeps <code>x</code> if <code>pred(x) === false</code>.</p></div><div class="copy-button-container"><button class="copy-button" aria-label="Copy to clipboard"></button></div><pre class="section card-code language-js"><span class="token keyword">const</span> <span class="token function-variable function">reject</span> <span class="token operator">=</span> <span class="token punctuation">(</span>pred<span class="token punctuation">,</span> array<span class="token punctuation">)</span> <span class="token operator">=></span> array<span class="token punctuation">.</span><span class="token function">filter</span><span class="token punctuation">((</span><span class="token operator">...</span>args<span class="token punctuation">)</span> <span class="token operator">=> !</span><span class="token function">pred</span><span class="token punctuation">(</span><span class="token operator">...</span>args<span class="token punctuation">));</span>
</pre><label class="collapse">examples</label><pre class="section card-examples language-js"><span class="token function">reject</span><span class="token punctuation">(</span>x <span class="token operator">=></span> x <span class="token operator">%</span> <span class="token number">2</span> <span class="token operator">===</span> <span class="token number">0</span><span class="token punctuation">, [</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">]);</span> <span class="token comment">// [1, 3, 5]</span>
<span class="token function">reject</span><span class="token punctuation">(</span>word <span class="token operator">=></span> word<span class="token punctuation">.</span>length <span class="token operator">></span> <span class="token number">4</span><span class="token punctuation">, [</span><span class="token string">'Apple'</span><span class="token punctuation">,</span> <span class="token string">'Pear'</span><span class="token punctuation">,</span> <span class="token string">'Kiwi'</span><span class="token punctuation">,</span> <span class="token string">'Banana'</span><span class="token punctuation">]);</span> <span class="token comment">// ['Pear', 'Kiwi']</span>
</pre></div><div class="card code-card"><div class="corner intermediate"></div><div class="section card-content"><h4 id="remove">remove</h4><p>Removes elements from an array for which the given function returns <code>false</code>.</p><p>Use <code>Array.prototype.filter()</code> to find array elements that return truthy values and <code>Array.prototype.reduce()</code> to remove elements using <code>Array.prototype.splice()</code>. The <code>func</code> is invoked with three arguments (<code>value, index, array</code>).</p></div><div class="copy-button-container"><button class="copy-button" aria-label="Copy to clipboard"></button></div><pre class="section card-code language-js">
<span class="token keyword">const</span> <span class="token function-variable function">remove</span> <span class="token operator">=</span> <span class="token punctuation">(</span>arr<span class="token punctuation">,</span> func<span class="token punctuation">)</span> <span class="token operator">=></span>
</pre></div><div class="card code-card"><div class="corner intermediate"></div><div class="section card-content"><h4 id="remove">remove</h4><p>Removes elements from an array for which the given function returns <code>false</code>.</p><p>Use <code>Array.prototype.filter()</code> to find array elements that return truthy values and <code>Array.prototype.reduce()</code> to remove elements using <code>Array.prototype.splice()</code>. The <code>func</code> is invoked with three arguments (<code>value, index, array</code>).</p></div><div class="copy-button-container"><button class="copy-button" aria-label="Copy to clipboard"></button></div><pre class="section card-code language-js"><span class="token keyword">const</span> <span class="token function-variable function">remove</span> <span class="token operator">=</span> <span class="token punctuation">(</span>arr<span class="token punctuation">,</span> func<span class="token punctuation">)</span> <span class="token operator">=></span>
Array<span class="token punctuation">.</span><span class="token function">isArray</span><span class="token punctuation">(</span>arr<span class="token punctuation">)</span>
<span class="token operator">?</span> arr<span class="token punctuation">.</span><span class="token function">filter</span><span class="token punctuation">(</span>func<span class="token punctuation">).</span><span class="token function">reduce</span><span class="token punctuation">((</span>acc<span class="token punctuation">,</span> val<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
arr<span class="token punctuation">.</span><span class="token function">splice</span><span class="token punctuation">(</span>arr<span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span>val<span class="token punctuation">),</span> <span class="token number">1</span><span class="token punctuation">);</span>

View File

@ -115,7 +115,11 @@
Object<span class="token punctuation">.</span><span class="token function">keys</span><span class="token punctuation">(</span>clone<span class="token punctuation">).</span><span class="token function">forEach</span><span class="token punctuation">(</span>
key <span class="token operator">=></span> <span class="token punctuation">(</span>clone<span class="token punctuation">[</span>key<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">typeof</span> obj<span class="token punctuation">[</span>key<span class="token punctuation">]</span> <span class="token operator">===</span> <span class="token string">'object'</span> <span class="token operator">?</span> <span class="token function">deepClone</span><span class="token punctuation">(</span>obj<span class="token punctuation">[</span>key<span class="token punctuation">]) :</span> obj<span class="token punctuation">[</span>key<span class="token punctuation">])
);</span>
<span class="token keyword">return</span> Array<span class="token punctuation">.</span><span class="token function">isArray</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token punctuation">(</span>clone<span class="token punctuation">.</span>length <span class="token operator">=</span> obj<span class="token punctuation">.</span>length<span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> Array<span class="token punctuation">.</span><span class="token keyword">from</span><span class="token punctuation">(</span>clone<span class="token punctuation">) :</span> clone<span class="token punctuation">;
<span class="token keyword">return</span> Array<span class="token punctuation">.</span><span class="token function">isArray</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> obj<span class="token punctuation">.</span>length
<span class="token operator">?</span> <span class="token punctuation">(</span>clone<span class="token punctuation">.</span>length <span class="token operator">=</span> obj<span class="token punctuation">.</span>length<span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> Array<span class="token punctuation">.</span><span class="token keyword">from</span><span class="token punctuation">(</span>clone<span class="token punctuation">)
:</span> Array<span class="token punctuation">.</span><span class="token function">isArray</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span>
<span class="token operator">?</span> Array<span class="token punctuation">.</span><span class="token keyword">from</span><span class="token punctuation">(</span>obj<span class="token punctuation">)
:</span> clone<span class="token punctuation">;
};</span>
</pre><label class="collapse">examples</label><pre class="section card-examples language-js"><span class="token keyword">const</span> a <span class="token operator">=</span> <span class="token punctuation">{</span> foo<span class="token punctuation">:</span> <span class="token string">'bar'</span><span class="token punctuation">,</span> obj<span class="token punctuation">: {</span> a<span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">,</span> b<span class="token punctuation">:</span> <span class="token number">2</span> <span class="token punctuation">} };</span>
<span class="token keyword">const</span> b <span class="token operator">=</span> <span class="token function">deepClone</span><span class="token punctuation">(</span>a<span class="token punctuation">);</span> <span class="token comment">// a !== b, a.obj !== b.obj</span>

View File

@ -12,7 +12,11 @@ const deepClone = obj => {
Object.keys(clone).forEach(
key => (clone[key] = typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key])
);
return Array.isArray(obj) ? Array.from(obj) : clone;
return Array.isArray(obj) && obj.length
? (clone.length = obj.length) && Array.from(clone)
: Array.isArray(obj)
? Array.from(obj)
: clone;
};
```

View File

@ -17,7 +17,7 @@ const sum = pipeAsyncFunctions(
x => x + 3,
async x => (await x) + 4
);
(async () => {
(async() => {
console.log(await sum(5)); // 15 (after one second)
})();
```

View File

@ -6,7 +6,6 @@ Use `Array.prototype.filter()` to find array elements that return truthy values
The `func` is invoked with three arguments (`value, index, array`).
```js
const remove = (arr, func) =>
Array.isArray(arr)
? arr.filter(func).reduce((acc, val) => {

View File

@ -1,53 +1,6 @@
const fs = typeof require !== "undefined" && require('fs');
const crypto = typeof require !== "undefined" && require('crypto');
const CSVToArray = (data, delimiter = ',', omitFirstRow = false) =>
data
.slice(omitFirstRow ? data.indexOf('\n') + 1 : 0)
.split('\n')
.map(v => v.split(delimiter));
const CSVToJSON = (data, delimiter = ',') => {
const titles = data.slice(0, data.indexOf('\n')).split(delimiter);
return data
.slice(data.indexOf('\n') + 1)
.split('\n')
.map(v => {
const values = v.split(delimiter);
return titles.reduce((obj, title, index) => ((obj[title] = values[index]), obj), {});
});
};
const JSONToFile = (obj, filename) =>
fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2));
const JSONtoCSV = (arr, columns, delimiter = ',') =>
[
columns.join(delimiter),
...arr.map(obj =>
columns.reduce(
(acc, key) => `${acc}${!acc.length ? '' : delimiter}"${!obj[key] ? '' : obj[key]}"`,
''
)
)
].join('\n');
const RGBToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0');
const URLJoin = (...args) =>
args
.join('/')
.replace(/[\/]+/g, '/')
.replace(/^(.+):\//, '$1://')
.replace(/^file:/, 'file:/')
.replace(/\/(\?|&|#[^!])/g, '$1')
.replace(/\?/g, '&')
.replace('&', '?');
const UUIDGeneratorBrowser = () =>
([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>
(c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)
);
const UUIDGeneratorNode = () =>
([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>
(c ^ (crypto.randomBytes(1)[0] & (15 >> (c / 4)))).toString(16)
);
const all = (arr, fn = Boolean) => arr.every(fn);
const allEqual = arr => arr.every(val => val === arr[0]);
const any = (arr, fn = Boolean) => arr.some(fn);
@ -60,7 +13,7 @@ const arrayToHtmlList = (arr, listID) =>
(el.innerHTML += arr.map(item => `<li>${item}</li>`).join(''))
))();
const ary = (fn, n) => (...args) => fn(...args.slice(0, n));
const atob = str => Buffer.from(str, 'base64').toString('binary');
const atob = str => Buffer.from(str, 'base64').toString('binary');
const attempt = (fn, ...args) => {
try {
@ -101,14 +54,14 @@ const binomialCoefficient = (n, k) => {
};
const bottomVisible = () =>
document.documentElement.clientHeight + window.scrollY >=
const btoa = str => Buffer.from(str, 'binary').toString('base64');
(document.documentElement.scrollHeight || document.documentElement.clientHeight);
const btoa = str => Buffer.from(str, 'binary').toString('base64');
const byteSize = str => new Blob([str]).size;
const call = (key, ...args) => context => context[key](...args);
const capitalize = ([first, ...rest], lowerRest = false) =>
first.toUpperCase() + (lowerRest ? rest.join('').toLowerCase() : rest.join(''));
const chainAsync = fns => {
const capitalizeEveryWord = str => str.replace(/\b[a-z]/g, char => char.toUpperCase());
const castArray = val => (Array.isArray(val) ? val : [val]);
const chainAsync = fns => {
@ -145,8 +98,8 @@ const colorize = (...args) => ({
bgBlue: `\x1b[44m${args.join(' ')}\x1b[0m`,
bgMagenta: `\x1b[45m${args.join(' ')}\x1b[0m`,
bgCyan: `\x1b[46m${args.join(' ')}\x1b[0m`,
const compactWhitespace = str => str.replace(/\s{2,}/g, ' ');
const compose = (...fns) => fns.reduce((f, g) => (...args) => f(g(...args)));
bgWhite: `\x1b[47m${args.join(' ')}\x1b[0m`
});
const compact = arr => arr.filter(Boolean);
const compactWhitespace = str => str.replace(/\s{2,}/g, ' ');
@ -166,12 +119,11 @@ const copyToClipboard = str => {
el.select();
document.execCommand('copy');
document.body.removeChild(el);
const countBy = (arr, fn) =>
if (selected) {
document.getSelection().removeAllRanges();
document.getSelection().addRange(selected);
}
};
const countOccurrences = (arr, val) => arr.reduce((a, v) => (v === val ? a + 1 : a), 0);
const countBy = (arr, fn) =>
arr.map(typeof fn === 'function' ? fn : val => val[fn]).reduce((acc, val) => {
@ -183,6 +135,7 @@ const counter = (selector, start, end, step = 1, duration = 2000) => {
_step = (end - start) * step < 0 ? -step : step,
timer = setInterval(() => {
current += _step;
document.querySelector(selector).innerHTML = current;
if (current >= end) document.querySelector(selector).innerHTML = end;
if (current >= end) clearInterval(timer);
}, Math.abs(Math.floor(duration / (end - start))));
@ -204,10 +157,25 @@ const createEventHub = () => ({
},
on(event, handler) {
if (!this.hub[event]) this.hub[event] = [];
this.hub[event].push(handler);
},
off(event, handler) {
const i = (this.hub[event] || []).findIndex(h => h === handler);
if (i > -1) this.hub[event].splice(i, 1);
}
});
const CSVToArray = (data, delimiter = ',', omitFirstRow = false) =>
data
.slice(omitFirstRow ? data.indexOf('\n') + 1 : 0)
.split('\n')
.map(v => v.split(delimiter));
const CSVToJSON = (data, delimiter = ',') => {
const titles = data.slice(0, data.indexOf('\n')).split(delimiter);
return data
.slice(data.indexOf('\n') + 1)
.split('\n')
.map(v => {
const dayOfYear = date =>
const values = v.split(delimiter);
return titles.reduce((obj, title, index) => ((obj[title] = values[index]), obj), {});
});
};
@ -218,20 +186,20 @@ const debounce = (fn, ms = 0) => {
const dayOfYear = date =>
Math.floor((date - new Date(date.getFullYear(), 0, 0)) / 1000 / 60 / 60 / 24);
const debounce = (fn, ms = 0) => {
const deepClone = obj => {
let timeoutId;
return function(...args) {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => fn.apply(this, args), ms);
};
return Array.isArray(obj) ? (clone.length = obj.length) && Array.from(clone) : clone;
};
const decapitalize = ([first, ...rest], upperRest = false) =>
first.toLowerCase() + (upperRest ? rest.join('').toUpperCase() : rest.join(''));
const deepFreeze = obj =>
const deepClone = obj => {
let clone = Object.assign({}, obj);
Object.keys(clone).forEach(
key => (clone[key] = typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key])
const deepMapKeys = (obj, f) =>
);
return Array.isArray(obj) && obj.length ? (clone.length = obj.length) && Array.from(clone) : Array.isArray(obj) ? Array.from(obj) : clone;
};
const deepFlatten = arr => [].concat(...arr.map(v => (Array.isArray(v) ? deepFlatten(v) : v)));
@ -243,8 +211,8 @@ const deepMapKeys = (obj, f) =>
) || Object.freeze(obj);
const deepMapKeys = (obj, f) =>
const defer = (fn, ...args) => setTimeout(fn, 1, ...args);
const degreesToRads = deg => (deg * Math.PI) / 180.0;
Array.isArray(obj)
? obj.map(val => deepMapKeys(val, f))
: typeof obj === 'object'
? Object.keys(obj).reduce((acc, current) => {
const val = obj[current];
@ -254,12 +222,12 @@ const difference = (a, b) => {
}, {})
: obj;
const defaults = (obj, ...defs) => Object.assign({}, obj, ...defs.reverse(), obj);
const differenceBy = (a, b, fn) => {
const defer = (fn, ...args) => setTimeout(fn, 1, ...args);
const degreesToRads = deg => (deg * Math.PI) / 180.0;
const delay = (fn, wait, ...args) => setTimeout(fn, wait, ...args);
const dig = (obj, target) =>
const detectDeviceType = () =>
/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)
? 'Mobile'
: 'Desktop';
@ -287,7 +255,7 @@ const elementIsVisibleInViewport = (el, partiallyVisible = false) => {
const dropRight = (arr, n = 1) => arr.slice(0, -n);
const dropRightWhile = (arr, func) => {
while (arr.length > 0 && !func(arr[arr.length - 1])) arr = arr.slice(0, -1);
const elo = ([...ratings], kFactor = 32, selfRating) => {
return arr;
};
const dropWhile = (arr, func) => {
while (arr.length > 0 && !func(arr[0])) arr = arr.slice(1);
@ -334,7 +302,7 @@ const extendHex = shortHex =>
/[&<>'"]/g,
tag =>
({
const factorial = n =>
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
"'": '&#39;',
@ -377,11 +345,6 @@ const forEachRight = (arr, callback) =>
.pop()[0];
const findLastKey = (obj, fn) =>
Object.keys(obj)
const forOwn = (obj, fn) => Object.keys(obj).forEach(key => fn(obj[key], key, obj));
const forOwnRight = (obj, fn) =>
Object.keys(obj)
.reverse()
.forEach(key => fn(obj[key], key, obj));
.reverse()
.find(key => fn(obj[key], key, obj));
const flatten = (arr, depth = 1) =>
@ -396,6 +359,11 @@ const formatDuration = ms => {
const flip = fn => (first, ...rest) => fn(...rest, first);
const forEachRight = (arr, callback) =>
arr
.slice(0)
.reverse()
.forEach(callback);
const formatDuration = ms => {
if (ms < 0) ms = -ms;
const time = {
day: Math.floor(ms / 86400000),
hour: Math.floor(ms / 3600000) % 24,
@ -423,14 +391,14 @@ const get = (from, ...selectors) =>
(inherited
? [...Object.keys(obj), ...Object.keys(Object.getPrototypeOf(obj))]
: Object.keys(obj)
const getColonTimeFromDate = date => date.toTimeString().slice(0, 8);
).filter(key => typeof obj[key] === 'function');
const gcd = (...arr) => {
const _gcd = (x, y) => (!y ? x : gcd(y, x % y));
const getImages = (el, includeDuplicates = false) => {
return [...arr].reduce((a, b) => _gcd(a, b));
};
const geometricProgression = (end, start = 1, step = 2) =>
Array.from({ length: Math.floor(Math.log(end / start) / Math.log(step)) + 1 }).map(
const getMeridiemSuffixOfInteger = num =>
(v, i) => start * step ** i
);
const get = (from, ...selectors) =>
[...selectors].map(s =>
@ -501,15 +469,15 @@ const hexToRGB = hex => {
0
)
);
const hide = (...el) => [...el].forEach(e => (e.style.display = 'none'));
const httpGet = (url, callback, err = console.error) => {
const head = arr => arr[0];
const hexToRGB = hex => {
let alpha = false,
h = hex.slice(hex.startsWith('#') ? 1 : 0);
if (h.length === 3) h = [...h].map(x => x + x).join('');
else if (h.length === 8) alpha = true;
h = parseInt(h, 16);
return (
const httpPost = (url, data, callback, err = console.error) => {
'rgb' +
(alpha ? 'a' : '') +
'(' +
(h >>> (alpha ? 24 : 16)) +
@ -520,15 +488,11 @@ const httpPost = (url, data, callback, err = console.error) => {
(alpha ? `, ${h & 0x000000ff}` : '') +
')'
);
const hz = (fn, iterations = 100) => {
};
const hide = (...el) => [...el].forEach(e => (e.style.display = 'none'));
const httpGet = (url, callback, err = console.error) => {
const inRange = (n, start, end = null) => {
if (end && start > end) [end, start] = [start, end];
return end == null ? n >= 0 && n < start : n >= start && n < end;
};
const request = new XMLHttpRequest();
request.open('GET', url, true);
request.onload = () => callback(request.responseText);
@ -545,6 +509,10 @@ const initializeNDArray = (val, ...args) =>
request.send(data);
};
const httpsRedirect = () => {
if (location.protocol !== 'https:') location.replace('https://' + location.href.split('//')[1]);
};
const hz = (fn, iterations = 100) => {
const before = performance.now();
for (let i = 0; i < iterations; i++) fn();
return (1000 * iterations) / (performance.now() - before);
@ -565,7 +533,7 @@ const invertKeyValues = (obj, fn) =>
args.length === 0
? val
: Array.from({ length: args[0] }).map(() => initializeNDArray(val, ...args.slice(1)));
const isAfterDate = (dateA, dateB) => dateA > dateB;
const inRange = (n, start, end = null) => {
if (end && start > end) [end, start] = [start, end];
return end == null ? n >= 0 && n < start : n >= start && n < end;
};
@ -577,12 +545,12 @@ const isAnagram = (str1, str2) => {
};
const intersectionBy = (a, b, fn) => {
const s = new Set(b.map(fn));
const isBeforeDate = (dateA, dateB) => dateA < dateB;
return a.filter(x => s.has(fn(x)));
};
const intersectionWith = (a, b, comp) => a.filter(x => b.findIndex(y => comp(x, y)) !== -1);
const invertKeyValues = (obj, fn) =>
Object.keys(obj).reduce((acc, key) => {
const isDuplexStream = val =>
const val = fn ? fn(obj[key]) : obj[key];
acc[val] = acc[val] || [];
acc[val].push(key);
return acc;
@ -594,7 +562,7 @@ const isEmpty = val => val == null || !(Object.keys(val) || val).length;
const isAnagram = (str1, str2) => {
const normalize = str =>
str
const isNegativeZero = val => val === 0 && 1 / val === -Infinity;
.toLowerCase()
.replace(/[^a-z0-9]/gi, '')
.split('')
.sort()
@ -606,18 +574,18 @@ const isPrime = num => {
const isBeforeDate = (dateA, dateB) => dateA < dateB;
const isBoolean = val => typeof val === 'boolean';
const isBrowser = () => ![typeof window, typeof document].includes('undefined');
const isPrimitive = val => Object(val) !== val;
const isBrowserTabFocused = () => !document.hidden;
const isDivisible = (dividend, divisor) => dividend % divisor === 0;
const isDuplexStream = val =>
val !== null &&
const isReadableStream = val =>
typeof val === 'object' &&
typeof val.pipe === 'function' &&
typeof val._read === 'function' &&
typeof val._readableState === 'object' &&
typeof val._write === 'function' &&
typeof val._writableState === 'object';
const isSameDate = (dateA, dateB) => dateA.toISOString() === dateB.toISOString();
const isEmpty = val => val == null || !(Object.keys(val) || val).length;
const isEven = num => num % 2 === 0;
const isFunction = val => typeof val === 'function';
const isLowerCase = str => str === str.toLowerCase();
@ -626,13 +594,13 @@ const isSorted = arr => {
const isNil = val => val === undefined || val === null;
const isNull = val => val === null;
const isNumber = val => typeof val === 'number';
const isStream = val => val !== null && typeof val === 'object' && typeof val.pipe === 'function';
const isString = val => typeof val === 'string';
const isObject = obj => obj === Object(obj);
const isObjectLike = val => val !== null && typeof val === 'object';
const isPlainObject = val => !!val && typeof val === 'object' && val.constructor === Object;
const isPrime = num => {
const boundary = Math.floor(Math.sqrt(num));
for (var i = 2; i <= boundary; i++) if (num % i === 0) return false;
const isValidJSON = str => {
return num >= 2;
};
const isPrimitive = val => Object(val) !== val;
@ -640,7 +608,7 @@ const isValidJSON = str => {
obj !== null &&
(typeof obj === 'object' || typeof obj === 'function') &&
typeof obj.then === 'function';
const isWritableStream = val =>
const isReadableStream = val =>
val !== null &&
typeof val === 'object' &&
@ -656,19 +624,32 @@ const join = (arr, separator = ',', end = separator) =>
if (i === arr.length - 1) return !direction ? 0 : direction;
else if ((val - arr[i + 1]) * direction > 0) return 0;
}
};
const isStream = val => val !== null && typeof val === 'object' && typeof val.pipe === 'function';
const isString = val => typeof val === 'string';
const isSymbol = val => typeof val === 'symbol';
const isTravisCI = () => 'TRAVIS' in process.env && 'CI' in process.env;
const isUndefined = val => val === undefined;
const isUpperCase = str => str === str.toUpperCase();
const isValidJSON = str => {
try {
JSON.parse(str);
return true;
const lcm = (...arr) => {
} catch (e) {
return false;
}
};
const longestItem = (...vals) => vals.reduce((a, x) => (x.length > a.length ? x : a));
const isWritableStream = val =>
val !== null &&
typeof val === 'object' &&
typeof val.pipe === 'function' &&
typeof val._write === 'function' &&
typeof val._writableState === 'object';
const luhnCheck = num => {
const join = (arr, separator = ',', end = separator) =>
arr.reduce(
(acc, val, i) =>
i === arr.length - 2
@ -708,7 +689,7 @@ const matchesWith = (obj, source, fn) =>
}, {});
const luhnCheck = num => {
const maxDate = (...dates) => new Date(Math.max.apply(null, ...dates));
let arr = (num + '')
.split('')
.reverse()
.map(x => parseInt(x));
@ -732,9 +713,9 @@ const merge = (...objs) =>
.map((c, i) => fn(c, i, str))
.join('');
const mapValues = (obj, fn) =>
const midpoint = ([x1, y1], [x2, y2]) => [(x1 + x2) / 2, (y1 + y2) / 2];
Object.keys(obj).reduce((acc, k) => {
acc[k] = fn(obj[k], k, obj);
const minDate = (...dates) => new Date(Math.min.apply(null, ...dates));
return acc;
}, {});
const mask = (cc, num = 4, mask = '*') => `${cc}`.slice(-num).padStart(`${cc}`.length, mask);
const matches = (obj, source) =>
@ -788,6 +769,14 @@ const on = (el, evt, fn, opts = {}) => {
};
const negate = func => (...args) => !func(...args);
const nest = (items, id = null, link = 'parent_id') =>
items
.filter(item => item[link] === id)
.map(item => ({ ...item, children: nest(items, item.id) }));
const nodeListToArray = nodeList => [...nodeList];
const none = (arr, fn = Boolean) => !arr.some(fn);
const nthArg = n => (...args) => args.slice(n)[0];
const nthElement = (arr, n = 0) => (n === -1 ? arr.slice(n) : arr.slice(n, n + 1))[0];
const objectFromPairs = arr => arr.reduce((a, [key, val]) => ((a[key] = val), a), {});
const objectToPairs = obj => Object.keys(obj).map(k => [k, obj[k]]);
const observeMutations = (element, callback, options) => {
const observer = new MutationObserver(mutations => mutations.forEach(m => callback(m)));
@ -802,14 +791,6 @@ const onUserInputChange = callback => {
characterDataOldValue: true,
subtree: true
},
const once = fn => {
let called = false;
return function(...args) {
if (called) return;
called = true;
return fn.apply(this, args);
};
};
options
)
);
@ -824,7 +805,7 @@ const over = (...fns) => (...args) => fns.map(fn => fn.apply(null, args));
const omitBy = (obj, fn) =>
Object.keys(obj)
.filter(k => !fn(obj[k], k))
const palindrome = str => {
.reduce((acc, key) => ((acc[key] = obj[key]), acc), {});
const on = (el, evt, fn, opts = {}) => {
const delegatorFn = e => e.target.matches(opts.target) && fn.call(e.target, e);
el.addEventListener(evt, opts.target ? delegatorFn : fn, opts.options || false);
@ -846,7 +827,7 @@ const partition = (arr, fn) =>
if (now - lastTime < 20)
(type = 'mouse'), callback(type), document.removeEventListener('mousemove', mousemoveHandler);
lastTime = now;
const percentile = (arr, val) =>
};
document.addEventListener('touchstart', () => {
if (type === 'touch') return;
(type = 'touch'), callback(type), document.addEventListener('mousemove', mousemoveHandler);
@ -864,7 +845,7 @@ const pickBy = (obj, fn) =>
);
const over = (...fns) => (...args) => fns.map(fn => fn.apply(null, args));
const overArgs = (fn, transforms) => (...args) => fn(...args.map((val, i) => transforms[i](val)));
const pipeAsyncFunctions = (...fns) => arg => fns.reduce((p, f) => p.then(f), Promise.resolve(arg));
const pad = (str, length, char = ' ') =>
str.padStart((str.length + length) / 2, char).padEnd(length, char);
const palindrome = str => {
@ -931,7 +912,7 @@ const pullBy = (arr, ...args) => {
if (Math.abs(num) < 1) return num + (addSpace ? ' ' : '') + UNITS[0];
const exponent = Math.min(Math.floor(Math.log10(num < 0 ? -num : num) / 3), UNITS.length - 1);
const n = Number(((num < 0 ? -num : num) / 1000 ** exponent).toPrecision(precision));
const radsToDegrees = rad => (rad * 180.0) / Math.PI;
return (num < 0 ? '-' : '') + n + (addSpace ? ' ' : '') + UNITS[exponent];
};
const primes = num => {
let arr = Array.from({ length: num - 1 }).map((x, i) => i + 2),
@ -969,10 +950,6 @@ const recordAnimationFrames = (callback, autoStart = true) => {
};
const pullBy = (arr, ...args) => {
const length = args.length;
const reduceSuccessive = (arr, fn, acc) =>
arr.reduce((res, val, i, arr) => (res.push(fn(res.slice(-1)[0], val, i, arr)), res), [acc]);
const reduceWhich = (arr, comparator = (a, b) => a - b) =>
arr.reduce((a, b) => (comparator(a, b) >= 0 ? b : a));
let fn = length > 1 ? args[length - 1] : undefined;
fn = typeof fn == 'function' ? (args.pop(), fn) : undefined;
let argState = (Array.isArray(args[0]) ? args[0] : args).map(val => fn(val));
@ -980,6 +957,10 @@ const reducedFilter = (data, keys, fn) =>
arr.length = 0;
pulled.forEach(v => arr.push(v));
};
const radsToDegrees = rad => (rad * 180.0) / Math.PI;
const randomHexColorCode = () => {
let n = (Math.random() * 0xfffff * 1000000).toString(16);
return '#' + n.slice(0, 6);
};
const randomIntArrayInRange = (min, max, n = 1) =>
@ -999,8 +980,9 @@ const renameKeys = (keysMap, obj) =>
const stop = () => {
running = false;
cancelAnimationFrame(raf);
};
const start = () => {
const runAsync = fn => {
running = true;
run();
};
const run = () => {
@ -1016,7 +998,7 @@ const runAsync = fn => {
asLink ? (window.location.href = url) : window.location.replace(url);
const reducedFilter = (data, keys, fn) =>
data.filter(fn).map(el =>
const sample = arr => arr[Math.floor(Math.random() * arr.length)];
keys.reduce((acc, key) => {
acc[key] = el[key];
return acc;
}, {})
@ -1043,7 +1025,7 @@ const sdbm = str => {
...{ [keysMap[key] || key]: obj[key] }
}),
{}
const shank = (arr, index = 0, delCount = 0, ...elements) =>
);
const reverseString = str => [...str].reverse().join('');
const RGBToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0');
const round = (n, decimals = 0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`);
@ -1122,10 +1104,10 @@ const stringPermutations = str => {
behavior: 'smooth'
});
const sortCharactersInString = str => [...str].sort((a, b) => a.localeCompare(b)).join('');
const sum = (...arr) => [...arr].reduce((acc, val) => acc + val, 0);
const sortedIndex = (arr, n) => {
const isDescending = arr[0] > arr[arr.length - 1];
const index = arr.findIndex(el => (isDescending ? n >= el : n <= el));
const sumPower = (end, power = 2, start = 1) =>
return index === -1 ? arr.length : index;
};
const sortedIndexBy = (arr, n, fn) => {
const isDescending = fn(arr[0]) > fn(arr[arr.length - 1]);
@ -1147,13 +1129,13 @@ const symmetricDifferenceWith = (arr, val, comp) => [
.findIndex(el => (isDescending ? val <= el : val >= el));
return index === -1 ? 0 : arr.length - index;
};
const takeRightWhile = (arr, func) =>
const splitLines = str => str.split(/\r?\n/);
const spreadOver = fn => argsArr => fn(...argsArr);
const stableSort = (arr, compare) =>
arr
.map((item, index) => ({ item, index }))
.sort((a, b) => compare(a.item, b.item) || a.index - b.index)
const throttle = (fn, wait) => {
.map(({ item }) => item);
const standardDeviation = (arr, usePopulation = false) => {
const mean = arr.reduce((acc, val) => acc + val, 0) / arr.length;
return Math.sqrt(
@ -1173,16 +1155,16 @@ const throttle = (fn, wait) => {
};
const stripHTMLTags = str => str.replace(/<[^>]*>/g, '');
const sum = (...arr) => [...arr].reduce((acc, val) => acc + val, 0);
const sumBy = (arr, fn) =>
arr.map(typeof fn === 'function' ? fn : val => val[fn]).reduce((acc, val) => acc + val, 0);
const sumPower = (end, power = 2, start = 1) =>
Array(end + 1 - start)
.fill(0)
.map((x, i) => (i + start) ** power)
.reduce((a, b) => a + b, 0);
const symmetricDifference = (a, b) => {
const times = (n, fn, context = undefined) => {
let i = 0;
while (fn.call(context, i) !== false && ++i < n) {}
};
const sA = new Set(a),
sB = new Set(b);
return [...a.filter(x => !sB.has(x)), ...b.filter(x => !sA.has(x))];
@ -1195,7 +1177,8 @@ const toCamelCase = str => {
const symmetricDifferenceWith = (arr, val, comp) => [
...arr.filter(a => val.findIndex(b => comp(a, b)) === -1),
...val.filter(a => arr.findIndex(b => comp(a, b)) === -1)
const toHash = (object, key) =>
];
const tail = arr => (arr.length > 1 ? arr.slice(1) : arr);
const take = (arr, n = 1) => arr.slice(0, n);
const takeRight = (arr, n = 1) => arr.slice(arr.length - n, arr.length);
@ -1207,6 +1190,11 @@ const toKebabCase = str =>
};
const throttle = (fn, wait) => {
let inThrottle, lastFn, lastTime;
return function() {
const context = this,
args = arguments;
if (!inThrottle) {
fn.apply(context, args);
lastTime = Date.now();
inThrottle = true;
@ -1225,19 +1213,13 @@ const toSnakeCase = str =>
let i = 0;
while (fn.call(context, i) !== false && ++i < n) {}
};
const toTitleCase = str =>
const timeTaken = callback => {
console.time('timeTaken');
const r = callback();
console.timeEnd('timeTaken');
return r;
const toggleClass = (el, className) => el.classList.toggle(className);
const tomorrow = () => {
let t = new Date();
t.setDate(t.getDate() + 1);
return t.toISOString().split('T')[0];
};
};
const triggerEvent = (el, eventType, detail) =>
const toCamelCase = str => {
let s =
str &&
str
@ -1283,7 +1265,7 @@ const unfold = (fn, seed) => {
Math.round(Math.max(Math.min(num, Number.MAX_SAFE_INTEGER), Number.MIN_SAFE_INTEGER));
const toSnakeCase = str =>
str &&
const unionBy = (a, b, fn) => {
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('_');
@ -1304,7 +1286,7 @@ const uniqueSymmetricDifference = (a, b) => [
const uncurry = (fn, n = 1) => (...args) => {
const next = acc => args => args.reduce((x, y) => x(y), acc);
if (n > args.length) throw new RangeError('Arguments too few!');
const unzip = arr =>
return next(fn)(args.slice(0, n));
};
const unescapeHTML = str =>
str.replace(
@ -1320,6 +1302,24 @@ const unzipWith = (arr, fn) =>
);
const unflattenObject = obj =>
Object.keys(obj).reduce((acc, k) => {
if (k.indexOf('.') !== -1) {
const keys = k.split('.');
Object.assign(
acc,
JSON.parse(
'{' +
keys.map((v, i) => (i !== keys.length - 1 ? `"${v}":{` : `"${v}":`)).join('') +
obj[k] +
'}'.repeat(keys.length)
)
);
} else acc[k] = obj[k];
return acc;
}, {});
const unfold = (fn, seed) => {
let result = [],
val = [null, seed];
while ((val = fn(val[1]))) result.push(val[0]);
return result;
};
const union = (a, b) => Array.from(new Set([...a, ...b]));
@ -1342,19 +1342,15 @@ const zipWith = (...array) => {
return acc;
}, []);
const uniqueSymmetricDifference = (a, b) => [
const JSONToDate = arr => {
const dt = new Date(parseInt(arr.toString().substr(6)));
return `${dt.getDate()}/${dt.getMonth() + 1}/${dt.getFullYear()}`;
};
const binarySearch = (arr, val, start = 0, end = arr.length - 1) => {
...new Set([...a.filter(v => !b.includes(v)), ...b.filter(v => !a.includes(v))])
];
const untildify = str => str.replace(/^~($|\/|\\)/, `${require('os').homedir()}$1`);
const unzip = arr =>
arr.reduce(
(acc, val) => (val.forEach((v, i) => acc[i].push(v)), acc),
const celsiusToFahrenheit = degrees => 1.8 * degrees + 32;
const cleanObj = (obj, keysToKeep = [], childIndicator) => {
Array.from({
length: Math.max(...arr.map(x => x.length))
}).map(x => [])
);
const unzipWith = (arr, fn) =>
@ -1364,9 +1360,9 @@ const cleanObj = (obj, keysToKeep = [], childIndicator) => {
Array.from({
length: Math.max(...arr.map(x => x.length))
}).map(x => [])
const collatz = n => (n % 2 === 0 ? n / 2 : 3 * n + 1);
const countVowels = str => (str.match(/[aeiou]/gi) || []).length;
const factors = (num, primes = false) => {
)
.map(val => fn(...val));
const URLJoin = (...args) =>
args
.join('/')
.replace(/[\/]+/g, '/')
@ -1385,21 +1381,21 @@ const factors = (num, primes = false) => {
(c ^ (crypto.randomBytes(1)[0] & (15 >> (c / 4)))).toString(16)
);
const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == n;
const fahrenheitToCelsius = degrees => (degrees - 32) * 5/9;
const fibonacciCountUntilNum = num =>
const when = (pred, whenTrue) => x => (pred(x) ? whenTrue(x) : x);
const without = (arr, ...args) => arr.filter(v => !args.includes(v));
const words = (str, pattern = /[^a-zA-Z-]+/) => str.split(pattern).filter(Boolean);
const fibonacciUntilNum = num => {
const xProd = (a, b) => a.reduce((acc, x) => acc.concat(b.map(y => [x, y])), []);
const yesNo = (val, def = false) =>
/^(y|yes)$/i.test(val) ? true : /^(n|no)$/i.test(val) ? false : def;
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]);
const heronArea = (side_a, side_b, side_c) => {
});
};
const zipObject = (props, values) =>
props.reduce((obj, prop, index) => ((obj[prop] = values[index]), obj), {});
const howManyTimes = (num, divisor) => {
const zipWith = (...array) => {
const fn = typeof array[array.length - 1] === 'function' ? array.pop() : undefined;
return Array.from(
{ length: Math.max(...array.map(a => a.length)) },
@ -1409,14 +1405,14 @@ const howManyTimes = (num, divisor) => {
const binarySearch = (arr, val, start = 0, end = arr.length - 1) => {
if (start > end) return -1;
const httpDelete = (url, callback, err = console.error) => {
const mid = Math.floor((start + end) / 2);
if (arr[mid] > val) return binarySearch(arr, val, start, mid - 1);
if (arr[mid] < val) return binarySearch(arr, val, mid + 1, end);
return mid;
};
const celsiusToFahrenheit = degrees => 1.8 * degrees + 32;
const httpPut = (url, data, callback, err = console.error) => {
const cleanObj = (obj, keysToKeep = [], childIndicator) => {
Object.keys(obj).forEach(key => {
if (key === childIndicator) {
@ -1424,11 +1420,11 @@ const httpPut = (url, data, callback, err = console.error) => {
} else if (!keysToKeep.includes(key)) {
delete obj[key];
}
const isArmstrongNumber = digits =>
});
return obj;
};
const isSimilar = (pattern, str) =>
const collatz = n => (n % 2 === 0 ? n / 2 : 3 * n + 1);
const countVowels = str => (str.match(/[aeiou]/gi) || []).length;
@ -1436,8 +1432,12 @@ const isSimilar = (pattern, str) =>
const isPrime = num => {
const boundary = Math.floor(Math.sqrt(num));
for (var i = 2; i <= boundary; i++) if (num % i === 0) return false;
const kmphToMph = (kmph) => 0.621371192 * kmph;
const levenshteinDistance = (string1, string2) => {
return num >= 2;
};
const isNeg = num < 0;
num = isNeg ? -num : num;
let array = Array.from({ length: num - 1 })
.map((val, i) => (num % (i + 2) === 0 ? i + 2 : false))
.filter(val => val);
if (isNeg)
array = array.reduce((acc, val) => {
@ -1461,9 +1461,9 @@ const levenshteinDistance = (string1, string2) => {
);
};
const mphToKmph = (mph) => 1.6093440006146922 * mph;
const pipeLog = data => console.log(data) || data;
const quickSort = ([n, ...nums], desc) =>
const heronArea = (side_a, side_b, side_c) => {
const p = (side_a + side_b + side_c) / 2
return Math.sqrt(p * (p-side_a) * (p-side_b) * (p-side_c))
};
const howManyTimes = (num, divisor) => {
@ -1471,8 +1471,8 @@ const quickSort = ([n, ...nums], desc) =>
if (divisor === 0) return 0;
let i = 0;
while (Number.isInteger(num / divisor)) {
const removeVowels = (str, repl = '') => str.replace(/[aeiou]/gi, repl);
const solveRPN = rpn => {
i++;
num = num / divisor;
}
return i;
};
@ -1500,12 +1500,12 @@ const solveRPN = rpn => {
);
const isSimilar = (pattern, str) =>
const speechSynthesis = message => {
[...str].reduce(
(matchIndex, char) =>
char.toLowerCase() === (pattern[matchIndex] || '').toLowerCase()
? matchIndex + 1
: matchIndex,
const squareSum = (...args) => args.reduce((squareSum, number) => squareSum + Math.pow(number, 2), 0);
0
) === pattern.length;
module.exports = {CSVToArray,CSVToJSON,JSONToFile,JSONtoCSV,RGBToHex,URLJoin,UUIDGeneratorBrowser,UUIDGeneratorNode,all,allEqual,any,approximatelyEqual,arrayToCSV,arrayToHtmlList,ary,atob,attempt,average,averageBy,bifurcate,bifurcateBy,bind,bindAll,bindKey,binomialCoefficient,bottomVisible,btoa,byteSize,call,capitalize,capitalizeEveryWord,castArray,chainAsync,chunk,clampNumber,cloneRegExp,coalesce,coalesceFactory,collectInto,colorize,compact,compactWhitespace,compose,composeRight,converge,copyToClipboard,countBy,countOccurrences,counter,createDirIfNotExists,createElement,createEventHub,currentURL,curry,dayOfYear,debounce,decapitalize,deepClone,deepFlatten,deepFreeze,deepMapKeys,defaults,defer,degreesToRads,delay,detectDeviceType,difference,differenceBy,differenceWith,dig,digitize,distance,drop,dropRight,dropRightWhile,dropWhile,elementContains,elementIsVisibleInViewport,elo,equals,escapeHTML,escapeRegExp,everyNth,extendHex,factorial,fibonacci,filterFalsy,filterNonUnique,filterNonUniqueBy,findKey,findLast,findLastIndex,findLastKey,flatten,flattenObject,flip,forEachRight,forOwn,forOwnRight,formatDuration,fromCamelCase,functionName,functions,gcd,geometricProgression,get,getColonTimeFromDate,getDaysDiffBetweenDates,getImages,getMeridiemSuffixOfInteger,getScrollPosition,getStyle,getType,getURLParameters,groupBy,hammingDistance,hasClass,hasFlags,hashBrowser,hashNode,head,hexToRGB,hide,httpGet,httpPost,httpsRedirect,hz,inRange,indentString,indexOfAll,initial,initialize2DArray,initializeArrayWithRange,initializeArrayWithRangeRight,initializeArrayWithValues,initializeNDArray,insertAfter,insertBefore,intersection,intersectionBy,intersectionWith,invertKeyValues,is,isAbsoluteURL,isAfterDate,isAnagram,isArrayLike,isBeforeDate,isBoolean,isBrowser,isBrowserTabFocused,isDivisible,isDuplexStream,isEmpty,isEven,isFunction,isLowerCase,isNegativeZero,isNil,isNull,isNumber,isObject,isObjectLike,isPlainObject,isPrime,isPrimitive,isPromiseLike,isReadableStream,isSameDate,isSorted,isStream,isString,isSymbol,isTravisCI,isUndefined,isUpperCase,isValidJSON,isWritableStream,join,last,lcm,longestItem,lowercaseKeys,luhnCheck,mapKeys,mapObject,mapString,mapValues,mask,matches,matchesWith,maxBy,maxDate,maxN,median,memoize,merge,midpoint,minBy,minDate,minN,mostPerformant,negate,nest,nodeListToArray,none,nthArg,nthElement,objectFromPairs,objectToPairs,observeMutations,off,offset,omit,omitBy,on,onUserInputChange,once,orderBy,over,overArgs,pad,palindrome,parseCookie,partial,partialRight,partition,percentile,permutations,pick,pickBy,pipeAsyncFunctions,pipeFunctions,pluralize,powerset,prefix,prettyBytes,primes,promisify,pull,pullAtIndex,pullAtValue,pullBy,radsToDegrees,randomHexColorCode,randomIntArrayInRange,randomIntegerInRange,randomNumberInRange,readFileLines,rearg,recordAnimationFrames,redirect,reduceSuccessive,reduceWhich,reducedFilter,reject,remove,removeNonASCII,renameKeys,reverseString,round,runAsync,runPromisesInSeries,sample,sampleSize,scrollToTop,sdbm,serializeCookie,setStyle,shallowClone,shank,show,shuffle,similarity,size,sleep,smoothScroll,sortCharactersInString,sortedIndex,sortedIndexBy,sortedLastIndex,sortedLastIndexBy,splitLines,spreadOver,stableSort,standardDeviation,stringPermutations,stripHTMLTags,sum,sumBy,sumPower,symmetricDifference,symmetricDifferenceBy,symmetricDifferenceWith,tail,take,takeRight,takeRightWhile,takeWhile,throttle,timeTaken,times,toCamelCase,toCurrency,toDecimalMark,toHash,toKebabCase,toOrdinalSuffix,toSafeInteger,toSnakeCase,toTitleCase,toggleClass,tomorrow,transform,triggerEvent,truncateString,truthCheckCollection,unary,uncurry,unescapeHTML,unflattenObject,unfold,union,unionBy,unionWith,uniqueElements,uniqueElementsBy,uniqueElementsByRight,uniqueSymmetricDifference,untildify,unzip,unzipWith,validateNumber,when,without,words,xProd,yesNo,zip,zipObject,zipWith,JSONToDate,binarySearch,celsiusToFahrenheit,cleanObj,collatz,countVowels,factors,fahrenheitToCelsius,fibonacciCountUntilNum,fibonacciUntilNum,heronArea,howManyTimes,httpDelete,httpPut,isArmstrongNumber,isSimilar,kmphToMph,levenshteinDistance,mphToKmph,pipeLog,quickSort,removeVowels,solveRPN,speechSynthesis,squareSum}
const JSONToDate = arr => {

View File

@ -4,24 +4,33 @@ const {deepClone} = require('./_30s.js');
test('deepClone is a Function', () => {
expect(deepClone).toBeInstanceOf(Function);
});
const a = { foo: 'bar', obj: { a: 1, b: 2 } };
const b = deepClone(a);
const c = [{ foo: 'bar' }];
const d = deepClone(c);
const e = { edge: [] };
const f = deepClone(e);
const data = {
a: [],
b: [1, 2, 3],
c: [{ foo: 'bar' }],
d: {},
e: { a: 'a', b: 'b', c: 'c', d: ['a', 'b', 'c'] },
f: 1,
g: true
};
const dupe = deepClone(data);
test('Shallow cloning works', () => {
expect(a).not.toBe(b);
});
test('Deep cloning works', () => {
expect(a.obj).not.toBe(b.obj);
});
test('Array shallow cloning works', () => {
expect(c).not.toBe(d);
});
test('Array deep cloning works', () => {
expect(c[0]).not.toBe(d[0]);
expect(data).not.toBe(dupe);
});
test('Array shallow cloning edge case works', () => {
expect(f.edge).toEqual([]);
expect(dupe.a).toEqual([]);
});
test('Array shallow cloning works', () => {
expect(data.b).not.toBe(dupe.b);
});
test('Array deep cloning works', () => {
expect(data.c[0]).not.toBe(dupe.c[0]);
});
test('Deep cloning works', () => {
expect(data.d).not.toBe(dupe.d);
expect(data.e).not.toBe(dupe.e);
});
test('Cloning primitives works', () => {
expect(data.f).toBe(dupe.f);
expect(data.g).toBe(dupe.g);
});