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