You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
42 lines
1.2 KiB
42 lines
1.2 KiB
3 years ago
|
// Number.isNaN as it is not supported in IE11 so conditionally using ponyfill
|
||
|
// Using Number.isNaN where possible as it is ~10% faster
|
||
|
|
||
|
const safeIsNaN =
|
||
|
Number.isNaN ||
|
||
|
function ponyfill(value: unknown): boolean {
|
||
|
// // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN#polyfill
|
||
|
// NaN is the only value in JavaScript which is not equal to itself.
|
||
|
return typeof value === 'number' && value !== value;
|
||
|
};
|
||
|
|
||
|
function isEqual(first: unknown, second: unknown): boolean {
|
||
|
if (first === second) {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
// Special case for NaN (NaN !== NaN)
|
||
|
if (safeIsNaN(first) && safeIsNaN(second)) {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
export default function areInputsEqual(
|
||
|
newInputs: readonly unknown[],
|
||
|
lastInputs: readonly unknown[],
|
||
|
): boolean {
|
||
|
// no checks needed if the inputs length has changed
|
||
|
if (newInputs.length !== lastInputs.length) {
|
||
|
return false;
|
||
|
}
|
||
|
// Using for loop for speed. It generally performs better than array.every
|
||
|
// https://github.com/alexreardon/memoize-one/pull/59
|
||
|
for (let i = 0; i < newInputs.length; i++) {
|
||
|
if (!isEqual(newInputs[i], lastInputs[i])) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|