search-bounds.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. "use strict"
  2. // (a, y, c, l, h) = (array, y[, cmp, lo, hi])
  3. function ge(a, y, c, l, h) {
  4. var i = h + 1;
  5. while (l <= h) {
  6. var m = (l + h) >>> 1, x = a[m];
  7. var p = (c !== undefined) ? c(x, y) : (x - y);
  8. if (p >= 0) { i = m; h = m - 1 } else { l = m + 1 }
  9. }
  10. return i;
  11. };
  12. function gt(a, y, c, l, h) {
  13. var i = h + 1;
  14. while (l <= h) {
  15. var m = (l + h) >>> 1, x = a[m];
  16. var p = (c !== undefined) ? c(x, y) : (x - y);
  17. if (p > 0) { i = m; h = m - 1 } else { l = m + 1 }
  18. }
  19. return i;
  20. };
  21. function lt(a, y, c, l, h) {
  22. var i = l - 1;
  23. while (l <= h) {
  24. var m = (l + h) >>> 1, x = a[m];
  25. var p = (c !== undefined) ? c(x, y) : (x - y);
  26. if (p < 0) { i = m; l = m + 1 } else { h = m - 1 }
  27. }
  28. return i;
  29. };
  30. function le(a, y, c, l, h) {
  31. var i = l - 1;
  32. while (l <= h) {
  33. var m = (l + h) >>> 1, x = a[m];
  34. var p = (c !== undefined) ? c(x, y) : (x - y);
  35. if (p <= 0) { i = m; l = m + 1 } else { h = m - 1 }
  36. }
  37. return i;
  38. };
  39. function eq(a, y, c, l, h) {
  40. while (l <= h) {
  41. var m = (l + h) >>> 1, x = a[m];
  42. var p = (c !== undefined) ? c(x, y) : (x - y);
  43. if (p === 0) { return m }
  44. if (p <= 0) { l = m + 1 } else { h = m - 1 }
  45. }
  46. return -1;
  47. };
  48. function norm(a, y, c, l, h, f) {
  49. if (typeof c === 'function') {
  50. return f(a, y, c, (l === undefined) ? 0 : l | 0, (h === undefined) ? a.length - 1 : h | 0);
  51. }
  52. return f(a, y, undefined, (c === undefined) ? 0 : c | 0, (l === undefined) ? a.length - 1 : l | 0);
  53. }
  54. module.exports = {
  55. ge: function(a, y, c, l, h) { return norm(a, y, c, l, h, ge)},
  56. gt: function(a, y, c, l, h) { return norm(a, y, c, l, h, gt)},
  57. lt: function(a, y, c, l, h) { return norm(a, y, c, l, h, lt)},
  58. le: function(a, y, c, l, h) { return norm(a, y, c, l, h, le)},
  59. eq: function(a, y, c, l, h) { return norm(a, y, c, l, h, eq)}
  60. }