UNPKG

@thi.ng/compare

Version:

Comparators with support for types implementing the @thi.ng/api/ICompare interface

30 lines (29 loc) 798 B
const BOUNDARY = /(\D\d|\d\D)/; const compareLex = (a, b) => { const ma = BOUNDARY.exec(a); const mb = BOUNDARY.exec(b); return ma && mb ? __compare2( __maybeNum(a.substring(0, ma.index + 1)), __maybeNum(a.substring(ma.index + 1)), __maybeNum(b.substring(0, mb.index + 1)), __maybeNum(b.substring(mb.index + 1)) ) : a < b ? -1 : a > b ? 1 : 0; }; const __compare2 = (a1, a2, b1, b2) => { const na = typeof a1 === "number"; const nb = typeof b1 === "number"; if (na !== nb) { if (na) a1 += " "; else a2 += " "; if (nb) b1 += " "; else b2 += " "; } return a1 === b1 ? a2 === b2 ? 0 : a2 < b2 ? -2 : 2 : a1 < b1 ? -1 : 1; }; const __maybeNum = (x) => { const id = x.charCodeAt(0); return id >= 48 && id <= 57 ? +x : x; }; export { compareLex };