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.
82 lines
1.8 KiB
82 lines
1.8 KiB
5 years ago
|
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
|