radix.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. radix.sort = null;
  8. }
  9. t = t || radix[_] || (radix[_] = {});
  10. var i = 0, l = key.length-1, k = key[i], at, tmp;
  11. while(!(at = t[k]) && i < l){
  12. k += key[++i];
  13. }
  14. if(!at){
  15. if(!map(t, function(r, s){
  16. var ii = 0, kk = '';
  17. while(s[ii] == key[ii]){
  18. kk += s[ii++];
  19. }
  20. if(kk){
  21. if(u === val){
  22. if(ii <= l){ return }
  23. return (tmp || (tmp = {}))[s.slice(ii)] = r;
  24. }
  25. var __ = {};
  26. __[s.slice(ii)] = r;
  27. (__[key.slice(ii)] = {})[$] = val;
  28. (t[kk] = {})[_] = __;
  29. delete t[s];
  30. return true;
  31. }
  32. })){
  33. if(u === val){ return; }
  34. (t[k] || (t[k] = {}))[$] = val;
  35. }
  36. if(u === val){
  37. return tmp;
  38. }
  39. } else
  40. if(i == l){
  41. if(u === val){ return (u === (tmp = at[$]))? at[_] : tmp }
  42. at[$] = val;
  43. } else {
  44. if(u !== val){ at.sort = null }
  45. return radix(key.slice(++i), val, at[_] || (at[_] = {}));
  46. }
  47. }
  48. return radix;
  49. };
  50. Radix.map = function map(radix, cb, opt, pre){ pre = pre || [];
  51. var t = radix[_] || radix, keys = radix.sort || (radix.sort = Object.keys(t).sort()), i = 0, l = keys.length;
  52. for(;i < l; i++){ var key = keys[i], tree = t[key], tmp;
  53. if(u !== (tmp = tree[$])){
  54. tmp = cb(tmp, pre.join('') + key, key, pre);
  55. if(u !== tmp){ return tmp }
  56. } else
  57. if(opt){
  58. cb(u, pre.join(''), key, pre);
  59. }
  60. if(tmp = tree[_]){
  61. pre.push(key);
  62. tmp = map(tree, cb, opt, pre);
  63. //tmp = map(tmp, cb, opt, pre);
  64. if(u !== tmp){ return tmp }
  65. pre.pop();
  66. }
  67. }
  68. };
  69. Object.keys = Object.keys || function(o){ return map(o, function(v,k,t){t(k)}) }
  70. if(typeof window !== "undefined"){
  71. var Gun = window.Gun;
  72. window.Radix = Radix;
  73. } else {
  74. var Gun = require('../gun');
  75. try{ module.exports = Radix }catch(e){}
  76. }
  77. var map = Gun.obj.map, no = {}, u;
  78. var $ = String.fromCharCode(30), _ = String.fromCharCode(29);
  79. }());