code: function makeNBASearchStatePool() {
    var currentInCache = 0;
    var nodeCache = [];
  
    return {
      /**
       * Creates a new NBASearchState instance
       */
      createNewState: createNewState,
  
      /**
       * Marks all created instances available for recycling.
       */
      reset: reset
    };
  
    function reset() {
      currentInCache = 0;
    }
  
    function createNewState(node) {
      var cached = nodeCache[currentInCache];
      if (cached) {
        // TODO: This almost duplicates constructor code. Not sure if
        // it would impact performance if I move this code into a function
        cached.node = node;
  
        // How we came to this node?
        cached.p1 = null;
        cached.p2 = null;
  
        cached.closed = false;
  
        cached.g1 = Number.POSITIVE_INFINITY;
        cached.g2 = Number.POSITIVE_INFINITY;
        cached.f1 = Number.POSITIVE_INFINITY;
        cached.f2 = Number.POSITIVE_INFINITY;
  
        // used to reconstruct heap when fScore is updated.
        cached.h1 = -1;
        cached.h2 = -1;
      } else {
        cached = new NBASearchState(node);
        nodeCache[currentInCache] = cached;
      }
      currentInCache++;
      return cached;
    }
  }
docs: As path-finding is memory-intensive process, we want to reduce pressure on
  garbage collector. This class helps us to recycle path-finding nodes and significantly
  reduces the search time (~20% faster than without it).