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.

166 lines
3.9 KiB

4 years ago
exports.compare = function (a, b) {
if(Buffer.isBuffer(a)) {
var l = Math.min(a.length, b.length)
for(var i = 0; i < l; i++) {
var cmp = a[i] - b[i]
if(cmp) return cmp
}
return a.length - b.length
}
return a < b ? -1 : a > b ? 1 : 0
}
// to be compatible with the current abstract-leveldown tests
// nullish or empty strings.
// I could use !!val but I want to permit numbers and booleans,
// if possible.
function isDef (val) {
return val !== undefined && val !== ''
}
function has (range, name) {
return Object.hasOwnProperty.call(range, name)
}
function hasKey(range, name) {
return Object.hasOwnProperty.call(range, name) && name
}
var lowerBoundKey = exports.lowerBoundKey = function (range) {
return (
hasKey(range, 'gt')
|| hasKey(range, 'gte')
|| hasKey(range, 'min')
|| (range.reverse ? hasKey(range, 'end') : hasKey(range, 'start'))
|| undefined
)
}
var lowerBound = exports.lowerBound = function (range, def) {
var k = lowerBoundKey(range)
return k ? range[k] : def
}
var lowerBoundInclusive = exports.lowerBoundInclusive = function (range) {
return has(range, 'gt') ? false : true
}
var upperBoundInclusive = exports.upperBoundInclusive =
function (range) {
return (has(range, 'lt') /*&& !range.maxEx*/) ? false : true
}
var lowerBoundExclusive = exports.lowerBoundExclusive =
function (range) {
return !lowerBoundInclusive(range)
}
var upperBoundExclusive = exports.upperBoundExclusive =
function (range) {
return !upperBoundInclusive(range)
}
var upperBoundKey = exports.upperBoundKey = function (range) {
return (
hasKey(range, 'lt')
|| hasKey(range, 'lte')
|| hasKey(range, 'max')
|| (range.reverse ? hasKey(range, 'start') : hasKey(range, 'end'))
|| undefined
)
}
var upperBound = exports.upperBound = function (range, def) {
var k = upperBoundKey(range)
return k ? range[k] : def
}
exports.start = function (range, def) {
return range.reverse ? upperBound(range, def) : lowerBound(range, def)
}
exports.end = function (range, def) {
return range.reverse ? lowerBound(range, def) : upperBound(range, def)
}
exports.startInclusive = function (range) {
return (
range.reverse
? upperBoundInclusive(range)
: lowerBoundInclusive(range)
)
}
exports.endInclusive = function (range) {
return (
range.reverse
? lowerBoundInclusive(range)
: upperBoundInclusive(range)
)
}
function id (e) { return e }
exports.toLtgt = function (range, _range, map, lower, upper) {
_range = _range || {}
map = map || id
var defaults = arguments.length > 3
var lb = exports.lowerBoundKey(range)
var ub = exports.upperBoundKey(range)
if(lb) {
if(lb === 'gt') _range.gt = map(range.gt, false)
else _range.gte = map(range[lb], false)
}
else if(defaults)
_range.gte = map(lower, false)
if(ub) {
if(ub === 'lt') _range.lt = map(range.lt, true)
else _range.lte = map(range[ub], true)
}
else if(defaults)
_range.lte = map(upper, true)
if(range.reverse != null)
_range.reverse = !!range.reverse
//if range was used mutably
//(in level-sublevel it's part of an options object
//that has more properties on it.)
if(has(_range, 'max')) delete _range.max
if(has(_range, 'min')) delete _range.min
if(has(_range, 'start')) delete _range.start
if(has(_range, 'end')) delete _range.end
return _range
}
exports.contains = function (range, key, compare) {
compare = compare || exports.compare
var lb = lowerBound(range)
if(isDef(lb)) {
var cmp = compare(key, lb)
if(cmp < 0 || (cmp === 0 && lowerBoundExclusive(range)))
return false
}
var ub = upperBound(range)
if(isDef(ub)) {
var cmp = compare(key, ub)
if(cmp > 0 || (cmp === 0) && upperBoundExclusive(range))
return false
}
return true
}
exports.filter = function (range, compare) {
return function (key) {
return exports.contains(range, key, compare)
}
}