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.reh...@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 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.

Reply via email to