private static computeXPositions()

in src/sankeyDiagram.ts [1172:1222]


    private static computeXPositions(sankeyDiagramDataView: SankeyDiagramDataView): number {
        let nodes: SankeyDiagramNode[] = sankeyDiagramDataView.nodes,
            nextNodes: SankeyDiagramNode[] = [],
            previousNodes: SankeyDiagramNode[] = [],
            x: number = SankeyDiagram.DefaultPosition,
            isRecursiveDependencies: boolean = false;

        while (nodes.length > 0) {
            nextNodes = [];

            nodes.forEach((node: SankeyDiagramNode) => {
                node.x = x;

                // put all output nodes from current node to nextNodes
                node.links.forEach((link: SankeyDiagramLink) => {
                    if (node === link.source && node !== link.destination) {
                        if (nextNodes.every((item: SankeyDiagramNode) => {
                            return item !== link.destination;
                        })) {
                            nextNodes.push(link.destination);
                        }
                    }
                });
            });

            isRecursiveDependencies = nextNodes.length === previousNodes.length &&
                previousNodes.every((previousNode: SankeyDiagramNode) => {
                    return nextNodes.some((nextNode: SankeyDiagramNode) => {
                        return nextNode === previousNode;
                    });
                });

            if (isRecursiveDependencies) {
                previousNodes.forEach((element: SankeyDiagramNode) => {
                    element.x = x;

                    x++;
                });

                nodes = [];
            } else {
                nodes = nextNodes;

                previousNodes = nodes;

                x++;
            }
        }

        return x - SankeyDiagram.DefaultXOffset;
    }