radix.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. ;(function(){
  2. function Radix(){
  3. var radix = function(key, val, t){
  4. key = ''+key;
  5. if(!t && u !== val){
  6. radix.last = (key < radix.last)? radix.last : key;
  7. delete (radix.$||{})[_];
  8. }
  9. t = t || radix.$ || (radix.$ = {});
  10. if(!key && Object.keys(t).length){ return t }
  11. var i = 0, l = key.length-1, k = key[i], at, tmp;
  12. while(!(at = t[k]) && i < l){
  13. k += key[++i];
  14. }
  15. if(!at){
  16. if(!map(t, function(r, s){
  17. var ii = 0, kk = '';
  18. if((s||'').length){ while(s[ii] == key[ii]){
  19. kk += s[ii++];
  20. } }
  21. if(kk){
  22. if(u === val){
  23. if(ii <= l){ return }
  24. return (tmp || (tmp = {}))[s.slice(ii)] = r;
  25. }
  26. var __ = {};
  27. __[s.slice(ii)] = r;
  28. ii = key.slice(ii);
  29. ('' === ii)? (__[''] = val) : ((__[ii] = {})[''] = val);
  30. t[kk] = __;
  31. delete t[s];
  32. return true;
  33. }
  34. })){
  35. if(u === val){ return; }
  36. (t[k] || (t[k] = {}))[''] = val;
  37. }
  38. if(u === val){
  39. return tmp;
  40. }
  41. } else
  42. if(i == l){
  43. if(u === val){ return (u === (tmp = at['']))? at : tmp }
  44. at[''] = val;
  45. } else {
  46. if(u !== val){ delete at[_] }
  47. return radix(key.slice(++i), val, at || (at = {}));
  48. }
  49. }
  50. return radix;
  51. };
  52. Radix.map = function map(radix, cb, opt, pre){ pre = pre || [];
  53. var t = ('function' == typeof radix)? radix.$ || {} : radix;
  54. if(!t){ return }
  55. var keys = (t[_]||no).sort || (t[_] = function $(){ $.sort = Object.keys(t).sort(); return $ }()).sort, rev;
  56. //var keys = Object.keys(t).sort();
  57. opt = (true === opt)? {branch: true} : (opt || {});
  58. if(rev = opt.reverse){ keys = keys.slice().reverse() }
  59. var start = opt.start, end = opt.end;
  60. var i = 0, l = keys.length;
  61. for(;i < l; i++){ var key = keys[i], tree = t[key], tmp, p, pt;
  62. if(!tree || '' === key || _ === key){ continue }
  63. p = pre.slice(); p.push(key);
  64. pt = p.join('');
  65. if(u !== start && pt < (start||'').slice(0,pt.length)){ continue }
  66. if(u !== end && (end || '\uffff') < pt){ continue }
  67. if(rev){ // children must be checked first when going in reverse.
  68. tmp = map(tree, cb, opt, p);
  69. if(u !== tmp){ return tmp }
  70. }
  71. if(u !== (tmp = tree[''])){
  72. tmp = cb(tmp, pt, key, pre);
  73. if(u !== tmp){ return tmp }
  74. } else
  75. if(opt.branch){
  76. tmp = cb(u, pt, key, pre);
  77. if(u !== tmp){ return tmp }
  78. }
  79. pre = p;
  80. if(!rev){
  81. tmp = map(tree, cb, opt, pre);
  82. if(u !== tmp){ return tmp }
  83. }
  84. pre.pop();
  85. }
  86. };
  87. Object.keys = Object.keys || function(o){ return map(o, function(v,k,t){t(k)}) }
  88. if(typeof window !== "undefined"){
  89. var Gun = window.Gun;
  90. window.Radix = Radix;
  91. } else {
  92. var Gun = require('../gun');
  93. try{ module.exports = Radix }catch(e){}
  94. }
  95. var map = Gun.obj.map, no = {}, u;
  96. var _ = String.fromCharCode(24);
  97. }());