Rather than 'down-right, I now prefer 'rightmost (first you go down then 
you go to the rightmost child):

(defn rightmost
  "Returns the loc of the rightmost sibling of the node at this loc, or 
self"
  [loc]
    (let [[node {l :l  r :r :as path}] loc]
      (when (and path r)
        (with-meta [(last r) (assoc path :l (apply conj l node (butlast 
r)) :r nil)] ^loc))))

'leftmost is easier: #(-> % up down) but it may be good to have both 
'leftmost and 'rightmost.

Plus 'rightmost makes 'prev easier to write and I need 'prev to fix 'remove.

Christophe


Christophe Grand a écrit :
> I keep needing to go to the last (rightmost) child of a loc (generally 
> after appending it).
> (Or I failed to spot the proper idiom.)
>
> So I wrote last-child:
>   (defn last-child [loc]
>     (last (take-while identity (iterate zip/right (zip/down loc)))))
>
> but it feels a bit overkill because of all this repeated calls to 
> zip/right. I could write:
>
>   (defn down-right
>     "Returns the loc of the rightmost child of the node at this loc, or
>     nil if no children"
>     [loc]
>       (let [[node path] loc
>             cs (vec (zip/children loc))]
>         (when (seq cs)
>           (with-meta [(peek cs) {:l (pop cs)
>                          :pnodes (if path (conj (:pnodes path) node) 
> [node])
>                          :ppath path
>                          :r nil}] ^loc))))
>
> but it would mess with zippers internals: I don't like to have that in 
> user code.
>
> Would it be a useful addition to clojure.zip?
>
> Christophe
>
>
> >
>
>   


-- 
Professional: http://cgrand.net/ (fr)
On Clojure: http://clj-me.blogspot.com/ (en)



--~--~---------~--~----~------------~-------~--~----~
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
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to