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.
81 lines
1.8 KiB
81 lines
1.8 KiB
var ltgt = require('ltgt') |
|
|
|
//compare two array items |
|
function isArrayLike (a) { |
|
return Array.isArray(a) || Buffer.isBuffer(a) |
|
} |
|
|
|
function isPrimitive (a) { |
|
return 'string' === typeof a || 'number' === typeof a |
|
} |
|
|
|
function has(o, k) { |
|
return Object.hasOwnProperty.call(o, k) |
|
} |
|
|
|
function compare (a, b) { |
|
if(isArrayLike(a) && isArrayLike(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 a.length - b.length |
|
} |
|
if(isPrimitive(a) && isPrimitive(b)) |
|
return a < b ? -1 : a > b ? 1 : 0 |
|
|
|
throw new Error('items not comparable:' |
|
+ JSON.stringify(a) + ' ' + JSON.stringify(b)) |
|
} |
|
|
|
//this assumes that the prefix is of the form: |
|
// [Array, string] |
|
|
|
function prefix (a, b) { |
|
if(a.length > b.length) return false |
|
var l = a.length - 1 |
|
var lastA = a[l] |
|
var lastB = b[l] |
|
|
|
if(typeof lastA !== typeof lastB) |
|
return false |
|
|
|
if('string' == typeof lastA |
|
&& 0 != lastB.indexOf(lastA)) |
|
return false |
|
|
|
//handle cas where there is no key prefix |
|
//(a hook on an entire sublevel) |
|
if(a.length == 1 && isArrayLike(lastA)) l ++ |
|
|
|
while(l--) { |
|
if(compare(a[l], b[l])) return false |
|
} |
|
return true |
|
} |
|
|
|
exports = module.exports = function (range, key, _compare) { |
|
_compare = _compare || compare |
|
//handle prefix specially, |
|
//check that everything up to the last item is equal |
|
//then check the last item starts with |
|
if(isArrayLike(range)) return prefix(range, key) |
|
|
|
return ltgt.contains(range, key, _compare) |
|
} |
|
|
|
function addPrefix(prefix, range) { |
|
var o = ltgt.toLtgt(range, null, function (key) { |
|
return [prefix, key] |
|
}) |
|
|
|
//if there where no ranges, then then just use a prefix. |
|
if(!has(o, 'gte') && !has(o, 'lte')) return [prefix] |
|
|
|
return o |
|
} |
|
|
|
exports.compare = compare |
|
exports.prefix = prefix |
|
exports.addPrefix = addPrefix
|
|
|