Your map-tree is exactly like an xml-zip.
The problem I find with it is that now branch? also returns true for leaf
nodes:
(def m (map-tree {:v 1 :cs [{:v 2} {:v 3 :cs [{:v 4} {:v 5}]}]}))
> (-> m z/down)
[{:v 2} {:l [], :pnodes [{:v 1, :cs [{:v 2} {:v 3, :cs [{:v 4} {:v 5}]}]}],
:ppath nil, :r ({:v 3, :cs [{:v 4} {:v 5}]})}]
> (-> m z/down z/branch?)
true
(def t (tree-zip [1 2 [3 4 5]]))
> (-> t z/down z/branch?)
false
On Wednesday, November 27, 2013 9:26:53 AM UTC, martin_clausen wrote:
>
> 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 <[email protected] <javascript:>>
> 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 <[email protected]> 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 [email protected]
> >> > Note that posts from new members are moderated - please be patient
> with
> >> > your
> >> > first post.
> >> > To unsubscribe from this group, send email to
> >> > [email protected]
> >> > 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
> >> > [email protected].
> >> > 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 [email protected]<javascript:>
> > Note that posts from new members are moderated - please be patient with
> your
> > first post.
> > To unsubscribe from this group, send email to
> > [email protected] <javascript:>
> > 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
> > [email protected] <javascript:>.
> > 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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/groups/opt_out.