6 ms·
In addition, clojure.core has the handy tree-seq function: (defn tree-seq "Returns a lazy sequence of the nodes in a tree, via a depth-first walk.
by nimih 1y ago
In addition, clojure.core has the handy tree-seq function:
(defn tree-seq
"Returns a lazy sequence of the nodes in a tree, via a depth-first walk.
branch? must be a fn of one arg that returns true if passed a node
that can have children (but may not). children must be a fn of one
arg that returns a sequence of the children. Will only be called on
nodes for which branch? returns true. Root is the root node of the
tree."
{:added "1.0"
:static true}
[branch? children root]
(let [walk (fn walk [node]
(lazy-seq
(cons node
(when (branch? node)
(mapcat walk (children node))))))]
(walk root)))
- Xmd5a 1y ago(defn tree-seq-breadth "Like tree-seq, but in breadth-first order" [branch? children root] (let [walk (fn walk [node] (when (branch? node) (let [cs (children node)] (lazy-cat cs (mapcat walk cs)))))] (cons root (walk root))))