export function nodes_match(a, b, ignore_keys = []) { if (!!a !== !!b) return false; if (Array.isArray(a) !== Array.isArray(b)) return false; if (a && typeof a === 'object') { if (Array.isArray(a)) { if (a.length !== b.length) return false; return a.every((child, i) => nodes_match(child, b[i])); } const a_keys = Object.keys(a) .sort() .filter((key) => !ignore_keys.includes(key)); const b_keys = Object.keys(b) .sort() .filter((key) => !ignore_keys.includes(key)); if (a_keys.length !== b_keys.length) return false; let i = a_keys.length; while (i--) { const key = a_keys[i]; if (b_keys[i] !== key) return false; if (key === 'start' || key === 'end') continue; if (!nodes_match(a[key], b[key])) { return false; } } return true; } return a === b; }