are-inputs-equal.ts 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. // Number.isNaN as it is not supported in IE11 so conditionally using ponyfill
  2. // Using Number.isNaN where possible as it is ~10% faster
  3. const safeIsNaN =
  4. Number.isNaN ||
  5. function ponyfill(value: unknown): boolean {
  6. // // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN#polyfill
  7. // NaN is the only value in JavaScript which is not equal to itself.
  8. return typeof value === 'number' && value !== value;
  9. };
  10. function isEqual(first: unknown, second: unknown): boolean {
  11. if (first === second) {
  12. return true;
  13. }
  14. // Special case for NaN (NaN !== NaN)
  15. if (safeIsNaN(first) && safeIsNaN(second)) {
  16. return true;
  17. }
  18. return false;
  19. }
  20. export default function areInputsEqual(
  21. newInputs: readonly unknown[],
  22. lastInputs: readonly unknown[],
  23. ): boolean {
  24. // no checks needed if the inputs length has changed
  25. if (newInputs.length !== lastInputs.length) {
  26. return false;
  27. }
  28. // Using for loop for speed. It generally performs better than array.every
  29. // https://github.com/alexreardon/memoize-one/pull/59
  30. for (let i = 0; i < newInputs.length; i++) {
  31. if (!isEqual(newInputs[i], lastInputs[i])) {
  32. return false;
  33. }
  34. }
  35. return true;
  36. }