Ah, sorry. You could use a map-tree instead. It is a bit more verbose, but I believe it does what you want.
(defn map-tree [root] (z/zipper map? #(seq (:cs %)) (fn [node children] (assoc node :cs (and children (apply vector children)))) root)) (let [mt (map-tree {:v 1 :cs [{:v 2} {:v 3 :cs [{:v 4} {:v 5}]}]})] (loop [loc mt] (if (z/end? loc) (z/root loc) (recur (z/next (let [n (:v (z/node loc))] (if (and (integer? n) (odd? n)) (z/replace loc {:v(* 2 (:v (z/node loc))) :cs (z/children loc)}) loc))))))) On Wed, Nov 27, 2013 at 8:35 AM, dabd <dario.reh...@gmail.com> wrote: > The problem is that your vector-zip is not representing the tree I pictured. > > > On Wednesday, November 27, 2013 6:26:12 AM UTC, martin_clausen wrote: >> >> Yes, for instance like this: >> >> (let [vz (z/vector-zip [1 [2] [3 [4 5]]])] >> (loop [loc vz] >> (if (z/end? loc) >> (z/root loc) >> (recur (z/next (if (and (integer? (z/node loc)) (odd? (z/node >> loc))) >> (z/replace loc (* 2 (z/node loc))) >> loc)))))) >> >> Which lets you avoid writing half the infrastructure yourself. >> >> On Wed, Nov 27, 2013 at 6:19 AM, dabd <dario....@gmail.com> wrote: >> > I'm not sure what you mean by not being able to provide a meaningful >> > branch?. >> > >> > I would like to represent a tree such a this: >> > >> > 1 >> > >> > / \ >> > 2 3 >> > / \ >> > 4 5 >> > >> > >> > How can I achieve this using zippers? >> > >> > On Wednesday, November 27, 2013 4:30:15 AM UTC, martin_clausen wrote: >> >> >> >> To use the zipper library you have to be able to provide branch? >> >> children >> >> and make-node functions that apply to your data structure. >> >> >> >> I don't see a way to provide a meaningful branch? or children function >> >> for >> >> the structure you describe. Vector? will not work as branch? as it will >> >> not >> >> return true if passed the first element in a vector, and next will not >> >> work >> >> as it will not return the children if passed the first element of a >> >> vector. >> >> >> >> It looks to me like you don't get past the first element because the >> >> call >> >> to z/next fails both (and (branch? loc) (down loc)), (right loc) and >> >> (up >> >> loc) and therefore marks the first element as the end of the of the >> >> structure. >> >> >> >> Is there a compelling reason for not using the vector-zip structure for >> >> your specific use-case? >> >> >> >> >> >> On Wednesday, November 27, 2013 2:59:40 AM UTC+1, dabd wrote: >> >>> >> >>> The built-in vector-zip will build a tree with a different structure >> >>> than >> >>> what I need. >> >>> I want build a tree as described in the first post: the node value is >> >>> the >> >>> first element of the vector and the children the rest of the elements. >> >>> >> >>> >> >>> zipper.core> (loop [loc (tree-zipper [1 2 [3 4 5]])] >> >>> (if (z/end? loc) >> >>> (z/root loc) >> >>> (do (println (z/node loc)) >> >>> (recur (z/next loc))))) >> >>> [1 2 [3 4 5]] >> >>> >> >>> 2 >> >>> >> >>> [3 4 5] >> >>> >> >>> 4 >> >>> >> >>> 5 >> >>> >> >>> [1 2 [3 4 5]] >> >>> zipper.core> (loop [loc (z/vector-zip [1 2 [3 4 5]])] >> >>> (if (z/end? loc) >> >>> (z/root loc) >> >>> (do (println (z/node loc)) >> >>> (recur (z/next loc))))) >> >>> [1 2 [3 4 5]] >> >>> >> >>> 1 >> >>> >> >>> 2 >> >>> >> >>> [3 4 5] >> >>> >> >>> 3 >> >>> >> >>> 4 >> >>> >> >>> 5 >> >>> >> >>> [1 2 [3 4 5]] >> >>> >> >>> >> >>> On Tuesday, November 26, 2013 11:56:45 PM UTC, martin_clausen wrote: >> >>>> >> >>>> With a nested vector tree you can use the built in vector-zip >> >>>> function >> >>>> to create your zipper. >> >>>> >> >>>> As to the editing, the source code contains a very similar use-case, >> >>>> which can be adapted to something like the following: >> >>>> >> >>>> (let [vz (vector-zip [1 2 [3 4 5]])] >> >>>> (loop [loc vz] >> >>>> (if (end? loc) >> >>>> (root loc) >> >>>> (recur (next (if (and (integer? (node loc)) (odd? (node >> >>>> loc))) >> >>>> (replace loc (* 2 (node loc))) >> >>>> loc)))))) >> >>>> >> >>>> > [2 2 [6 4 10]] >> >>>> >> >>>> On Tuesday, November 26, 2013 10:50:34 PM UTC+1, dabd wrote: >> >>>>> >> >>>>> I am trying to work with a tree representation using vectors where >> >>>>> the >> >>>>> first element is the node value and the rest are the children as >> >>>>> suggested >> >>>>> here: >> >>>>> >> >>>>> >> >>>>> http://grokbase.com/t/gg/clojure/12afy2cz9p/how-to-represent-trees-for-use-with-zippers >> >>>>> >> >>>>> However I am having trouble using clojure.zip/edit to change a >> >>>>> simple >> >>>>> tree. I'd like to multiply the odd numbers by 2 in this case. >> >>>>> https://gist.github.com/dabd/7666778 >> >>>>> >> >>>>> It looks like after editing the first (branch) node clojure.zip/next >> >>>>> will get to the end of the tree. >> >>>>> How can I correct this code? >> >>>>> >> >>>>> Thanks. >> >>>>> >> > -- >> > -- >> > You received this message because you are subscribed to the Google >> > Groups "Clojure" group. >> > To post to this group, send email to clo...@googlegroups.com >> > Note that posts from new members are moderated - please be patient with >> > your >> > first post. >> > To unsubscribe from this group, send email to >> > clojure+u...@googlegroups.com >> > For more options, visit this group at >> > http://groups.google.com/group/clojure?hl=en >> > --- >> > You received this message because you are subscribed to a topic in the >> > Google Groups "Clojure" group. >> > To unsubscribe from this topic, visit >> > https://groups.google.com/d/topic/clojure/ZTWo5gzOx08/unsubscribe. >> > To unsubscribe from this group and all its topics, send an email to >> > clojure+u...@googlegroups.com. >> > For more options, visit https://groups.google.com/groups/opt_out. > > -- > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with your > first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > --- > You received this message because you are subscribed to a topic in the > Google Groups "Clojure" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/clojure/ZTWo5gzOx08/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/groups/opt_out. -- -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.