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;
}