mergeNodes()

in src/models/GraphBundler.js [91:138]


  mergeNodes(nodes) {
    const newNode = Node.merge(nodes);
    newNode.id = this.nodes.length;
    this.nodes.push(newNode);
    nodes.forEach(n => { n.merged = true; });

    newNode.rightLinks = chain(nodes)
      .flatMap(n => n.rightLinks)
      .groupBy(l => l.target.id)
      .mapValues(links => {
        const target = links[0].target;
        target.leftLinks = target.leftLinks
          .filter(l => !l.source.merged);
        const link = new Link(
          newNode,
          links[0].target,
          sum(links.map(l => l.freq))
        );
        target.leftLinks.push(link);
        return link;
      })
      .values()
      .value();

    this.addLinks(newNode.rightLinks);

    newNode.leftLinks = chain(nodes)
      .flatMap(n => n.leftLinks)
      .groupBy(l => l.source.id)
      .mapValues(links => {
        const source = links[0].source;
        source.rightLinks = source.rightLinks
          .filter(l => !l.target.merged);
        const link = new Link(
          links[0].source,
          newNode,
          sum(links.map(l => l.freq))
        );
        source.rightLinks.push(link);
        return link;
      })
      .values()
      .value();

    this.addLinks(newNode.leftLinks);

    return newNode;
  }