ekylibre-cartography 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
 - data/README.md +3 -0
 - data/Rakefile +10 -0
 - data/app/assets/javascripts/cartography.coffee +535 -0
 - data/app/assets/javascripts/cartography/base.coffee +11 -0
 - data/app/assets/javascripts/cartography/controls.coffee +463 -0
 - data/app/assets/javascripts/cartography/events.coffee +36 -0
 - data/app/assets/javascripts/cartography/layers.coffee +127 -0
 - data/app/assets/javascripts/cartography/layers/simple.coffee +37 -0
 - data/app/assets/javascripts/cartography/leaflet/controls.coffee +420 -0
 - data/app/assets/javascripts/cartography/leaflet/handlers.coffee +461 -0
 - data/app/assets/javascripts/cartography/leaflet/i18n.coffee +31 -0
 - data/app/assets/javascripts/cartography/leaflet/layers.coffee +60 -0
 - data/app/assets/javascripts/cartography/leaflet/toolbars.coffee +450 -0
 - data/app/assets/javascripts/cartography/patches.js +8 -0
 - data/app/assets/javascripts/cartography/util.coffee +18 -0
 - data/app/assets/javascripts/main.js +18 -0
 - data/app/assets/stylesheets/cartography.css +86 -0
 - data/app/helpers/cartography_helper.rb +55 -0
 - data/lib/cartography.rb +1 -0
 - data/lib/cartography/engine.rb +11 -0
 - data/lib/cartography/version.rb +3 -0
 - data/vendor/assets/components/d3-array/dist/d3-array.js +590 -0
 - data/vendor/assets/components/d3-array/dist/d3-array.min.js +2 -0
 - data/vendor/assets/components/geojson-equality/dist/geojson-equality.js +295 -0
 - data/vendor/assets/components/geojson-equality/dist/geojson-equality.js.map +21 -0
 - data/vendor/assets/components/geojson-equality/dist/geojson-equality.min.js +1 -0
 - data/vendor/assets/components/leaflet-controlpanel/dist/leaflet.controlpanel.css +29 -0
 - data/vendor/assets/components/leaflet-controlpanel/dist/leaflet.controlpanel.js +269 -0
 - data/vendor/assets/components/leaflet-draw-cut/dist/leaflet.draw.cut.css +1 -0
 - data/vendor/assets/components/leaflet-draw-cut/dist/leaflet.draw.cut.js +8 -0
 - data/vendor/assets/components/leaflet-draw-merge/dist/leaflet.draw.merge.css +0 -0
 - data/vendor/assets/components/leaflet-draw-merge/dist/leaflet.draw.merge.js +48026 -0
 - data/vendor/assets/components/leaflet-draw/dist/leaflet.draw-src.css +326 -0
 - data/vendor/assets/components/leaflet-draw/dist/leaflet.draw-src.js +4653 -0
 - data/vendor/assets/components/leaflet-draw/dist/leaflet.draw-src.map +1 -0
 - data/vendor/assets/components/leaflet-draw/dist/leaflet.draw.css +10 -0
 - data/vendor/assets/components/leaflet-draw/dist/leaflet.draw.js +10 -0
 - data/vendor/assets/components/leaflet-geographicutil/dist/leaflet.geographicutil.js +3220 -0
 - data/vendor/assets/components/leaflet-reactive_measure/dist/reactive_measure.css +30 -0
 - data/vendor/assets/components/leaflet-reactive_measure/dist/reactive_measure.js +3764 -0
 - data/vendor/assets/components/leaflet/dist/leaflet-src.js +13609 -0
 - data/vendor/assets/components/leaflet/dist/leaflet-src.js.map +1 -0
 - data/vendor/assets/components/leaflet/dist/leaflet-src.map +1 -0
 - data/vendor/assets/components/leaflet/dist/leaflet.css +632 -0
 - data/vendor/assets/components/leaflet/dist/leaflet.js +5 -0
 - data/vendor/assets/components/leaflet/dist/leaflet.js.map +1 -0
 - data/vendor/assets/components/martinez-polygon-clipping/dist/martinez.min.js +9 -0
 - data/vendor/assets/components/martinez-polygon-clipping/dist/martinez.umd.js +1716 -0
 - data/vendor/assets/components/martinez-polygon-clipping/dist/martinez.umd.js.map +1 -0
 - data/vendor/assets/components/polygon-clipping/dist/polygon-clipping.js +279 -0
 - data/vendor/assets/components/polygon-clipping/dist/polygon-clipping.min.js +1 -0
 - data/vendor/assets/components/rtree/dist/rtree.js +911 -0
 - data/vendor/assets/components/rtree/dist/rtree.min.js +1 -0
 - data/vendor/assets/components/splaytree/dist/splay.es6.js +765 -0
 - data/vendor/assets/components/splaytree/dist/splay.es6.js.map +1 -0
 - data/vendor/assets/components/splaytree/dist/splay.js +797 -0
 - data/vendor/assets/components/splaytree/dist/splay.js.map +1 -0
 - metadata +156 -0
 
| 
         @@ -0,0 +1 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            {"version":3,"file":"splay.es6.js","sources":["../index.js"],"sourcesContent":["function DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }\n\nexport default class SplayTree {\n\n  constructor(compare = DEFAULT_COMPARE, noDuplicates = false) {\n    this._compare = compare;\n    this._root = null;\n    this._size = 0;\n    this._noDuplicates = !!noDuplicates;\n  }\n\n\n  rotateLeft(x) {\n    var y = x.right;\n    if (y) {\n      x.right = y.left;\n      if (y.left) y.left.parent = x;\n      y.parent = x.parent;\n    }\n\n    if (!x.parent)                this._root = y;\n    else if (x === x.parent.left) x.parent.left = y;\n    else                          x.parent.right = y;\n    if (y) y.left = x;\n    x.parent = y;\n  }\n\n\n  rotateRight(x) {\n    var y = x.left;\n    if (y) {\n      x.left = y.right;\n      if (y.right) y.right.parent = x;\n      y.parent = x.parent;\n    }\n\n    if (!x.parent)               this._root = y;\n    else if(x === x.parent.left) x.parent.left = y;\n    else                         x.parent.right = y;\n    if (y) y.right = x;\n    x.parent = y;\n  }\n\n\n  _splay(x) {\n    while (x.parent) {\n      var p = x.parent;\n      if (!p.parent) {\n        if (p.left === x) this.rotateRight(p);\n        else              this.rotateLeft(p);\n      } else if (p.left === x && p.parent.left === p) {\n        this.rotateRight(p.parent);\n        this.rotateRight(p);\n      } else if (p.right === x && p.parent.right === p) {\n        this.rotateLeft(p.parent);\n        this.rotateLeft(p);\n      } else if (p.left === x && p.parent.right === p) {\n        this.rotateRight(p);\n        this.rotateLeft(p);\n      } else {\n        this.rotateLeft(p);\n        this.rotateRight(p);\n      }\n    }\n  }\n\n\n  splay(x) {\n    var p, gp, ggp, l, r;\n\n    while (x.parent) {\n      p = x.parent;\n      gp = p.parent;\n\n      if (gp && gp.parent) {\n        ggp = gp.parent;\n        if (ggp.left === gp) ggp.left  = x;\n        else                 ggp.right = x;\n        x.parent = ggp;\n      } else {\n        x.parent = null;\n        this._root = x;\n      }\n\n      l = x.left; r = x.right;\n\n      if (x === p.left) { // left\n        if (gp) {\n          if (gp.left === p) {\n            /* zig-zig */\n            if (p.right) {\n              gp.left = p.right;\n              gp.left.parent = gp;\n            } else gp.left = null;\n\n            p.right   = gp;\n            gp.parent = p;\n          } else {\n            /* zig-zag */\n            if (l) {\n              gp.right = l;\n              l.parent = gp;\n            } else gp.right = null;\n\n            x.left    = gp;\n            gp.parent = x;\n          }\n        }\n        if (r) {\n          p.left = r;\n          r.parent = p;\n        } else p.left = null;\n\n        x.right  = p;\n        p.parent = x;\n      } else { // right\n        if (gp) {\n          if (gp.right === p) {\n            /* zig-zig */\n            if (p.left) {\n              gp.right = p.left;\n              gp.right.parent = gp;\n            } else gp.right = null;\n\n            p.left = gp;\n            gp.parent = p;\n          } else {\n            /* zig-zag */\n            if (r) {\n              gp.left = r;\n              r.parent = gp;\n            } else gp.left = null;\n\n            x.right   = gp;\n            gp.parent = x;\n          }\n        }\n        if (l) {\n          p.right = l;\n          l.parent = p;\n        } else p.right = null;\n\n        x.left   = p;\n        p.parent = x;\n      }\n    }\n  }\n\n\n  replace(u, v) {\n    if (!u.parent) this._root = v;\n    else if (u === u.parent.left) u.parent.left = v;\n    else u.parent.right = v;\n    if (v) v.parent = u.parent;\n  }\n\n\n  minNode(u = this._root) {\n    if (u) while (u.left) u = u.left;\n    return u;\n  }\n\n\n  maxNode(u = this._root) {\n    if (u) while (u.right) u = u.right;\n    return u;\n  }\n\n\n  insert(key, data) {\n    var z = this._root;\n    var p = null;\n    var comp = this._compare;\n    var cmp;\n\n    if (this._noDuplicates) {\n      while (z) {\n        p = z;\n        cmp = comp(z.key, key);\n        if (cmp === 0) return;\n        else if (comp(z.key, key) < 0) z = z.right;\n        else z = z.left;\n      }\n    } else {\n      while (z) {\n        p = z;\n        if (comp(z.key, key) < 0) z = z.right;\n        else z = z.left;\n      }\n    }\n\n    z = { key, data, left: null, right: null, parent: p };\n\n    if (!p)                          this._root = z;\n    else if (comp(p.key, z.key) < 0) p.right = z;\n    else                             p.left  = z;\n\n    this.splay(z);\n    this._size++;\n    return z;\n  }\n\n\n  find (key) {\n    var z    = this._root;\n    var comp = this._compare;\n    while (z) {\n      var cmp = comp(z.key, key);\n      if      (cmp < 0) z = z.right;\n      else if (cmp > 0) z = z.left;\n      else              return z;\n    }\n    return null;\n  }\n\n  /**\n   * Whether the tree contains a node with the given key\n   * @param  {Key} key\n   * @return {boolean} true/false\n   */\n  contains (key) {\n    var node       = this._root;\n    var comparator = this._compare;\n    while (node)  {\n      var cmp = comparator(key, node.key);\n      if      (cmp === 0) return true;\n      else if (cmp < 0)   node = node.left;\n      else                node = node.right;\n    }\n\n    return false;\n  }\n\n\n  remove (key) {\n    var z = this.find(key);\n\n    if (!z) return false;\n\n    this.splay(z);\n\n    if (!z.left) this.replace(z, z.right);\n    else if (!z.right) this.replace(z, z.left);\n    else {\n      var y = this.minNode(z.right);\n      if (y.parent !== z) {\n        this.replace(y, y.right);\n        y.right = z.right;\n        y.right.parent = y;\n      }\n      this.replace(z, y);\n      y.left = z.left;\n      y.left.parent = y;\n    }\n\n    this._size--;\n    return true;\n  }\n\n\n  removeNode(z) {\n    if (!z) return false;\n\n    this.splay(z);\n\n    if (!z.left) this.replace(z, z.right);\n    else if (!z.right) this.replace(z, z.left);\n    else {\n      var y = this.minNode(z.right);\n      if (y.parent !== z) {\n        this.replace(y, y.right);\n        y.right = z.right;\n        y.right.parent = y;\n      }\n      this.replace(z, y);\n      y.left = z.left;\n      y.left.parent = y;\n    }\n\n    this._size--;\n    return true;\n  }\n\n\n  erase (key) {\n    var z = this.find(key);\n    if (!z) return;\n\n    this.splay(z);\n\n    var s = z.left;\n    var t = z.right;\n\n    var sMax = null;\n    if (s) {\n      s.parent = null;\n      sMax = this.maxNode(s);\n      this.splay(sMax);\n      this._root = sMax;\n    }\n    if (t) {\n      if (s) sMax.right = t;\n      else   this._root = t;\n      t.parent = sMax;\n    }\n\n    this._size--;\n  }\n\n  /**\n   * Removes and returns the node with smallest key\n   * @return {?Node}\n   */\n  pop () {\n    var node = this._root, returnValue = null;\n    if (node) {\n      while (node.left) node = node.left;\n      returnValue = { key: node.key, data: node.data };\n      this.remove(node.key);\n    }\n    return returnValue;\n  }\n\n\n  /* eslint-disable class-methods-use-this */\n\n  /**\n   * Successor node\n   * @param  {Node} node\n   * @return {?Node}\n   */\n  next (node) {\n    var successor = node;\n    if (successor) {\n      if (successor.right) {\n        successor = successor.right;\n        while (successor && successor.left) successor = successor.left;\n      } else {\n        successor = node.parent;\n        while (successor && successor.right === node) {\n          node = successor; successor = successor.parent;\n        }\n      }\n    }\n    return successor;\n  }\n\n\n  /**\n   * Predecessor node\n   * @param  {Node} node\n   * @return {?Node}\n   */\n  prev (node) {\n    var predecessor = node;\n    if (predecessor) {\n      if (predecessor.left) {\n        predecessor = predecessor.left;\n        while (predecessor && predecessor.right) predecessor = predecessor.right;\n      } else {\n        predecessor = node.parent;\n        while (predecessor && predecessor.left === node) {\n          node = predecessor;\n          predecessor = predecessor.parent;\n        }\n      }\n    }\n    return predecessor;\n  }\n  /* eslint-enable class-methods-use-this */\n\n\n  /**\n   * @param  {forEachCallback} callback\n   * @return {SplayTree}\n   */\n  forEach(callback) {\n    var current = this._root;\n    var s = [], done = false, i = 0;\n\n    while (!done) {\n      // Reach the left most Node of the current Node\n      if (current) {\n        // Place pointer to a tree node on the stack\n        // before traversing the node's left subtree\n        s.push(current);\n        current = current.left;\n      } else {\n        // BackTrack from the empty subtree and visit the Node\n        // at the top of the stack; however, if the stack is\n        // empty you are done\n        if (s.length > 0) {\n          current = s.pop();\n          callback(current, i++);\n\n          // We have visited the node and its left\n          // subtree. Now, it's right subtree's turn\n          current = current.right;\n        } else done = true;\n      }\n    }\n    return this;\n  }\n\n\n  /**\n   * Walk key range from `low` to `high`. Stops if `fn` returns a value.\n   * @param  {Key}      low\n   * @param  {Key}      high\n   * @param  {Function} fn\n   * @param  {*?}       ctx\n   * @return {SplayTree}\n   */\n  range(low, high, fn, ctx) {\n    const Q = [];\n    const compare = this._compare;\n    let node = this._root, cmp;\n\n    while (Q.length !== 0 || node) {\n      if (node) {\n        Q.push(node);\n        node = node.left;\n      } else {\n        node = Q.pop();\n        cmp = compare(node.key, high);\n        if (cmp > 0) {\n          break;\n        } else if (compare(node.key, low) >= 0) {\n          if (fn.call(ctx, node)) return this; // stop if smth is returned\n        }\n        node = node.right;\n      }\n    }\n    return this;\n  }\n\n  /**\n   * Returns all keys in order\n   * @return {Array<Key>}\n   */\n  keys () {\n    var current = this._root;\n    var s = [], r = [], done = false;\n\n    while (!done) {\n      if (current) {\n        s.push(current);\n        current = current.left;\n      } else {\n        if (s.length > 0) {\n          current = s.pop();\n          r.push(current.key);\n          current = current.right;\n        } else done = true;\n      }\n    }\n    return r;\n  }\n\n\n  /**\n   * Returns `data` fields of all nodes in order.\n   * @return {Array<Value>}\n   */\n  values () {\n    var current = this._root;\n    var s = [], r = [], done = false;\n\n    while (!done) {\n      if (current) {\n        s.push(current);\n        current = current.left;\n      } else {\n        if (s.length > 0) {\n          current = s.pop();\n          r.push(current.data);\n          current = current.right;\n        } else done = true;\n      }\n    }\n    return r;\n  }\n\n\n  /**\n   * Returns node at given index\n   * @param  {number} index\n   * @return {?Node}\n   */\n  at (index) {\n    // removed after a consideration, more misleading than useful\n    // index = index % this.size;\n    // if (index < 0) index = this.size - index;\n\n    var current = this._root;\n    var s = [], done = false, i = 0;\n\n    while (!done) {\n      if (current) {\n        s.push(current);\n        current = current.left;\n      } else {\n        if (s.length > 0) {\n          current = s.pop();\n          if (i === index) return current;\n          i++;\n          current = current.right;\n        } else done = true;\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Bulk-load items. Both array have to be same size\n   * @param  {Array<Key>}    keys\n   * @param  {Array<Value>}  [values]\n   * @param  {Boolean}       [presort=false] Pre-sort keys and values, using\n   *                                         tree's comparator. Sorting is done\n   *                                         in-place\n   * @return {AVLTree}\n   */\n  load(keys = [], values = [], presort = false) {\n    if (this._size !== 0) throw new Error('bulk-load: tree is not empty');\n    const size = keys.length;\n    if (presort) sort(keys, values, 0, size - 1, this._compare);\n    this._root = loadRecursive(null, keys, values, 0, size);\n    this._size = size;\n    return this;\n  }\n\n\n  min() {\n    var node = this.minNode(this._root);\n    if (node) return node.key;\n    else      return null;\n  }\n\n\n  max() {\n    var node = this.maxNode(this._root);\n    if (node) return node.key;\n    else      return null;\n  }\n\n  isEmpty() { return this._root === null; }\n  get size() { return this._size; }\n\n\n  /**\n   * Create a tree and load it with items\n   * @param  {Array<Key>}          keys\n   * @param  {Array<Value>?}        [values]\n\n   * @param  {Function?}            [comparator]\n   * @param  {Boolean?}             [presort=false] Pre-sort keys and values, using\n   *                                               tree's comparator. Sorting is done\n   *                                               in-place\n   * @param  {Boolean?}             [noDuplicates=false]   Allow duplicates\n   * @return {SplayTree}\n   */\n  static createTree(keys, values, comparator, presort, noDuplicates) {\n    return new SplayTree(comparator, noDuplicates).load(keys, values, presort);\n  }\n}\n\n\nfunction loadRecursive (parent, keys, values, start, end) {\n  const size = end - start;\n  if (size > 0) {\n    const middle = start + Math.floor(size / 2);\n    const key    = keys[middle];\n    const data   = values[middle];\n    const node   = { key, data, parent };\n    node.left    = loadRecursive(node, keys, values, start, middle);\n    node.right   = loadRecursive(node, keys, values, middle + 1, end);\n    return node;\n  }\n  return null;\n}\n\n\nfunction sort(keys, values, left, right, compare) {\n  if (left >= right) return;\n\n  const pivot = keys[(left + right) >> 1];\n  let i = left - 1;\n  let j = right + 1;\n\n  while (true) {\n    do i++; while (compare(keys[i], pivot) < 0);\n    do j--; while (compare(keys[j], pivot) > 0);\n    if (i >= j) break;\n\n    let tmp = keys[i];\n    keys[i] = keys[j];\n    keys[j] = tmp;\n\n    tmp = values[i];\n    values[i] = values[j];\n    values[j] = tmp;\n  }\n\n  sort(keys, values,  left,     j, compare);\n  sort(keys, values, j + 1, right, compare);\n}\n"],"names":[],"mappings":"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"}
         
     | 
| 
         @@ -0,0 +1,797 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            /**
         
     | 
| 
      
 2 
     | 
    
         
            +
             * splaytree v2.0.2
         
     | 
| 
      
 3 
     | 
    
         
            +
             * Fast Splay tree for Node and browser
         
     | 
| 
      
 4 
     | 
    
         
            +
             *
         
     | 
| 
      
 5 
     | 
    
         
            +
             * @author Alexander Milevski <info@w8r.name>
         
     | 
| 
      
 6 
     | 
    
         
            +
             * @license MIT
         
     | 
| 
      
 7 
     | 
    
         
            +
             * @preserve
         
     | 
| 
      
 8 
     | 
    
         
            +
             */
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            (function (global, factory) {
         
     | 
| 
      
 11 
     | 
    
         
            +
              typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
         
     | 
| 
      
 12 
     | 
    
         
            +
              typeof define === 'function' && define.amd ? define(factory) :
         
     | 
| 
      
 13 
     | 
    
         
            +
              (global.SplayTree = factory());
         
     | 
| 
      
 14 
     | 
    
         
            +
            }(this, (function () { 'use strict';
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
              /* follows "An implementation of top-down splaying"
         
     | 
| 
      
 17 
     | 
    
         
            +
               * by D. Sleator <sleator@cs.cmu.edu> March 1992
         
     | 
| 
      
 18 
     | 
    
         
            +
               */
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
              /**
         
     | 
| 
      
 21 
     | 
    
         
            +
               * @typedef {*} Key
         
     | 
| 
      
 22 
     | 
    
         
            +
               */
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
              /**
         
     | 
| 
      
 26 
     | 
    
         
            +
               * @typedef {*} Value
         
     | 
| 
      
 27 
     | 
    
         
            +
               */
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
              /**
         
     | 
| 
      
 31 
     | 
    
         
            +
               * @typedef {function(node:Node):void} Visitor
         
     | 
| 
      
 32 
     | 
    
         
            +
               */
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
              /**
         
     | 
| 
      
 36 
     | 
    
         
            +
               * @typedef {function(a:Key, b:Key):number} Comparator
         
     | 
| 
      
 37 
     | 
    
         
            +
               */
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
              /**
         
     | 
| 
      
 41 
     | 
    
         
            +
               * @param {function(node:Node):string} NodePrinter
         
     | 
| 
      
 42 
     | 
    
         
            +
               */
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
              /**
         
     | 
| 
      
 46 
     | 
    
         
            +
               * @typedef {Object}  Node
         
     | 
| 
      
 47 
     | 
    
         
            +
               * @property {Key}    Key
         
     | 
| 
      
 48 
     | 
    
         
            +
               * @property {Value=} data
         
     | 
| 
      
 49 
     | 
    
         
            +
               * @property {Node}   left
         
     | 
| 
      
 50 
     | 
    
         
            +
               * @property {Node}   right
         
     | 
| 
      
 51 
     | 
    
         
            +
               */
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
              var Node = function Node (key, data) {
         
     | 
| 
      
 54 
     | 
    
         
            +
                this.key  = key;
         
     | 
| 
      
 55 
     | 
    
         
            +
                this.data = data;
         
     | 
| 
      
 56 
     | 
    
         
            +
                this.left = null;
         
     | 
| 
      
 57 
     | 
    
         
            +
                this.right= null;
         
     | 
| 
      
 58 
     | 
    
         
            +
              };
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
              function DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
              /**
         
     | 
| 
      
 64 
     | 
    
         
            +
               * Simple top down splay, not requiring i to be in the tree t.
         
     | 
| 
      
 65 
     | 
    
         
            +
               * @param {Key} i
         
     | 
| 
      
 66 
     | 
    
         
            +
               * @param {Node?} t
         
     | 
| 
      
 67 
     | 
    
         
            +
               * @param {Comparator} comparator
         
     | 
| 
      
 68 
     | 
    
         
            +
               */
         
     | 
| 
      
 69 
     | 
    
         
            +
              function splay (i, t, comparator) {
         
     | 
| 
      
 70 
     | 
    
         
            +
                if (t === null) { return t; }
         
     | 
| 
      
 71 
     | 
    
         
            +
                var l, r, y;
         
     | 
| 
      
 72 
     | 
    
         
            +
                var N = new Node();
         
     | 
| 
      
 73 
     | 
    
         
            +
                l = r = N;
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
                while (true) {
         
     | 
| 
      
 76 
     | 
    
         
            +
                  var cmp = comparator(i, t.key);
         
     | 
| 
      
 77 
     | 
    
         
            +
                  //if (i < t.key) {
         
     | 
| 
      
 78 
     | 
    
         
            +
                  if (cmp < 0) {
         
     | 
| 
      
 79 
     | 
    
         
            +
                    if (t.left === null) { break; }
         
     | 
| 
      
 80 
     | 
    
         
            +
                    //if (i < t.left.key) {
         
     | 
| 
      
 81 
     | 
    
         
            +
                    if (comparator(i, t.left.key) < 0) {
         
     | 
| 
      
 82 
     | 
    
         
            +
                      y = t.left;                           /* rotate right */
         
     | 
| 
      
 83 
     | 
    
         
            +
                      t.left = y.right;
         
     | 
| 
      
 84 
     | 
    
         
            +
                      y.right = t;
         
     | 
| 
      
 85 
     | 
    
         
            +
                      t = y;
         
     | 
| 
      
 86 
     | 
    
         
            +
                      if (t.left === null) { break; }
         
     | 
| 
      
 87 
     | 
    
         
            +
                    }
         
     | 
| 
      
 88 
     | 
    
         
            +
                    r.left = t;                               /* link right */
         
     | 
| 
      
 89 
     | 
    
         
            +
                    r = t;
         
     | 
| 
      
 90 
     | 
    
         
            +
                    t = t.left;
         
     | 
| 
      
 91 
     | 
    
         
            +
                  //} else if (i > t.key) {
         
     | 
| 
      
 92 
     | 
    
         
            +
                  } else if (cmp > 0) {
         
     | 
| 
      
 93 
     | 
    
         
            +
                    if (t.right === null) { break; }
         
     | 
| 
      
 94 
     | 
    
         
            +
                    //if (i > t.right.key) {
         
     | 
| 
      
 95 
     | 
    
         
            +
                    if (comparator(i, t.right.key) > 0) {
         
     | 
| 
      
 96 
     | 
    
         
            +
                      y = t.right;                          /* rotate left */
         
     | 
| 
      
 97 
     | 
    
         
            +
                      t.right = y.left;
         
     | 
| 
      
 98 
     | 
    
         
            +
                      y.left = t;
         
     | 
| 
      
 99 
     | 
    
         
            +
                      t = y;
         
     | 
| 
      
 100 
     | 
    
         
            +
                      if (t.right === null) { break; }
         
     | 
| 
      
 101 
     | 
    
         
            +
                    }
         
     | 
| 
      
 102 
     | 
    
         
            +
                    l.right = t;                              /* link left */
         
     | 
| 
      
 103 
     | 
    
         
            +
                    l = t;
         
     | 
| 
      
 104 
     | 
    
         
            +
                    t = t.right;
         
     | 
| 
      
 105 
     | 
    
         
            +
                  } else {
         
     | 
| 
      
 106 
     | 
    
         
            +
                    break;
         
     | 
| 
      
 107 
     | 
    
         
            +
                  }
         
     | 
| 
      
 108 
     | 
    
         
            +
                }
         
     | 
| 
      
 109 
     | 
    
         
            +
                /* assemble */
         
     | 
| 
      
 110 
     | 
    
         
            +
                l.right = t.left;
         
     | 
| 
      
 111 
     | 
    
         
            +
                r.left = t.right;
         
     | 
| 
      
 112 
     | 
    
         
            +
                t.left = N.right;
         
     | 
| 
      
 113 
     | 
    
         
            +
                t.right = N.left;
         
     | 
| 
      
 114 
     | 
    
         
            +
                return t;
         
     | 
| 
      
 115 
     | 
    
         
            +
              }
         
     | 
| 
      
 116 
     | 
    
         
            +
             
     | 
| 
      
 117 
     | 
    
         
            +
             
     | 
| 
      
 118 
     | 
    
         
            +
              /**
         
     | 
| 
      
 119 
     | 
    
         
            +
               * @param  {Key}        i
         
     | 
| 
      
 120 
     | 
    
         
            +
               * @param  {Value}      data
         
     | 
| 
      
 121 
     | 
    
         
            +
               * @param  {Comparator} comparator
         
     | 
| 
      
 122 
     | 
    
         
            +
               * @param  {Tree}       tree
         
     | 
| 
      
 123 
     | 
    
         
            +
               * @return {Node}      root
         
     | 
| 
      
 124 
     | 
    
         
            +
               */
         
     | 
| 
      
 125 
     | 
    
         
            +
              function insert (i, data, t, comparator, tree) {
         
     | 
| 
      
 126 
     | 
    
         
            +
                var node = new Node(i, data);
         
     | 
| 
      
 127 
     | 
    
         
            +
             
     | 
| 
      
 128 
     | 
    
         
            +
                tree._size++;
         
     | 
| 
      
 129 
     | 
    
         
            +
             
     | 
| 
      
 130 
     | 
    
         
            +
                if (t === null) {
         
     | 
| 
      
 131 
     | 
    
         
            +
                  node.left = node.right = null;
         
     | 
| 
      
 132 
     | 
    
         
            +
                  return node;
         
     | 
| 
      
 133 
     | 
    
         
            +
                }
         
     | 
| 
      
 134 
     | 
    
         
            +
             
     | 
| 
      
 135 
     | 
    
         
            +
                t = splay(i, t, comparator);
         
     | 
| 
      
 136 
     | 
    
         
            +
                var cmp = comparator(i, t.key);
         
     | 
| 
      
 137 
     | 
    
         
            +
                if (cmp < 0) {
         
     | 
| 
      
 138 
     | 
    
         
            +
                  node.left = t.left;
         
     | 
| 
      
 139 
     | 
    
         
            +
                  node.right = t;
         
     | 
| 
      
 140 
     | 
    
         
            +
                  t.left = null;
         
     | 
| 
      
 141 
     | 
    
         
            +
                } else if (cmp >= 0) {
         
     | 
| 
      
 142 
     | 
    
         
            +
                  node.right = t.right;
         
     | 
| 
      
 143 
     | 
    
         
            +
                  node.left = t;
         
     | 
| 
      
 144 
     | 
    
         
            +
                  t.right = null;
         
     | 
| 
      
 145 
     | 
    
         
            +
                }
         
     | 
| 
      
 146 
     | 
    
         
            +
                return node;
         
     | 
| 
      
 147 
     | 
    
         
            +
              }
         
     | 
| 
      
 148 
     | 
    
         
            +
             
     | 
| 
      
 149 
     | 
    
         
            +
             
     | 
| 
      
 150 
     | 
    
         
            +
              /**
         
     | 
| 
      
 151 
     | 
    
         
            +
               * Insert i into the tree t, unless it's already there.
         
     | 
| 
      
 152 
     | 
    
         
            +
               * @param  {Key}        i
         
     | 
| 
      
 153 
     | 
    
         
            +
               * @param  {Value}      data
         
     | 
| 
      
 154 
     | 
    
         
            +
               * @param  {Comparator} comparator
         
     | 
| 
      
 155 
     | 
    
         
            +
               * @param  {Tree}       tree
         
     | 
| 
      
 156 
     | 
    
         
            +
               * @return {Node}       root
         
     | 
| 
      
 157 
     | 
    
         
            +
               */
         
     | 
| 
      
 158 
     | 
    
         
            +
              function add (i, data, t, comparator, tree) {
         
     | 
| 
      
 159 
     | 
    
         
            +
                var node = new Node(i, data);
         
     | 
| 
      
 160 
     | 
    
         
            +
             
     | 
| 
      
 161 
     | 
    
         
            +
                if (t === null) {
         
     | 
| 
      
 162 
     | 
    
         
            +
                  node.left = node.right = null;
         
     | 
| 
      
 163 
     | 
    
         
            +
                  tree._size++;
         
     | 
| 
      
 164 
     | 
    
         
            +
                  return node;
         
     | 
| 
      
 165 
     | 
    
         
            +
                }
         
     | 
| 
      
 166 
     | 
    
         
            +
             
     | 
| 
      
 167 
     | 
    
         
            +
                t = splay(i, t, comparator);
         
     | 
| 
      
 168 
     | 
    
         
            +
                var cmp = comparator(i, t.key);
         
     | 
| 
      
 169 
     | 
    
         
            +
                if (cmp === 0) { return t; }
         
     | 
| 
      
 170 
     | 
    
         
            +
                else {
         
     | 
| 
      
 171 
     | 
    
         
            +
                  if (cmp < 0) {
         
     | 
| 
      
 172 
     | 
    
         
            +
                    node.left = t.left;
         
     | 
| 
      
 173 
     | 
    
         
            +
                    node.right = t;
         
     | 
| 
      
 174 
     | 
    
         
            +
                    t.left = null;
         
     | 
| 
      
 175 
     | 
    
         
            +
                  } else if (cmp > 0) {
         
     | 
| 
      
 176 
     | 
    
         
            +
                    node.right = t.right;
         
     | 
| 
      
 177 
     | 
    
         
            +
                    node.left = t;
         
     | 
| 
      
 178 
     | 
    
         
            +
                    t.right = null;
         
     | 
| 
      
 179 
     | 
    
         
            +
                  }
         
     | 
| 
      
 180 
     | 
    
         
            +
                  tree._size++;
         
     | 
| 
      
 181 
     | 
    
         
            +
                  return node;
         
     | 
| 
      
 182 
     | 
    
         
            +
                }
         
     | 
| 
      
 183 
     | 
    
         
            +
              }
         
     | 
| 
      
 184 
     | 
    
         
            +
             
     | 
| 
      
 185 
     | 
    
         
            +
             
     | 
| 
      
 186 
     | 
    
         
            +
              /**
         
     | 
| 
      
 187 
     | 
    
         
            +
               * Deletes i from the tree if it's there
         
     | 
| 
      
 188 
     | 
    
         
            +
               * @param {Key}        i
         
     | 
| 
      
 189 
     | 
    
         
            +
               * @param {Tree}       tree
         
     | 
| 
      
 190 
     | 
    
         
            +
               * @param {Comparator} comparator
         
     | 
| 
      
 191 
     | 
    
         
            +
               * @param {Tree}       tree
         
     | 
| 
      
 192 
     | 
    
         
            +
               * @return {Node}      new root
         
     | 
| 
      
 193 
     | 
    
         
            +
               */
         
     | 
| 
      
 194 
     | 
    
         
            +
              function remove (i, t, comparator, tree) {
         
     | 
| 
      
 195 
     | 
    
         
            +
                var x;
         
     | 
| 
      
 196 
     | 
    
         
            +
                if (t === null) { return null; }
         
     | 
| 
      
 197 
     | 
    
         
            +
                t = splay(i, t, comparator);
         
     | 
| 
      
 198 
     | 
    
         
            +
                if (i === t.key) {               /* found it */
         
     | 
| 
      
 199 
     | 
    
         
            +
                  if (t.left === null) {
         
     | 
| 
      
 200 
     | 
    
         
            +
                    x = t.right;
         
     | 
| 
      
 201 
     | 
    
         
            +
                  } else {
         
     | 
| 
      
 202 
     | 
    
         
            +
                    x = splay(i, t.left, comparator);
         
     | 
| 
      
 203 
     | 
    
         
            +
                    x.right = t.right;
         
     | 
| 
      
 204 
     | 
    
         
            +
                  }
         
     | 
| 
      
 205 
     | 
    
         
            +
                  tree._size--;
         
     | 
| 
      
 206 
     | 
    
         
            +
                  return x;
         
     | 
| 
      
 207 
     | 
    
         
            +
                }
         
     | 
| 
      
 208 
     | 
    
         
            +
                return t;                         /* It wasn't there */
         
     | 
| 
      
 209 
     | 
    
         
            +
              }
         
     | 
| 
      
 210 
     | 
    
         
            +
             
     | 
| 
      
 211 
     | 
    
         
            +
             
     | 
| 
      
 212 
     | 
    
         
            +
              function split (key, v, comparator) {
         
     | 
| 
      
 213 
     | 
    
         
            +
                var left, right;
         
     | 
| 
      
 214 
     | 
    
         
            +
                if (v === null) {
         
     | 
| 
      
 215 
     | 
    
         
            +
                  left = right = null;
         
     | 
| 
      
 216 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 217 
     | 
    
         
            +
                  v = splay(key, v, comparator);
         
     | 
| 
      
 218 
     | 
    
         
            +
             
     | 
| 
      
 219 
     | 
    
         
            +
                  var cmp = comparator(v.key, key);
         
     | 
| 
      
 220 
     | 
    
         
            +
                  if (cmp === 0) {
         
     | 
| 
      
 221 
     | 
    
         
            +
                    left  = v.left;
         
     | 
| 
      
 222 
     | 
    
         
            +
                    right = v.right;
         
     | 
| 
      
 223 
     | 
    
         
            +
                  } else if (cmp < 0) {
         
     | 
| 
      
 224 
     | 
    
         
            +
                    right   = v.right;
         
     | 
| 
      
 225 
     | 
    
         
            +
                    v.right = null;
         
     | 
| 
      
 226 
     | 
    
         
            +
                    left    = v;
         
     | 
| 
      
 227 
     | 
    
         
            +
                  } else {
         
     | 
| 
      
 228 
     | 
    
         
            +
                    left   = v.left;
         
     | 
| 
      
 229 
     | 
    
         
            +
                    v.left = null;
         
     | 
| 
      
 230 
     | 
    
         
            +
                    right  = v;
         
     | 
| 
      
 231 
     | 
    
         
            +
                  }
         
     | 
| 
      
 232 
     | 
    
         
            +
                }
         
     | 
| 
      
 233 
     | 
    
         
            +
                return { left: left, right: right };
         
     | 
| 
      
 234 
     | 
    
         
            +
              }
         
     | 
| 
      
 235 
     | 
    
         
            +
             
     | 
| 
      
 236 
     | 
    
         
            +
             
     | 
| 
      
 237 
     | 
    
         
            +
              function merge (left, right, comparator) {
         
     | 
| 
      
 238 
     | 
    
         
            +
                if (right === null) { return left; }
         
     | 
| 
      
 239 
     | 
    
         
            +
                if (left  === null) { return right; }
         
     | 
| 
      
 240 
     | 
    
         
            +
             
     | 
| 
      
 241 
     | 
    
         
            +
                right = splay(left.key, right, comparator);
         
     | 
| 
      
 242 
     | 
    
         
            +
                right.left = left;
         
     | 
| 
      
 243 
     | 
    
         
            +
                return right;
         
     | 
| 
      
 244 
     | 
    
         
            +
              }
         
     | 
| 
      
 245 
     | 
    
         
            +
             
     | 
| 
      
 246 
     | 
    
         
            +
             
     | 
| 
      
 247 
     | 
    
         
            +
              /**
         
     | 
| 
      
 248 
     | 
    
         
            +
               * Prints level of the tree
         
     | 
| 
      
 249 
     | 
    
         
            +
               * @param  {Node}                        root
         
     | 
| 
      
 250 
     | 
    
         
            +
               * @param  {String}                      prefix
         
     | 
| 
      
 251 
     | 
    
         
            +
               * @param  {Boolean}                     isTail
         
     | 
| 
      
 252 
     | 
    
         
            +
               * @param  {Array<string>}               out
         
     | 
| 
      
 253 
     | 
    
         
            +
               * @param  {Function(node:Node):String}  printNode
         
     | 
| 
      
 254 
     | 
    
         
            +
               */
         
     | 
| 
      
 255 
     | 
    
         
            +
              function printRow (root, prefix, isTail, out, printNode) {
         
     | 
| 
      
 256 
     | 
    
         
            +
                if (root) {
         
     | 
| 
      
 257 
     | 
    
         
            +
                  out(("" + prefix + (isTail ? '└── ' : '├── ') + (printNode(root)) + "\n"));
         
     | 
| 
      
 258 
     | 
    
         
            +
                  var indent = prefix + (isTail ? '    ' : '│   ');
         
     | 
| 
      
 259 
     | 
    
         
            +
                  if (root.left)  { printRow(root.left,  indent, false, out, printNode); }
         
     | 
| 
      
 260 
     | 
    
         
            +
                  if (root.right) { printRow(root.right, indent, true,  out, printNode); }
         
     | 
| 
      
 261 
     | 
    
         
            +
                }
         
     | 
| 
      
 262 
     | 
    
         
            +
              }
         
     | 
| 
      
 263 
     | 
    
         
            +
             
     | 
| 
      
 264 
     | 
    
         
            +
             
     | 
| 
      
 265 
     | 
    
         
            +
              var Tree = function Tree (comparator) {
         
     | 
| 
      
 266 
     | 
    
         
            +
                if ( comparator === void 0 ) comparator = DEFAULT_COMPARE;
         
     | 
| 
      
 267 
     | 
    
         
            +
             
     | 
| 
      
 268 
     | 
    
         
            +
                this._comparator = comparator;
         
     | 
| 
      
 269 
     | 
    
         
            +
                this._root = null;
         
     | 
| 
      
 270 
     | 
    
         
            +
                this._size = 0;
         
     | 
| 
      
 271 
     | 
    
         
            +
              };
         
     | 
| 
      
 272 
     | 
    
         
            +
             
     | 
| 
      
 273 
     | 
    
         
            +
              var prototypeAccessors = { size: { configurable: true } };
         
     | 
| 
      
 274 
     | 
    
         
            +
             
     | 
| 
      
 275 
     | 
    
         
            +
             
     | 
| 
      
 276 
     | 
    
         
            +
              /**
         
     | 
| 
      
 277 
     | 
    
         
            +
               * Inserts a key, allows duplicates
         
     | 
| 
      
 278 
     | 
    
         
            +
               * @param{Key}  key
         
     | 
| 
      
 279 
     | 
    
         
            +
               * @param{Value=} data
         
     | 
| 
      
 280 
     | 
    
         
            +
               * @return {Node|null}
         
     | 
| 
      
 281 
     | 
    
         
            +
               */
         
     | 
| 
      
 282 
     | 
    
         
            +
              Tree.prototype.insert = function insert$1 (key, data) {
         
     | 
| 
      
 283 
     | 
    
         
            +
                return this._root = insert(key, data, this._root, this._comparator, this);
         
     | 
| 
      
 284 
     | 
    
         
            +
              };
         
     | 
| 
      
 285 
     | 
    
         
            +
             
     | 
| 
      
 286 
     | 
    
         
            +
             
     | 
| 
      
 287 
     | 
    
         
            +
              /**
         
     | 
| 
      
 288 
     | 
    
         
            +
               * Adds a key, if it is not present in the tree
         
     | 
| 
      
 289 
     | 
    
         
            +
               * @param{Key}  key
         
     | 
| 
      
 290 
     | 
    
         
            +
               * @param{Value=} data
         
     | 
| 
      
 291 
     | 
    
         
            +
               * @return {Node|null}
         
     | 
| 
      
 292 
     | 
    
         
            +
               */
         
     | 
| 
      
 293 
     | 
    
         
            +
              Tree.prototype.add = function add$1 (key, data) {
         
     | 
| 
      
 294 
     | 
    
         
            +
                return this._root = add(key, data, this._root, this._comparator, this);
         
     | 
| 
      
 295 
     | 
    
         
            +
              };
         
     | 
| 
      
 296 
     | 
    
         
            +
             
     | 
| 
      
 297 
     | 
    
         
            +
             
     | 
| 
      
 298 
     | 
    
         
            +
              /**
         
     | 
| 
      
 299 
     | 
    
         
            +
               * @param{Key} key
         
     | 
| 
      
 300 
     | 
    
         
            +
               * @return {Node|null}
         
     | 
| 
      
 301 
     | 
    
         
            +
               */
         
     | 
| 
      
 302 
     | 
    
         
            +
              Tree.prototype.remove = function remove$1 (key) {
         
     | 
| 
      
 303 
     | 
    
         
            +
                this._root = remove(key, this._root, this._comparator, this);
         
     | 
| 
      
 304 
     | 
    
         
            +
              };
         
     | 
| 
      
 305 
     | 
    
         
            +
             
     | 
| 
      
 306 
     | 
    
         
            +
             
     | 
| 
      
 307 
     | 
    
         
            +
              /**
         
     | 
| 
      
 308 
     | 
    
         
            +
               * Removes and returns the node with smallest key
         
     | 
| 
      
 309 
     | 
    
         
            +
               * @return {?Node}
         
     | 
| 
      
 310 
     | 
    
         
            +
               */
         
     | 
| 
      
 311 
     | 
    
         
            +
              Tree.prototype.pop = function pop () {
         
     | 
| 
      
 312 
     | 
    
         
            +
                var node = this._root;
         
     | 
| 
      
 313 
     | 
    
         
            +
                if (node) {
         
     | 
| 
      
 314 
     | 
    
         
            +
                  while (node.left) { node = node.left; }
         
     | 
| 
      
 315 
     | 
    
         
            +
                  this._root = splay(node.key,this._root, this._comparator);
         
     | 
| 
      
 316 
     | 
    
         
            +
                  this._root = remove(node.key, this._root, this._comparator, this);
         
     | 
| 
      
 317 
     | 
    
         
            +
                  return { key: node.key, data: node.data };
         
     | 
| 
      
 318 
     | 
    
         
            +
                }
         
     | 
| 
      
 319 
     | 
    
         
            +
                return null;
         
     | 
| 
      
 320 
     | 
    
         
            +
              };
         
     | 
| 
      
 321 
     | 
    
         
            +
             
     | 
| 
      
 322 
     | 
    
         
            +
             
     | 
| 
      
 323 
     | 
    
         
            +
              /**
         
     | 
| 
      
 324 
     | 
    
         
            +
               * @param{Key} key
         
     | 
| 
      
 325 
     | 
    
         
            +
               * @return {Node|null}
         
     | 
| 
      
 326 
     | 
    
         
            +
               */
         
     | 
| 
      
 327 
     | 
    
         
            +
              Tree.prototype.findStatic = function findStatic (key) {
         
     | 
| 
      
 328 
     | 
    
         
            +
                var current = this._root;
         
     | 
| 
      
 329 
     | 
    
         
            +
                var compare = this._comparator;
         
     | 
| 
      
 330 
     | 
    
         
            +
                while (current) {
         
     | 
| 
      
 331 
     | 
    
         
            +
                  var cmp = compare(key, current.key);
         
     | 
| 
      
 332 
     | 
    
         
            +
                  if (cmp === 0)  { return current; }
         
     | 
| 
      
 333 
     | 
    
         
            +
                  else if (cmp < 0) { current = current.left; }
         
     | 
| 
      
 334 
     | 
    
         
            +
                  else            { current = current.right; }
         
     | 
| 
      
 335 
     | 
    
         
            +
                }
         
     | 
| 
      
 336 
     | 
    
         
            +
                return null;
         
     | 
| 
      
 337 
     | 
    
         
            +
              };
         
     | 
| 
      
 338 
     | 
    
         
            +
             
     | 
| 
      
 339 
     | 
    
         
            +
             
     | 
| 
      
 340 
     | 
    
         
            +
              /**
         
     | 
| 
      
 341 
     | 
    
         
            +
               * @param{Key} key
         
     | 
| 
      
 342 
     | 
    
         
            +
               * @return {Node|null}
         
     | 
| 
      
 343 
     | 
    
         
            +
               */
         
     | 
| 
      
 344 
     | 
    
         
            +
              Tree.prototype.find = function find (key) {
         
     | 
| 
      
 345 
     | 
    
         
            +
                if (this._root) {
         
     | 
| 
      
 346 
     | 
    
         
            +
                  this._root = splay(key, this._root, this._comparator);
         
     | 
| 
      
 347 
     | 
    
         
            +
                  if (this._comparator(key, this._root.key) !== 0) { return null; }
         
     | 
| 
      
 348 
     | 
    
         
            +
                }
         
     | 
| 
      
 349 
     | 
    
         
            +
                return this._root;
         
     | 
| 
      
 350 
     | 
    
         
            +
              };
         
     | 
| 
      
 351 
     | 
    
         
            +
             
     | 
| 
      
 352 
     | 
    
         
            +
             
     | 
| 
      
 353 
     | 
    
         
            +
              /**
         
     | 
| 
      
 354 
     | 
    
         
            +
               * @param{Key} key
         
     | 
| 
      
 355 
     | 
    
         
            +
               * @return {Boolean}
         
     | 
| 
      
 356 
     | 
    
         
            +
               */
         
     | 
| 
      
 357 
     | 
    
         
            +
              Tree.prototype.contains = function contains (key) {
         
     | 
| 
      
 358 
     | 
    
         
            +
                var current = this._root;
         
     | 
| 
      
 359 
     | 
    
         
            +
                var compare = this._comparator;
         
     | 
| 
      
 360 
     | 
    
         
            +
                while (current) {
         
     | 
| 
      
 361 
     | 
    
         
            +
                  var cmp = compare(key, current.key);
         
     | 
| 
      
 362 
     | 
    
         
            +
                  if (cmp === 0)  { return true; }
         
     | 
| 
      
 363 
     | 
    
         
            +
                  else if (cmp < 0) { current = current.left; }
         
     | 
| 
      
 364 
     | 
    
         
            +
                  else            { current = current.right; }
         
     | 
| 
      
 365 
     | 
    
         
            +
                }
         
     | 
| 
      
 366 
     | 
    
         
            +
                return false;
         
     | 
| 
      
 367 
     | 
    
         
            +
              };
         
     | 
| 
      
 368 
     | 
    
         
            +
             
     | 
| 
      
 369 
     | 
    
         
            +
             
     | 
| 
      
 370 
     | 
    
         
            +
              /**
         
     | 
| 
      
 371 
     | 
    
         
            +
               * @param{Visitor} visitor
         
     | 
| 
      
 372 
     | 
    
         
            +
               * @param{*=}    ctx
         
     | 
| 
      
 373 
     | 
    
         
            +
               * @return {SplayTree}
         
     | 
| 
      
 374 
     | 
    
         
            +
               */
         
     | 
| 
      
 375 
     | 
    
         
            +
              Tree.prototype.forEach = function forEach (visitor, ctx) {
         
     | 
| 
      
 376 
     | 
    
         
            +
                var current = this._root;
         
     | 
| 
      
 377 
     | 
    
         
            +
                var Q = [];/* Initialize stack s */
         
     | 
| 
      
 378 
     | 
    
         
            +
                var done = false;
         
     | 
| 
      
 379 
     | 
    
         
            +
             
     | 
| 
      
 380 
     | 
    
         
            +
                while (!done) {
         
     | 
| 
      
 381 
     | 
    
         
            +
                  if (current !==null) {
         
     | 
| 
      
 382 
     | 
    
         
            +
                    Q.push(current);
         
     | 
| 
      
 383 
     | 
    
         
            +
                    current = current.left;
         
     | 
| 
      
 384 
     | 
    
         
            +
                  } else {
         
     | 
| 
      
 385 
     | 
    
         
            +
                    if (Q.length !== 0) {
         
     | 
| 
      
 386 
     | 
    
         
            +
                      current = Q.pop();
         
     | 
| 
      
 387 
     | 
    
         
            +
                      visitor.call(ctx, current);
         
     | 
| 
      
 388 
     | 
    
         
            +
             
     | 
| 
      
 389 
     | 
    
         
            +
                      current = current.right;
         
     | 
| 
      
 390 
     | 
    
         
            +
                    } else { done = true; }
         
     | 
| 
      
 391 
     | 
    
         
            +
                  }
         
     | 
| 
      
 392 
     | 
    
         
            +
                }
         
     | 
| 
      
 393 
     | 
    
         
            +
                return this;
         
     | 
| 
      
 394 
     | 
    
         
            +
              };
         
     | 
| 
      
 395 
     | 
    
         
            +
             
     | 
| 
      
 396 
     | 
    
         
            +
             
     | 
| 
      
 397 
     | 
    
         
            +
              /**
         
     | 
| 
      
 398 
     | 
    
         
            +
               * Walk key range from `low` to `high`. Stops if `fn` returns a value.
         
     | 
| 
      
 399 
     | 
    
         
            +
               * @param{Key}    low
         
     | 
| 
      
 400 
     | 
    
         
            +
               * @param{Key}    high
         
     | 
| 
      
 401 
     | 
    
         
            +
               * @param{Function} fn
         
     | 
| 
      
 402 
     | 
    
         
            +
               * @param{*?}     ctx
         
     | 
| 
      
 403 
     | 
    
         
            +
               * @return {SplayTree}
         
     | 
| 
      
 404 
     | 
    
         
            +
               */
         
     | 
| 
      
 405 
     | 
    
         
            +
              Tree.prototype.range = function range (low, high, fn, ctx) {
         
     | 
| 
      
 406 
     | 
    
         
            +
                  var this$1 = this;
         
     | 
| 
      
 407 
     | 
    
         
            +
             
     | 
| 
      
 408 
     | 
    
         
            +
                var Q = [];
         
     | 
| 
      
 409 
     | 
    
         
            +
                var compare = this._comparator;
         
     | 
| 
      
 410 
     | 
    
         
            +
                var node = this._root, cmp;
         
     | 
| 
      
 411 
     | 
    
         
            +
             
     | 
| 
      
 412 
     | 
    
         
            +
                while (Q.length !== 0 || node) {
         
     | 
| 
      
 413 
     | 
    
         
            +
                  if (node) {
         
     | 
| 
      
 414 
     | 
    
         
            +
                    Q.push(node);
         
     | 
| 
      
 415 
     | 
    
         
            +
                    node = node.left;
         
     | 
| 
      
 416 
     | 
    
         
            +
                  } else {
         
     | 
| 
      
 417 
     | 
    
         
            +
                    node = Q.pop();
         
     | 
| 
      
 418 
     | 
    
         
            +
                    cmp = compare(node.key, high);
         
     | 
| 
      
 419 
     | 
    
         
            +
                    if (cmp > 0) {
         
     | 
| 
      
 420 
     | 
    
         
            +
                      break;
         
     | 
| 
      
 421 
     | 
    
         
            +
                    } else if (compare(node.key, low) >= 0) {
         
     | 
| 
      
 422 
     | 
    
         
            +
                      if (fn.call(ctx, node)) { return this$1; } // stop if smth is returned
         
     | 
| 
      
 423 
     | 
    
         
            +
                    }
         
     | 
| 
      
 424 
     | 
    
         
            +
                    node = node.right;
         
     | 
| 
      
 425 
     | 
    
         
            +
                  }
         
     | 
| 
      
 426 
     | 
    
         
            +
                }
         
     | 
| 
      
 427 
     | 
    
         
            +
                return this;
         
     | 
| 
      
 428 
     | 
    
         
            +
              };
         
     | 
| 
      
 429 
     | 
    
         
            +
             
     | 
| 
      
 430 
     | 
    
         
            +
             
     | 
| 
      
 431 
     | 
    
         
            +
              /**
         
     | 
| 
      
 432 
     | 
    
         
            +
               * Returns array of keys
         
     | 
| 
      
 433 
     | 
    
         
            +
               * @return {Array<Key>}
         
     | 
| 
      
 434 
     | 
    
         
            +
               */
         
     | 
| 
      
 435 
     | 
    
         
            +
              Tree.prototype.keys = function keys () {
         
     | 
| 
      
 436 
     | 
    
         
            +
                var keys = [];
         
     | 
| 
      
 437 
     | 
    
         
            +
                this.forEach(function (ref) {
         
     | 
| 
      
 438 
     | 
    
         
            +
                    var key = ref.key;
         
     | 
| 
      
 439 
     | 
    
         
            +
             
     | 
| 
      
 440 
     | 
    
         
            +
                    return keys.push(key);
         
     | 
| 
      
 441 
     | 
    
         
            +
                  });
         
     | 
| 
      
 442 
     | 
    
         
            +
                return keys;
         
     | 
| 
      
 443 
     | 
    
         
            +
              };
         
     | 
| 
      
 444 
     | 
    
         
            +
             
     | 
| 
      
 445 
     | 
    
         
            +
             
     | 
| 
      
 446 
     | 
    
         
            +
              /**
         
     | 
| 
      
 447 
     | 
    
         
            +
               * Returns array of all the data in the nodes
         
     | 
| 
      
 448 
     | 
    
         
            +
               * @return {Array<Value>}
         
     | 
| 
      
 449 
     | 
    
         
            +
               */
         
     | 
| 
      
 450 
     | 
    
         
            +
              Tree.prototype.values = function values () {
         
     | 
| 
      
 451 
     | 
    
         
            +
                var values = [];
         
     | 
| 
      
 452 
     | 
    
         
            +
                this.forEach(function (ref) {
         
     | 
| 
      
 453 
     | 
    
         
            +
                    var data = ref.data;
         
     | 
| 
      
 454 
     | 
    
         
            +
             
     | 
| 
      
 455 
     | 
    
         
            +
                    return values.push(data);
         
     | 
| 
      
 456 
     | 
    
         
            +
                  });
         
     | 
| 
      
 457 
     | 
    
         
            +
                return values;
         
     | 
| 
      
 458 
     | 
    
         
            +
              };
         
     | 
| 
      
 459 
     | 
    
         
            +
             
     | 
| 
      
 460 
     | 
    
         
            +
             
     | 
| 
      
 461 
     | 
    
         
            +
              /**
         
     | 
| 
      
 462 
     | 
    
         
            +
               * @return {Key|null}
         
     | 
| 
      
 463 
     | 
    
         
            +
               */
         
     | 
| 
      
 464 
     | 
    
         
            +
              Tree.prototype.min = function min () {
         
     | 
| 
      
 465 
     | 
    
         
            +
                if (this._root) { return this.minNode(this._root).key; }
         
     | 
| 
      
 466 
     | 
    
         
            +
                return null;
         
     | 
| 
      
 467 
     | 
    
         
            +
              };
         
     | 
| 
      
 468 
     | 
    
         
            +
             
     | 
| 
      
 469 
     | 
    
         
            +
             
     | 
| 
      
 470 
     | 
    
         
            +
              /**
         
     | 
| 
      
 471 
     | 
    
         
            +
               * @return {Key|null}
         
     | 
| 
      
 472 
     | 
    
         
            +
               */
         
     | 
| 
      
 473 
     | 
    
         
            +
              Tree.prototype.max = function max () {
         
     | 
| 
      
 474 
     | 
    
         
            +
                if (this._root) { return this.maxNode(this._root).key; }
         
     | 
| 
      
 475 
     | 
    
         
            +
                return null;
         
     | 
| 
      
 476 
     | 
    
         
            +
              };
         
     | 
| 
      
 477 
     | 
    
         
            +
             
     | 
| 
      
 478 
     | 
    
         
            +
             
     | 
| 
      
 479 
     | 
    
         
            +
              /**
         
     | 
| 
      
 480 
     | 
    
         
            +
               * @return {Node|null}
         
     | 
| 
      
 481 
     | 
    
         
            +
               */
         
     | 
| 
      
 482 
     | 
    
         
            +
              Tree.prototype.minNode = function minNode (t) {
         
     | 
| 
      
 483 
     | 
    
         
            +
                  if ( t === void 0 ) t = this._root;
         
     | 
| 
      
 484 
     | 
    
         
            +
             
     | 
| 
      
 485 
     | 
    
         
            +
                if (t) { while (t.left) { t = t.left; } }
         
     | 
| 
      
 486 
     | 
    
         
            +
                return t;
         
     | 
| 
      
 487 
     | 
    
         
            +
              };
         
     | 
| 
      
 488 
     | 
    
         
            +
             
     | 
| 
      
 489 
     | 
    
         
            +
             
     | 
| 
      
 490 
     | 
    
         
            +
              /**
         
     | 
| 
      
 491 
     | 
    
         
            +
               * @return {Node|null}
         
     | 
| 
      
 492 
     | 
    
         
            +
               */
         
     | 
| 
      
 493 
     | 
    
         
            +
              Tree.prototype.maxNode = function maxNode (t) {
         
     | 
| 
      
 494 
     | 
    
         
            +
                  if ( t === void 0 ) t = this._root;
         
     | 
| 
      
 495 
     | 
    
         
            +
             
     | 
| 
      
 496 
     | 
    
         
            +
                if (t) { while (t.right) { t = t.right; } }
         
     | 
| 
      
 497 
     | 
    
         
            +
                return t;
         
     | 
| 
      
 498 
     | 
    
         
            +
              };
         
     | 
| 
      
 499 
     | 
    
         
            +
             
     | 
| 
      
 500 
     | 
    
         
            +
             
     | 
| 
      
 501 
     | 
    
         
            +
              /**
         
     | 
| 
      
 502 
     | 
    
         
            +
               * Returns node at given index
         
     | 
| 
      
 503 
     | 
    
         
            +
               * @param{number} index
         
     | 
| 
      
 504 
     | 
    
         
            +
               * @return {?Node}
         
     | 
| 
      
 505 
     | 
    
         
            +
               */
         
     | 
| 
      
 506 
     | 
    
         
            +
              Tree.prototype.at = function at (index) {
         
     | 
| 
      
 507 
     | 
    
         
            +
                var current = this._root, done = false, i = 0;
         
     | 
| 
      
 508 
     | 
    
         
            +
                var Q = [];
         
     | 
| 
      
 509 
     | 
    
         
            +
             
     | 
| 
      
 510 
     | 
    
         
            +
                while (!done) {
         
     | 
| 
      
 511 
     | 
    
         
            +
                  if (current) {
         
     | 
| 
      
 512 
     | 
    
         
            +
                    Q.push(current);
         
     | 
| 
      
 513 
     | 
    
         
            +
                    current = current.left;
         
     | 
| 
      
 514 
     | 
    
         
            +
                  } else {
         
     | 
| 
      
 515 
     | 
    
         
            +
                    if (Q.length > 0) {
         
     | 
| 
      
 516 
     | 
    
         
            +
                      current = Q.pop();
         
     | 
| 
      
 517 
     | 
    
         
            +
                      if (i === index) { return current; }
         
     | 
| 
      
 518 
     | 
    
         
            +
                      i++;
         
     | 
| 
      
 519 
     | 
    
         
            +
                      current = current.right;
         
     | 
| 
      
 520 
     | 
    
         
            +
                    } else { done = true; }
         
     | 
| 
      
 521 
     | 
    
         
            +
                  }
         
     | 
| 
      
 522 
     | 
    
         
            +
                }
         
     | 
| 
      
 523 
     | 
    
         
            +
                return null;
         
     | 
| 
      
 524 
     | 
    
         
            +
              };
         
     | 
| 
      
 525 
     | 
    
         
            +
             
     | 
| 
      
 526 
     | 
    
         
            +
             
     | 
| 
      
 527 
     | 
    
         
            +
              /**
         
     | 
| 
      
 528 
     | 
    
         
            +
               * @param{Node} d
         
     | 
| 
      
 529 
     | 
    
         
            +
               * @return {Node|null}
         
     | 
| 
      
 530 
     | 
    
         
            +
               */
         
     | 
| 
      
 531 
     | 
    
         
            +
              Tree.prototype.next = function next (d) {
         
     | 
| 
      
 532 
     | 
    
         
            +
                var root = this._root;
         
     | 
| 
      
 533 
     | 
    
         
            +
                var successor = null;
         
     | 
| 
      
 534 
     | 
    
         
            +
             
     | 
| 
      
 535 
     | 
    
         
            +
                if (d.right) {
         
     | 
| 
      
 536 
     | 
    
         
            +
                  successor = d.right;
         
     | 
| 
      
 537 
     | 
    
         
            +
                  while (successor.left) { successor = successor.left; }
         
     | 
| 
      
 538 
     | 
    
         
            +
                  return successor;
         
     | 
| 
      
 539 
     | 
    
         
            +
                }
         
     | 
| 
      
 540 
     | 
    
         
            +
             
     | 
| 
      
 541 
     | 
    
         
            +
                var comparator = this._comparator;
         
     | 
| 
      
 542 
     | 
    
         
            +
                while (root) {
         
     | 
| 
      
 543 
     | 
    
         
            +
                  var cmp = comparator(d.key, root.key);
         
     | 
| 
      
 544 
     | 
    
         
            +
                  if (cmp === 0) { break; }
         
     | 
| 
      
 545 
     | 
    
         
            +
                  else if (cmp < 0) {
         
     | 
| 
      
 546 
     | 
    
         
            +
                    successor = root;
         
     | 
| 
      
 547 
     | 
    
         
            +
                    root = root.left;
         
     | 
| 
      
 548 
     | 
    
         
            +
                  } else { root = root.right; }
         
     | 
| 
      
 549 
     | 
    
         
            +
                }
         
     | 
| 
      
 550 
     | 
    
         
            +
             
     | 
| 
      
 551 
     | 
    
         
            +
                return successor;
         
     | 
| 
      
 552 
     | 
    
         
            +
              };
         
     | 
| 
      
 553 
     | 
    
         
            +
             
     | 
| 
      
 554 
     | 
    
         
            +
             
     | 
| 
      
 555 
     | 
    
         
            +
              /**
         
     | 
| 
      
 556 
     | 
    
         
            +
               * @param{Node} d
         
     | 
| 
      
 557 
     | 
    
         
            +
               * @return {Node|null}
         
     | 
| 
      
 558 
     | 
    
         
            +
               */
         
     | 
| 
      
 559 
     | 
    
         
            +
              Tree.prototype.prev = function prev (d) {
         
     | 
| 
      
 560 
     | 
    
         
            +
                var root = this._root;
         
     | 
| 
      
 561 
     | 
    
         
            +
                var predecessor = null;
         
     | 
| 
      
 562 
     | 
    
         
            +
             
     | 
| 
      
 563 
     | 
    
         
            +
                if (d.left !== null) {
         
     | 
| 
      
 564 
     | 
    
         
            +
                  predecessor = d.left;
         
     | 
| 
      
 565 
     | 
    
         
            +
                  while (predecessor.right) { predecessor = predecessor.right; }
         
     | 
| 
      
 566 
     | 
    
         
            +
                  return predecessor;
         
     | 
| 
      
 567 
     | 
    
         
            +
                }
         
     | 
| 
      
 568 
     | 
    
         
            +
             
     | 
| 
      
 569 
     | 
    
         
            +
                var comparator = this._comparator;
         
     | 
| 
      
 570 
     | 
    
         
            +
                while (root) {
         
     | 
| 
      
 571 
     | 
    
         
            +
                  var cmp = comparator(d.key, root.key);
         
     | 
| 
      
 572 
     | 
    
         
            +
                  if (cmp === 0) { break; }
         
     | 
| 
      
 573 
     | 
    
         
            +
                  else if (cmp < 0) { root = root.left; }
         
     | 
| 
      
 574 
     | 
    
         
            +
                  else {
         
     | 
| 
      
 575 
     | 
    
         
            +
                    predecessor = root;
         
     | 
| 
      
 576 
     | 
    
         
            +
                    root = root.right;
         
     | 
| 
      
 577 
     | 
    
         
            +
                  }
         
     | 
| 
      
 578 
     | 
    
         
            +
                }
         
     | 
| 
      
 579 
     | 
    
         
            +
                return predecessor;
         
     | 
| 
      
 580 
     | 
    
         
            +
              };
         
     | 
| 
      
 581 
     | 
    
         
            +
             
     | 
| 
      
 582 
     | 
    
         
            +
             
     | 
| 
      
 583 
     | 
    
         
            +
              /**
         
     | 
| 
      
 584 
     | 
    
         
            +
               * @return {SplayTree}
         
     | 
| 
      
 585 
     | 
    
         
            +
               */
         
     | 
| 
      
 586 
     | 
    
         
            +
              Tree.prototype.clear = function clear () {
         
     | 
| 
      
 587 
     | 
    
         
            +
                this._root = null;
         
     | 
| 
      
 588 
     | 
    
         
            +
                this._size = 0;
         
     | 
| 
      
 589 
     | 
    
         
            +
                return this;
         
     | 
| 
      
 590 
     | 
    
         
            +
              };
         
     | 
| 
      
 591 
     | 
    
         
            +
             
     | 
| 
      
 592 
     | 
    
         
            +
             
     | 
| 
      
 593 
     | 
    
         
            +
              /**
         
     | 
| 
      
 594 
     | 
    
         
            +
               * @return {NodeList}
         
     | 
| 
      
 595 
     | 
    
         
            +
               */
         
     | 
| 
      
 596 
     | 
    
         
            +
              Tree.prototype.toList = function toList$1 () {
         
     | 
| 
      
 597 
     | 
    
         
            +
                return toList(this._root);
         
     | 
| 
      
 598 
     | 
    
         
            +
              };
         
     | 
| 
      
 599 
     | 
    
         
            +
             
     | 
| 
      
 600 
     | 
    
         
            +
             
     | 
| 
      
 601 
     | 
    
         
            +
              /**
         
     | 
| 
      
 602 
     | 
    
         
            +
               * Bulk-load items. Both array have to be same size
         
     | 
| 
      
 603 
     | 
    
         
            +
               * @param{Array<Key>}  keys
         
     | 
| 
      
 604 
     | 
    
         
            +
               * @param{Array<Value>}[values]
         
     | 
| 
      
 605 
     | 
    
         
            +
               * @param{Boolean}     [presort=false] Pre-sort keys and values, using
         
     | 
| 
      
 606 
     | 
    
         
            +
               *                                       tree's comparator. Sorting is done
         
     | 
| 
      
 607 
     | 
    
         
            +
               *                                       in-place
         
     | 
| 
      
 608 
     | 
    
         
            +
               * @return {AVLTree}
         
     | 
| 
      
 609 
     | 
    
         
            +
               */
         
     | 
| 
      
 610 
     | 
    
         
            +
              Tree.prototype.load = function load (keys, values, presort) {
         
     | 
| 
      
 611 
     | 
    
         
            +
                  if ( keys === void 0 ) keys = [];
         
     | 
| 
      
 612 
     | 
    
         
            +
                  if ( values === void 0 ) values = [];
         
     | 
| 
      
 613 
     | 
    
         
            +
                  if ( presort === void 0 ) presort = false;
         
     | 
| 
      
 614 
     | 
    
         
            +
             
     | 
| 
      
 615 
     | 
    
         
            +
                var size = keys.length;
         
     | 
| 
      
 616 
     | 
    
         
            +
                var comparator = this._comparator;
         
     | 
| 
      
 617 
     | 
    
         
            +
             
     | 
| 
      
 618 
     | 
    
         
            +
                // sort if needed
         
     | 
| 
      
 619 
     | 
    
         
            +
                if (presort) { sort(keys, values, 0, size - 1, comparator); }
         
     | 
| 
      
 620 
     | 
    
         
            +
             
     | 
| 
      
 621 
     | 
    
         
            +
                if (this._root === null) { // empty tree
         
     | 
| 
      
 622 
     | 
    
         
            +
                  this._root = loadRecursive(this._root, keys, values, 0, size);
         
     | 
| 
      
 623 
     | 
    
         
            +
                  this._size = size;
         
     | 
| 
      
 624 
     | 
    
         
            +
                } else { // that re-builds the whole tree from two in-order traversals
         
     | 
| 
      
 625 
     | 
    
         
            +
                  var mergedList = mergeLists(this.toList(), createList(keys, values), comparator);
         
     | 
| 
      
 626 
     | 
    
         
            +
                  size = this._size + size;
         
     | 
| 
      
 627 
     | 
    
         
            +
                  this._root = sortedListToBST({ head: mergedList }, 0, size);
         
     | 
| 
      
 628 
     | 
    
         
            +
                }
         
     | 
| 
      
 629 
     | 
    
         
            +
                return this;
         
     | 
| 
      
 630 
     | 
    
         
            +
              };
         
     | 
| 
      
 631 
     | 
    
         
            +
             
     | 
| 
      
 632 
     | 
    
         
            +
             
     | 
| 
      
 633 
     | 
    
         
            +
              /**
         
     | 
| 
      
 634 
     | 
    
         
            +
               * @return {Boolean}
         
     | 
| 
      
 635 
     | 
    
         
            +
               */
         
     | 
| 
      
 636 
     | 
    
         
            +
              Tree.prototype.isEmpty = function isEmpty () { return this._root === null; };
         
     | 
| 
      
 637 
     | 
    
         
            +
             
     | 
| 
      
 638 
     | 
    
         
            +
              prototypeAccessors.size.get = function () { return this._size; };
         
     | 
| 
      
 639 
     | 
    
         
            +
             
     | 
| 
      
 640 
     | 
    
         
            +
             
     | 
| 
      
 641 
     | 
    
         
            +
              /**
         
     | 
| 
      
 642 
     | 
    
         
            +
               * @param{NodePrinter=} printNode
         
     | 
| 
      
 643 
     | 
    
         
            +
               * @return {String}
         
     | 
| 
      
 644 
     | 
    
         
            +
               */
         
     | 
| 
      
 645 
     | 
    
         
            +
              Tree.prototype.toString = function toString (printNode) {
         
     | 
| 
      
 646 
     | 
    
         
            +
                  if ( printNode === void 0 ) printNode = function (n) { return n.key; };
         
     | 
| 
      
 647 
     | 
    
         
            +
             
     | 
| 
      
 648 
     | 
    
         
            +
                var out = [];
         
     | 
| 
      
 649 
     | 
    
         
            +
                printRow(this._root, '', true, function (v) { return out.push(v); }, printNode);
         
     | 
| 
      
 650 
     | 
    
         
            +
                return out.join('');
         
     | 
| 
      
 651 
     | 
    
         
            +
              };
         
     | 
| 
      
 652 
     | 
    
         
            +
             
     | 
| 
      
 653 
     | 
    
         
            +
             
     | 
| 
      
 654 
     | 
    
         
            +
              Tree.prototype.update = function update (key, newKey, newData) {
         
     | 
| 
      
 655 
     | 
    
         
            +
                var comparator = this._comparator;
         
     | 
| 
      
 656 
     | 
    
         
            +
                var ref = split(key, this._root, comparator);
         
     | 
| 
      
 657 
     | 
    
         
            +
                  var left = ref.left;
         
     | 
| 
      
 658 
     | 
    
         
            +
                  var right = ref.right;
         
     | 
| 
      
 659 
     | 
    
         
            +
                this._size--;
         
     | 
| 
      
 660 
     | 
    
         
            +
                if (comparator(key, newKey) < 0) {
         
     | 
| 
      
 661 
     | 
    
         
            +
                  right = insert(newKey, newData, right, comparator, this);
         
     | 
| 
      
 662 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 663 
     | 
    
         
            +
                  left = insert(newKey, newData, left, comparator, this);
         
     | 
| 
      
 664 
     | 
    
         
            +
                }
         
     | 
| 
      
 665 
     | 
    
         
            +
                this._root = merge(left, right, comparator);
         
     | 
| 
      
 666 
     | 
    
         
            +
              };
         
     | 
| 
      
 667 
     | 
    
         
            +
             
     | 
| 
      
 668 
     | 
    
         
            +
             
     | 
| 
      
 669 
     | 
    
         
            +
              Tree.prototype.split = function split$1 (key) {
         
     | 
| 
      
 670 
     | 
    
         
            +
                return split(key, this._root, this._comparator);
         
     | 
| 
      
 671 
     | 
    
         
            +
              };
         
     | 
| 
      
 672 
     | 
    
         
            +
             
     | 
| 
      
 673 
     | 
    
         
            +
              Object.defineProperties( Tree.prototype, prototypeAccessors );
         
     | 
| 
      
 674 
     | 
    
         
            +
             
     | 
| 
      
 675 
     | 
    
         
            +
             
     | 
| 
      
 676 
     | 
    
         
            +
              function loadRecursive (parent, keys, values, start, end) {
         
     | 
| 
      
 677 
     | 
    
         
            +
                var size = end - start;
         
     | 
| 
      
 678 
     | 
    
         
            +
                if (size > 0) {
         
     | 
| 
      
 679 
     | 
    
         
            +
                  var middle = start + Math.floor(size / 2);
         
     | 
| 
      
 680 
     | 
    
         
            +
                  var key    = keys[middle];
         
     | 
| 
      
 681 
     | 
    
         
            +
                  var data   = values[middle];
         
     | 
| 
      
 682 
     | 
    
         
            +
                  var node   = { key: key, data: data, parent: parent };
         
     | 
| 
      
 683 
     | 
    
         
            +
                  node.left    = loadRecursive(node, keys, values, start, middle);
         
     | 
| 
      
 684 
     | 
    
         
            +
                  node.right   = loadRecursive(node, keys, values, middle + 1, end);
         
     | 
| 
      
 685 
     | 
    
         
            +
                  return node;
         
     | 
| 
      
 686 
     | 
    
         
            +
                }
         
     | 
| 
      
 687 
     | 
    
         
            +
                return null;
         
     | 
| 
      
 688 
     | 
    
         
            +
              }
         
     | 
| 
      
 689 
     | 
    
         
            +
             
     | 
| 
      
 690 
     | 
    
         
            +
             
     | 
| 
      
 691 
     | 
    
         
            +
              function createList(keys, values) {
         
     | 
| 
      
 692 
     | 
    
         
            +
                var head = { next: null };
         
     | 
| 
      
 693 
     | 
    
         
            +
                var p = head;
         
     | 
| 
      
 694 
     | 
    
         
            +
                for (var i = 0; i < keys.length; i++) {
         
     | 
| 
      
 695 
     | 
    
         
            +
                  p = p.next = { key: keys[i], data: values[i] };
         
     | 
| 
      
 696 
     | 
    
         
            +
                }
         
     | 
| 
      
 697 
     | 
    
         
            +
                p.next = null;
         
     | 
| 
      
 698 
     | 
    
         
            +
                return head.next;
         
     | 
| 
      
 699 
     | 
    
         
            +
              }
         
     | 
| 
      
 700 
     | 
    
         
            +
             
     | 
| 
      
 701 
     | 
    
         
            +
             
     | 
| 
      
 702 
     | 
    
         
            +
              function toList (root) {
         
     | 
| 
      
 703 
     | 
    
         
            +
                var current = root;
         
     | 
| 
      
 704 
     | 
    
         
            +
                var Q = [], done = false;
         
     | 
| 
      
 705 
     | 
    
         
            +
             
     | 
| 
      
 706 
     | 
    
         
            +
                var head = { next: null };
         
     | 
| 
      
 707 
     | 
    
         
            +
                var p = head;
         
     | 
| 
      
 708 
     | 
    
         
            +
             
     | 
| 
      
 709 
     | 
    
         
            +
                while (!done) {
         
     | 
| 
      
 710 
     | 
    
         
            +
                  if (current) {
         
     | 
| 
      
 711 
     | 
    
         
            +
                    Q.push(current);
         
     | 
| 
      
 712 
     | 
    
         
            +
                    current = current.left;
         
     | 
| 
      
 713 
     | 
    
         
            +
                  } else {
         
     | 
| 
      
 714 
     | 
    
         
            +
                    if (Q.length > 0) {
         
     | 
| 
      
 715 
     | 
    
         
            +
                      current = p = p.next = Q.pop();
         
     | 
| 
      
 716 
     | 
    
         
            +
                      current = current.right;
         
     | 
| 
      
 717 
     | 
    
         
            +
                    } else { done = true; }
         
     | 
| 
      
 718 
     | 
    
         
            +
                  }
         
     | 
| 
      
 719 
     | 
    
         
            +
                }
         
     | 
| 
      
 720 
     | 
    
         
            +
                p.next = null; // that'll work even if the tree was empty
         
     | 
| 
      
 721 
     | 
    
         
            +
                return head.next;
         
     | 
| 
      
 722 
     | 
    
         
            +
              }
         
     | 
| 
      
 723 
     | 
    
         
            +
             
     | 
| 
      
 724 
     | 
    
         
            +
             
     | 
| 
      
 725 
     | 
    
         
            +
              function sortedListToBST(list, start, end) {
         
     | 
| 
      
 726 
     | 
    
         
            +
                var size = end - start;
         
     | 
| 
      
 727 
     | 
    
         
            +
                if (size > 0) {
         
     | 
| 
      
 728 
     | 
    
         
            +
                  var middle = start + Math.floor(size / 2);
         
     | 
| 
      
 729 
     | 
    
         
            +
                  var left = sortedListToBST(list, start, middle);
         
     | 
| 
      
 730 
     | 
    
         
            +
             
     | 
| 
      
 731 
     | 
    
         
            +
                  var root = list.head;
         
     | 
| 
      
 732 
     | 
    
         
            +
                  root.left = left;
         
     | 
| 
      
 733 
     | 
    
         
            +
             
     | 
| 
      
 734 
     | 
    
         
            +
                  list.head = list.head.next;
         
     | 
| 
      
 735 
     | 
    
         
            +
             
     | 
| 
      
 736 
     | 
    
         
            +
                  root.right = sortedListToBST(list, middle + 1, end);
         
     | 
| 
      
 737 
     | 
    
         
            +
                  return root;
         
     | 
| 
      
 738 
     | 
    
         
            +
                }
         
     | 
| 
      
 739 
     | 
    
         
            +
                return null;
         
     | 
| 
      
 740 
     | 
    
         
            +
              }
         
     | 
| 
      
 741 
     | 
    
         
            +
             
     | 
| 
      
 742 
     | 
    
         
            +
             
     | 
| 
      
 743 
     | 
    
         
            +
              function mergeLists (l1, l2, compare) {
         
     | 
| 
      
 744 
     | 
    
         
            +
                if ( compare === void 0 ) compare = function (a, b) { return a - b; };
         
     | 
| 
      
 745 
     | 
    
         
            +
             
     | 
| 
      
 746 
     | 
    
         
            +
                var head = {}; // dummy
         
     | 
| 
      
 747 
     | 
    
         
            +
                var p = head;
         
     | 
| 
      
 748 
     | 
    
         
            +
             
     | 
| 
      
 749 
     | 
    
         
            +
                var p1 = l1;
         
     | 
| 
      
 750 
     | 
    
         
            +
                var p2 = l2;
         
     | 
| 
      
 751 
     | 
    
         
            +
             
     | 
| 
      
 752 
     | 
    
         
            +
                while (p1 !== null && p2 !== null) {
         
     | 
| 
      
 753 
     | 
    
         
            +
                  if (compare(p1.key, p2.key) < 0) {
         
     | 
| 
      
 754 
     | 
    
         
            +
                    p.next = p1;
         
     | 
| 
      
 755 
     | 
    
         
            +
                    p1 = p1.next;
         
     | 
| 
      
 756 
     | 
    
         
            +
                  } else {
         
     | 
| 
      
 757 
     | 
    
         
            +
                    p.next = p2;
         
     | 
| 
      
 758 
     | 
    
         
            +
                    p2 = p2.next;
         
     | 
| 
      
 759 
     | 
    
         
            +
                  }
         
     | 
| 
      
 760 
     | 
    
         
            +
                  p = p.next;
         
     | 
| 
      
 761 
     | 
    
         
            +
                }
         
     | 
| 
      
 762 
     | 
    
         
            +
             
     | 
| 
      
 763 
     | 
    
         
            +
                if (p1 !== null)      { p.next = p1; }
         
     | 
| 
      
 764 
     | 
    
         
            +
                else if (p2 !== null) { p.next = p2; }
         
     | 
| 
      
 765 
     | 
    
         
            +
             
     | 
| 
      
 766 
     | 
    
         
            +
                return head.next;
         
     | 
| 
      
 767 
     | 
    
         
            +
              }
         
     | 
| 
      
 768 
     | 
    
         
            +
             
     | 
| 
      
 769 
     | 
    
         
            +
             
     | 
| 
      
 770 
     | 
    
         
            +
              function sort(keys, values, left, right, compare) {
         
     | 
| 
      
 771 
     | 
    
         
            +
                if (left >= right) { return; }
         
     | 
| 
      
 772 
     | 
    
         
            +
             
     | 
| 
      
 773 
     | 
    
         
            +
                var pivot = keys[(left + right) >> 1];
         
     | 
| 
      
 774 
     | 
    
         
            +
                var i = left - 1;
         
     | 
| 
      
 775 
     | 
    
         
            +
                var j = right + 1;
         
     | 
| 
      
 776 
     | 
    
         
            +
             
     | 
| 
      
 777 
     | 
    
         
            +
                while (true) {
         
     | 
| 
      
 778 
     | 
    
         
            +
                  do { i++; } while (compare(keys[i], pivot) < 0);
         
     | 
| 
      
 779 
     | 
    
         
            +
                  do { j--; } while (compare(keys[j], pivot) > 0);
         
     | 
| 
      
 780 
     | 
    
         
            +
                  if (i >= j) { break; }
         
     | 
| 
      
 781 
     | 
    
         
            +
             
     | 
| 
      
 782 
     | 
    
         
            +
                  var tmp = keys[i];
         
     | 
| 
      
 783 
     | 
    
         
            +
                  keys[i] = keys[j];
         
     | 
| 
      
 784 
     | 
    
         
            +
                  keys[j] = tmp;
         
     | 
| 
      
 785 
     | 
    
         
            +
             
     | 
| 
      
 786 
     | 
    
         
            +
                  tmp = values[i];
         
     | 
| 
      
 787 
     | 
    
         
            +
                  values[i] = values[j];
         
     | 
| 
      
 788 
     | 
    
         
            +
                  values[j] = tmp;
         
     | 
| 
      
 789 
     | 
    
         
            +
                }
         
     | 
| 
      
 790 
     | 
    
         
            +
             
     | 
| 
      
 791 
     | 
    
         
            +
                sort(keys, values,  left,     j, compare);
         
     | 
| 
      
 792 
     | 
    
         
            +
                sort(keys, values, j + 1, right, compare);
         
     | 
| 
      
 793 
     | 
    
         
            +
              }
         
     | 
| 
      
 794 
     | 
    
         
            +
             
     | 
| 
      
 795 
     | 
    
         
            +
              return Tree;
         
     | 
| 
      
 796 
     | 
    
         
            +
             
     | 
| 
      
 797 
     | 
    
         
            +
            })));
         
     |