flattenBy

fun <TNode> flattenBy(arr: List<TNode>, getChildren: (item: TNode) -> List<TNode>?): List<TNode>

Walks arr depth-first and returns every node together with each node's descendants. getChildren returns null (or an empty list) for leaf nodes.