private processCyclesForwardLinks()

in src/sankeyDiagram.ts [639:678]


    private processCyclesForwardLinks(cycles: SankeyDiagramCycleDictionary, nodes: SankeyDiagramNode[], links: SankeyDiagramLink[], settings: SankeyDiagramSettings): SankeyDiagramLink[] {
        let createdNodes: SankeyDiagramNode[] = [];
        for (let nodeName of Object.keys(cycles)) {
            let firstCyclesNode: SankeyDiagramNode = cycles[nodeName][cycles[nodeName].length - 1];
            // create a clone of the node and save a link to each other. In selection behavior, selection of clone lead to select original and visa versa
            let nodeCopy: SankeyDiagramNode = _.cloneDeep(firstCyclesNode);
            nodeCopy.label.name += SankeyDiagram.DuplicatedNamePostfix;
            firstCyclesNode.cloneLink = nodeCopy;
            nodeCopy.cloneLink = firstCyclesNode;

            // copy only! output links to new node;
            nodeCopy.links = firstCyclesNode.links.filter((link: SankeyDiagramLink) => {
                if (link.source === firstCyclesNode || link.source === link.destination) {
                    return true;
                }
                return false;
            });
            nodeCopy.links.forEach((link: SankeyDiagramLink) => {
                link.source = nodeCopy;
            });

            // remove output links from original node
            firstCyclesNode.links = firstCyclesNode.links.filter((link: SankeyDiagramLink) => {
                if (link.destination === firstCyclesNode || link.destination === link.source) {
                    return true;
                }

                return false;
            });

            SankeyDiagram.updateValueOfNode(firstCyclesNode);
            SankeyDiagram.updateValueOfNode(nodeCopy);
            SankeyDiagram.fixLinksCount(firstCyclesNode);
            SankeyDiagram.fixLinksCount(nodeCopy);
            nodes.push(nodeCopy);
            createdNodes.push(nodeCopy);
        }

        return links;
    }