UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

68 lines (56 loc) 1.85 kB
import { array_compare } from "../../collection/array/array_compare.js"; import { extractFunctionBody } from "../../function/extractFunctionBody.js"; import { compareBooleans } from "../../primitives/boolean/compareBooleans.js"; import { number_compare_ascending } from "../../primitives/numbers/number_compare_ascending.js"; import { compareStrings } from "../../primitives/strings/compareStrings.js"; /** * * @param {*} a * @param {*} b * @returns {number} */ export function compareValues(a, b) { if (a === b) { return 0; } const aType = typeof a; const bType = typeof b; if (aType !== bType) { return compareStrings(aType, bType); } if (aType === "string") { return compareStrings(a, b); } else if (aType === "number") { return number_compare_ascending(a, b); } else if (aType === "boolean") { return compareBooleans(a, b); } else if (aType === "function") { return compareStrings(extractFunctionBody(a), extractFunctionBody(b)); } else if (aType === "object") { if (a === null) { if (b !== null) { return -1; } else { return 0; } } else if (b === null) { return 1; } if (Array.isArray(a) && Array.isArray(b)) { return array_compare(a, b, compareValues); } const aKeys = Object.keys(a); const bKeys = Object.keys(b); const dKeys = array_compare(aKeys, bKeys, compareStrings); if (dKeys !== 0) { return dKeys; } for (let p in a) { const d = compareValues(a[p], b[p]); if (d !== 0) { return d; } } } return 0; }