mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-18 10:36:22 +08:00
47 lines
817 B
TypeScript
47 lines
817 B
TypeScript
import type { MindmapNode } from './mindmap.js';
|
|
|
|
export function findInfiniteLoop(
|
|
root: MindmapNode,
|
|
nodeMap: Map<string, MindmapNode>
|
|
) {
|
|
const visited = new Set<string>();
|
|
const loop: {
|
|
detached: boolean;
|
|
chain: MindmapNode[];
|
|
}[] = [];
|
|
|
|
const traverse = (
|
|
node: MindmapNode,
|
|
traverseChain: MindmapNode[] = [],
|
|
detached = false
|
|
) => {
|
|
if (visited.has(node.id)) {
|
|
loop.push({
|
|
detached,
|
|
chain: traverseChain,
|
|
});
|
|
return;
|
|
}
|
|
|
|
visited.add(node.id);
|
|
|
|
traverseChain.push(node);
|
|
|
|
node.children.forEach(child =>
|
|
traverse(child, traverseChain.slice(), detached)
|
|
);
|
|
};
|
|
|
|
traverse(root);
|
|
|
|
nodeMap.forEach(node => {
|
|
if (visited.has(node.id)) {
|
|
return;
|
|
}
|
|
|
|
traverse(node, [], true);
|
|
});
|
|
|
|
return loop;
|
|
}
|