File size: 977 Bytes
f909d7c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
import { NodeData, EdgeData } from "src/types/graph";
type Outgoers = [NodeData[], string[]];
export const getOutgoers = (
nodeId: string,
nodes: NodeData[],
edges: EdgeData[],
parent: string[] = []
): Outgoers => {
const outgoerNodes: NodeData[] = [];
const matchingNodes: string[] = [];
if (parent.includes(nodeId)) {
const initialParentNode = nodes.find(n => n.id === nodeId);
if (initialParentNode) outgoerNodes.push(initialParentNode);
}
const findOutgoers = (currentNodeId: string) => {
const outgoerIds = edges.filter(e => e.from === currentNodeId).map(e => e.to);
const nodeList = nodes.filter(n => {
if (parent.includes(n.id) && !matchingNodes.includes(n.id)) matchingNodes.push(n.id);
return outgoerIds.includes(n.id) && !parent.includes(n.id);
});
outgoerNodes.push(...nodeList);
nodeList.forEach(node => findOutgoers(node.id));
};
findOutgoers(nodeId);
return [outgoerNodes, matchingNodes];
};
|