analyze method

Computes per-dependency graph metrics for nodes.

Implementation

Map<String, DependencyGraphMetrics> analyze(
    Map<String, DependencyNode> nodes) {
  final Map<String, Set<String>> reverse = <String, Set<String>>{};
  for (final DependencyNode node in nodes.values) {
    for (final String dep in node.dependencies) {
      reverse.putIfAbsent(dep, () => <String>{}).add(node.name);
    }
  }

  final Map<String, DependencyGraphMetrics> metrics =
      <String, DependencyGraphMetrics>{};
  for (final DependencyNode node in nodes.values) {
    final _TraversalResult traversal = _traverse(node.name, nodes);
    metrics[node.name] = DependencyGraphMetrics(
      maxDepth: traversal.maxDepth,
      transitiveCount: traversal.transitive.length,
      directDependents: reverse[node.name]?.length ?? 0,
      paths: traversal.paths,
      centrality:
          (reverse[node.name]?.length ?? 0) + (node.dependencies.length / 10),
    );
  }
  return metrics;
}