@woosh/meep-engine
Version:
Pure JavaScript game engine. Fully featured and production ready.
68 lines (56 loc) • 1.85 kB
JavaScript
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;
}