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.
		
		
		
		
		
			
		
			
				
					
					
						
							174 lines
						
					
					
						
							3.1 KiB
						
					
					
				
			
		
		
	
	
							174 lines
						
					
					
						
							3.1 KiB
						
					
					
				| exports.add = add
 | |
| exports.addFromFront = addFromFront
 | |
| 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 addFromFront (list, value, cmp) {
 | |
|   if (!cmp) cmp = defaultCmp
 | |
| 
 | |
|   var top = list.unshift(value) - 1
 | |
| 
 | |
|   for (var i = 0; i < top; i++) {
 | |
|     if (cmp(value, list[i + 1]) < 0) return
 | |
|     list[i] = list[i + 1]
 | |
|     list[i + 1] = value
 | |
|   }
 | |
| }
 | |
| 
 | |
| 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
 | |
| }
 |