jw
12/21/2017, 5:22 PMfun <T> T.recursiveFlatten(childSelector: (T) -> Iterable<T>): List<T> {
val list = mutableListOf<T>()
val queue = ArrayDeque<T>().apply { add(this@recursiveFlatten) }
while (queue.isNotEmpty()) {
val item = queue.removeFirst()
list.add(item)
queue.addAll(childSelector(item))
}
return list
}