processNodes method
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;
}