packages/sqrl-common/src/compare.ts (60 lines of code) (raw):

/** * Copyright 2019 Twitter, Inc. * Licensed under the Apache License, Version 2.0 * http://www.apache.org/licenses/LICENSE-2.0 */ import { mapObject } from "./mapObject"; export function cmpE(left, right) { let rv; if (Array.isArray(left) && Array.isArray(right)) { rv = left.length === right.length && left.every((el, idx) => cmpE(el, right[idx])); } else if ( left && right && typeof left === "object" && typeof right === "object" ) { // Make sure the keys match, and the value at every key matches (deep equal) const keys = Object.keys(left).sort(); rv = cmpE(keys, Object.keys(right).sort()) && keys.every((key) => { return cmpE(left[key], right[key]); }); } else { rv = left === right; } return rv; } export function cmpNE(left, right) { return !cmpE(left, right); } export function cmpG(left, right) { return left > right; } export function cmpGE(left, right) { return left >= right; } export function cmpL(left, right) { return left < right; } export function cmpLE(left, right) { return left <= right; } const functions = { cmpE, cmpNE, cmpG, cmpGE, cmpL, cmpLE, }; const symbolToNameMap = { "!=": "cmpNE", "=": "cmpE", ">": "cmpG", ">=": "cmpGE", "<": "cmpL", "<=": "cmpLE", }; const symbolToFuncMap = mapObject(symbolToNameMap, (name) => functions[name]); export const comparisonSymbols = new Set(Object.keys(symbolToNameMap)); export function sqrlCompare(left: any, operator: string, right: any): boolean { return symbolToFuncMap[operator](left, right); }