addEdge method

  1. @override
void addEdge(
  1. Node parent,
  2. 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();
}