You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

57 lines
1.2 KiB

function inequality (a, b) {
return a === b ? 0 : a < b ? -1 : 1
}
function buffercmp (a, b) {
var l = Math.min(a.length, b.length)
for(var i = 0; i < l; i++)
if(a[i] !== b[i]) return inequality(a[i], b[i])
return a.length - b.length
}
function arraycmp (a, b) {
var l = Math.min(a.length, b.length)
for(var i = 0; i < l; i++) {
var c = compare(a[i], b[i])
if(c) return c
}
return inequality(a.length, b.length)
}
var comparators = [
inequality, // null
inequality, // boolean
inequality, // number
buffercmp, // buffer
inequality, // string
, // object
arraycmp, // array
inequality // undefined
]
function getType (v) {
if(v === null) return 0
var t = typeof v
if(t === 'boolean') return 1
if(t === 'number') return 2
if(Buffer.isBuffer(v)) return 3
if(Array.isArray(v)) return 6
if(t === 'string') return 4
if(t === 'undefined') return 7
throw new Error('comparing objects or functions is not supported')
// return 5
}
function compare (a, b) {
var t = getType(a)
return inequality(t, getType(b)) || comparators[t](a, b)
}
module.exports = compare
module.exports.equal = function (a, b) {
return compare(a, b) === 0
}