嵌套映射到表示Clojure中边的元组序列

Dav*_*ked 2 tree traversal graph clojure

如何在惯用的Clojure中表达以下转变?

(def m
     {:a {:b {:c nil
              :d nil}}
          :e nil}})


(map->edges m) ; =>


([:a :b] [:b :c] [:b :d] [:e nil] [:d nil] [:a :e] [:e nil])
Run Code Online (Sandbox Code Playgroud)

我不关心向量在结果中出现的顺序,因此深度优先或先呼吸搜索策略都可以.

Sam*_*tep 8

您可以使用for和简洁地表达这一点tree-seq:

(defn map->edges [m]
  (for [entry m
        [x m] (tree-seq some? val entry)
        y (or (keys m) [m])]
    [x y]))
Run Code Online (Sandbox Code Playgroud)

例:

(map->edges m)
;;=> ([:a :b] [:a :e] [:b :c] [:b :d] [:c nil] [:d nil] [:e nil])
Run Code Online (Sandbox Code Playgroud)