addEdge method
void
addEdge(
- Node parent,
- Node child
)
override
Implementation
@override
void addEdge(Node parent, Node child) {
if (parent == child) {
throw StateError('Cannot add self-referencing edge');
}
if (!containsNode(parent.key)) {
addNode(parent);
}
if (!containsNode(child.key)) {
addNode(child);
}
final existingParent = getNodeParent(child);
if (existingParent != null) {
throw StateError(
'Node "${child.key}" already has a parent "${existingParent.key}"',
);
}
// Проверяем, не создаст ли новое ребро цикл
if (_wouldCreateCycle(parent, child)) {
throw StateError('Cannot create cycle');
}
_parents[child] = parent;
final childSet = _edges.putIfAbsent(parent, () => <Node>{});
childSet.add(child);
_invalidateCache();
}