package workflow // Splits a flat map representing a graph's parent > children relationships // into an ordered slice of levels. func SplitFlatTreeIntoGroups(flatTree map[string][]string) [][]string { type TreeNode struct { name string level int } nodes := map[string]TreeNode{} deepestLevel := 0 next := []string{""} for len(next) > 0 { current := next[0] next = next[1:] children := flatTree[current] currentNode, found := nodes[current] // The negative value represents the graph root. currentLevel := -1 if found { currentLevel = currentNode.level } for _, child := range children { nodes[child] = TreeNode{ name: child, level: currentLevel + 1, } } if deepestLevel < currentLevel { deepestLevel = currentLevel } next = append(next, children...) } levels := make([][]string, deepestLevel+1) for _, node := range nodes { levels[node.level] = append(levels[node.level], node.name) } return levels }