123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- exports.add = add
- exports.remove = remove
- exports.has = has
- exports.eq = eq
- exports.lte = lte
- exports.lt = lt
- exports.gte = gte
- exports.gt = gt
- exports.nearest = nearest
- function defaultCmp (a, b) {
- if (a === b) return 0
- return a > b ? 1 : -1
- }
- function add (list, value, cmp) {
- if (!cmp) cmp = defaultCmp
- var top = list.push(value) - 1
- while (top) {
- if (cmp(list[top - 1], value) < 0) return
- list[top] = list[top - 1]
- list[top - 1] = value
- top--
- }
- }
- function lte (list, value, cmp) {
- if (!cmp) cmp = defaultCmp
- var i = indexOf(list, value, cmp)
- if (i === -1) return -1
- for (; i >= 0; i--) {
- var c = cmp(list[i], value)
- if (c <= 0) return i
- }
- return -1
- }
- function lt (list, value, cmp) {
- if (!cmp) cmp = defaultCmp
- var i = indexOf(list, value, cmp)
- if (i === -1) return -1
- for (; i >= 0; i--) {
- var c = cmp(list[i], value)
- if (c < 0) return i
- }
- return -1
- }
- function gte (list, value, cmp) {
- if (!cmp) cmp = defaultCmp
- var i = indexOf(list, value, cmp)
- if (i === -1) return -1
- for (; i < list.length; i++) {
- var c = cmp(list[i], value)
- if (c >= 0) return i
- }
- return -1
- }
- function gt (list, value, cmp) {
- if (!cmp) cmp = defaultCmp
- var i = indexOf(list, value, cmp)
- if (i === -1) return -1
- for (; i < list.length; i++) {
- var c = cmp(list[i], value)
- if (c > 0) return i
- }
- return -1
- }
- function eq (list, value, cmp) {
- if (!cmp) cmp = defaultCmp
- var i = indexOf(list, value, cmp)
- if (i === -1) return -1
- return cmp(list[i], value) === 0 ? i : -1
- }
- function nearest (list, value, cmp) {
- if (!cmp) cmp = defaultCmp
- var len = list.length
- var top = len - 1
- var btm = 0
- var mid = -1
- var trending = 1 // 0 = down, 2 = up
- while (top >= btm && btm >= 0 && top < len) {
- mid = Math.floor((top + btm) / 2)
- var c = cmp(list[mid], value)
- if (c === 0) return mid
- if (c >= 0) {
- if (trending === 1) trending = 0
- else if (trending === 2) {
- if (Math.abs(list[mid] - value) > Math.abs(list[mid - 1] - value)) return mid - 1
- return mid
- }
- top = mid - 1
- } else {
- if (trending === 1) trending = 2
- else if (trending === 0) return mid
- btm = mid + 1
- }
- }
- return mid
- }
- function indexOf (list, value, cmp) {
- if (!cmp) cmp = defaultCmp
- var len = list.length
- var top = len - 1
- var btm = 0
- var mid = -1
- while (top >= btm && btm >= 0 && top < len) {
- mid = Math.floor((top + btm) / 2)
- var c = cmp(list[mid], value)
- if (c === 0) return mid
- if (c >= 0) {
- top = mid - 1
- } else {
- btm = mid + 1
- }
- }
- return mid
- }
- function has (list, value, cmp) {
- return eq(list, value, cmp) > -1
- }
- function remove (list, value, cmp) {
- var i = eq(list, value, cmp)
- if (i === -1) return false
- list.splice(i, 1)
- return true
- }
|