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 index = node.nodeIndex;
    final deps = node.dependencies;
    inDegree[index] = deps.length;
    for (final dep in deps) {
      (adjacencyMap[dep] ??= {}).add(index);
    }
  }

  final queue = Queue<int>.from(
    [
      for (final node in nodes.values)
        if (inDegree[node.nodeIndex] == 0) node.nodeIndex,
    ],
  );

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

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

  return processedNodes;
}