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.

151 lines
3.7 KiB

# ltgt
implement correct ranges for level-*
[![build status](https://secure.travis-ci.org/dominictarr/ltgt.png)](http://travis-ci.org/dominictarr/ltgt)
[![testling badge](https://ci.testling.com/dominictarr/ltgt.png)](https://ci.testling.com/dominictarr/ltgt)
# example
``` js
var ltgt = require('ltgt')
ltgt.start(range) //the start of the range
ltgt.end(range) //the end of the range
//returns the lower/upper bound, whether it's inclusive or not.
ltgt.lowerBound(range)
ltgt.upperBound(range)
ltgt.lt(range)
ltgt.gt(range)
ltgt.lte(range)
ltgt.gte(range)
//return wether this is a reversed order
//(this is significant for start/end ranges
ltgt.reverse(range)
var filter = ltgt.filter(range)
filter(key) == true //if key contained in range.
ltgt.contains(range, key)
```
# ways to specify ranges
there have been a variety of ways to specify ranges in level-*.
this module supports them all.
# gt/gte, lt/lte
specify a range between a lower bound (gt, gte) and an upper bound (lt, lte)
if `gte` and `gt` is undefined, read from the start of the database,
if `lte` and `lt` is undefined, read until the end of the database,
# min, max
legacy level-sublevel style,
synonym for `gte`, `lte`.
# start, end, reverse
legacy levelup style.
The range is from `start` -> `end`, `start` does not specify the lowest
record, instead it specifies the first record to be read. However,
`reverse` must also be passed correctly. This is way to specify a range is
confusing if you need to read in reverse,
so it's strongly recommended to use `gt/gte,lt/lte`.
If `reverse` is `true`,
`start` *must* be `undefined` or less than `end`,
unless `end` is `undefined`.
if `reverse` is `false`
`end` *must* be `undefined` or greater than `start`,
unless `start` is `undefined`.
if start is undefined, read from the first record in the database
if end is undefined read until the last record in the database.
# api
## ltgt.contains(range, key, compare)
using the provided compare method, return `true` if `key`
is within `range`. compare defaults to `ltgt.compare`
## ltgt.filter(range, compare)
return a function that returns true if it's argument is within range.
can be passed to `Array.filter`
``` js
[1,2,3,4,5].filter(ltgt.filter({gt: 2, lte: 4})
// => [3, 4]
```
## ltgt.lowerBound(range)
return the lower bound of `range`.
Incase the lower bound is specified with `gt`,
check `ltgt.lowerBoundExclusive`
## ltgt.upperBound(range)
return the upperBound of `range`.
Incase the upper bound is specified with `gt`,
check `ltgt.upperBoundExclusive`
## ltgt.lowerBoundExclusive(range)
return true if upper bound is exclusive.
## ltgt.upperBoundExclusive(range)
return true if lower bound is exclusive.
## ltgt.start(range, default)
The start of the range. This takes into account direction (reverse)
If a `start` is not provided, `default` is used.
## ltgt.end(range, default)
The end of the range. This takes into account direction (reverse)
If a `end` is not provided, `default` is used.
## ltgt.startInclusive(range)
returns true if the range should start at the exact value returned
by `start(range)` otherwise, it should skip one input.
## ltgt.endInclusive(range)
returns true if the range should include the exact value returned
by `end(range)` otherwise, it should end on that value.
## ltgt.toLtgt(range, _range, map, lowerBound, upperBound)
convert a range to a new ltgt range. `_range`
is the object to return - if you want to mutate `range`
call `ltgt.toLtgt(range, range, map)`
`map` gets called on each key in the range, and wether it's an upper or lower bound -
so can be used as an encode function.
`map(value, isUpperBound)` if `isUpperBound` is false, this is the lower bound.
## License
MIT