_crawlNetwork(callback = function () {}, startingNodeId) {
    const progress = {};

    const crawler = (node, tree) => {
      if (progress[node.id] === undefined) {
        this.hierarchical.setTreeIndex(node, tree);

        progress[node.id] = true;
        let childNode;
        const edges = this._getActiveEdges(node);
        for (let i = 0; i < edges.length; i++) {
          const edge = edges[i];
          if (edge.connected === true) {
            if (edge.toId == node.id) {
              // Not '===' because id's can be string and numeric
              childNode = edge.from;
            } else {
              childNode = edge.to;
            }

            if (node.id != childNode.id) {
              // Not '!==' because id's can be string and numeric
              callback(node, childNode, edge);
              crawler(childNode, tree);
            }
          }
        }
      }
    };

    if (startingNodeId === undefined) {
      // Crawl over all nodes
      let treeIndex = 0; // Serves to pass a unique id for the current distinct tree

      for (let i = 0; i < this.body.nodeIndices.length; i++) {
        const nodeId = this.body.nodeIndices[i];

        if (progress[nodeId] === undefined) {
          const node = this.body.nodes[nodeId];
          crawler(node, treeIndex);
          treeIndex += 1;
        }
      }
    } else {
      // Crawl from the given starting node
      const node = this.body.nodes[startingNodeId];
      if (node === undefined) {
        console.error("Node not found:", startingNodeId);
        return;
      }
      crawler(node);
    }
  }
Crawl over the entire network and use a callback on each node couple that is connected to each other.
@param {Function} [callback]          | will receive nodeA, nodeB and the connecting edge. A and B are distinct.
@param {Node.id} startingNodeId
@private