flattenHierarchy function

List<(String, int)> flattenHierarchy(
  1. List<HierarchyUtils> nodes
)

Flattens tree: nodes has (id, parentId). Returns list of (id, level). Root level = 0.

Assumes an acyclic parent graph: a cycle among nodes causes unbounded recursion. Recursion depth equals the tree height.

Implementation

List<(String, int)> flattenHierarchy(List<HierarchyUtils> nodes) {
  final Map<String, String?> parent = {for (final n in nodes) n.id: n.parentId};
  final List<(String, int)> out = <(String, int)>[];
  void visit(String id, int level) {
    out.add((id, level));
    for (final MapEntry<String, String?> e in parent.entries) {
      if (e.value == id) visit(e.key, level + 1);
    }
  }

  for (final root in nodes) {
    if ((root.parentId ?? '').isEmpty) visit(root.id, 0);
  }
  return out;
}