2022-03-11 19:39:42 +01:00

127 lines
2.2 KiB
JavaScript

// https://jsperf.com/finding-maximum-element-in-an-array
export function getMaxMin(array) {
const length = array.length;
let max = array[0];
let min = array[0];
for (let i = 0; i < length; i++) {
const value = array[i];
if (value > max) {
max = value;
} else if (value < min) {
min = value;
}
}
return { max, min };
}
// https://jsperf.com/multi-array-concat/24
export function mergeArrays(arrays) {
return [].concat.apply([], arrays);
}
export function sumArrays(arrays) {
const sums = [];
const n = arrays.length;
for (let i = 0, l = arrays[0].length; i < l; i++) {
sums[i] = 0;
for (let j = 0; j < n; j++) {
sums[i] += arrays[j][i];
}
}
return sums;
}
export function proxyMerge(obj1, obj2) {
return new Proxy({}, {
get: (obj, prop) => {
if (obj[prop] !== undefined) {
return obj[prop];
} else if (obj2[prop] !== undefined) {
return obj2[prop];
} else {
return obj1[prop];
}
},
});
}
export function throttle(
fn,
ms,
shouldRunFirst = true,
) {
let interval = null;
let isPending;
let args;
return (..._args) => {
isPending = true;
args = _args;
if (!interval) {
if (shouldRunFirst) {
isPending = false;
// @ts-ignore
fn(...args);
}
interval = window.setInterval(() => {
if (!isPending) {
window.clearInterval(interval);
interval = null;
return;
}
isPending = false;
// @ts-ignore
fn(...args);
}, ms);
}
};
}
export function throttleWithRaf(fn) {
let waiting = false;
let args;
return function (..._args) {
args = _args;
if (!waiting) {
waiting = true;
requestAnimationFrame(() => {
waiting = false;
fn(...args);
});
}
};
}
export function debounce(fn, ms, shouldRunFirst = true, shouldRunLast = true) {
let waitingTimeout = null;
return function () {
if (waitingTimeout) {
clearTimeout(waitingTimeout);
waitingTimeout = null;
} else if (shouldRunFirst) {
fn();
}
waitingTimeout = setTimeout(() => {
if (shouldRunLast) {
fn();
}
waitingTimeout = null;
}, ms);
};
}