UNPKG

zustand

Version:

🐻 Bear necessities for state management in React

55 lines (52 loc) 1.56 kB
'use strict'; const isIterable = (obj) => Symbol.iterator in obj; const hasIterableEntries = (value) => ( // HACK: avoid checking entries type "entries" in value ); const compareEntries = (valueA, valueB) => { const mapA = valueA instanceof Map ? valueA : new Map(valueA.entries()); const mapB = valueB instanceof Map ? valueB : new Map(valueB.entries()); if (mapA.size !== mapB.size) { return false; } for (const [key, value] of mapA) { if (!Object.is(value, mapB.get(key))) { return false; } } return true; }; const compareIterables = (valueA, valueB) => { const iteratorA = valueA[Symbol.iterator](); const iteratorB = valueB[Symbol.iterator](); let nextA = iteratorA.next(); let nextB = iteratorB.next(); while (!nextA.done && !nextB.done) { if (!Object.is(nextA.value, nextB.value)) { return false; } nextA = iteratorA.next(); nextB = iteratorB.next(); } return !!nextA.done && !!nextB.done; }; function shallow(valueA, valueB) { if (Object.is(valueA, valueB)) { return true; } if (typeof valueA !== "object" || valueA === null || typeof valueB !== "object" || valueB === null) { return false; } if (!isIterable(valueA) || !isIterable(valueB)) { return compareEntries( { entries: () => Object.entries(valueA) }, { entries: () => Object.entries(valueB) } ); } if (hasIterableEntries(valueA) && hasIterableEntries(valueB)) { return compareEntries(valueA, valueB); } return compareIterables(valueA, valueB); } exports.shallow = shallow;