processNodes method

Map<int, ProcessedNode> processNodes(
  1. AnimationState animation
)

Implementation

Map<int, ProcessedNode> processNodes(AnimationState animation) {
  final processedNodes = <int, ProcessedNode>{};

  final inDegree = <int, int>{};
  final adjacencyMap = <int, Set<int>>{};

  for (final node in nodes.values) {
    final idx = node.nodeIndex;
    final deps = node.dependencies;
    inDegree[idx] = deps.length;
    for (final dep in deps) {
      (adjacencyMap[dep] ??= {}).add(idx);
    }
  }

  final queue = Queue<int>.from(
    nodes.values.map((e) => e.nodeIndex).where((e) => inDegree[e] == 0),
  );

  while (queue.isNotEmpty) {
    final idx = queue.removeFirst();
    final node = nodes[idx]!;
    node.processNode(processedNodes, animation);
    final adjacency = adjacencyMap[idx] ?? {};
    for (final dep in adjacency) {
      inDegree[dep] = inDegree[dep]! - 1;
      if (inDegree[dep] == 0) {
        queue.add(dep);
      }
    }
  }

  if (processedNodes.length != nodes.length) {
    throw StateError('Failed to process all nodes');
  }

  return processedNodes;
}