Empty children and Clojure zippers -
why last expression retruns
{:a :foo, :args [{:id :xx}], :id :xx}
instead of:
{:a :foo, :args [], :id :xx}
(require '[clojure.zip :as zip]) (defn my-zipper [tree] (zip/zipper (fn branch? [node] (:args node)) (fn children [node] (:args node)) (fn make-node [node children] (assoc node :args (vec children))) tree)) (def z (my-zipper {:a :foo :args []})) (loop [loc z] (if (zip/end? loc) (zip/node loc) (recur (zip/next (zip/edit loc #(assoc % :id :xx)))))) it looks problem associated fact traversing zip/next reveals there 2 nodes :
(zip/node (zip/next z)) ; => nil (zip/node (zip/next (zip/next z))) ; => {:a :foo :args []} why that? there single node empty children there should 1 node, correct?
after looking @ code of clojure.zip/vector-zip conclude lack of node's children should communicated nil. empty sequence doesn't work. children function should be:
(fn children [node] (seq (:args node)))
Comments
Post a Comment