Продолжение «как добавить дочерний элемент в дерево с помощью clojure.zip»?

Этот вопрос относится к вопросу и является продолжением вопроса 37484870:

Рассмотрим следующий код

(defn f [x]
    (loop [a x v [(inc x)]] 
      (if (> a 0) 
        (recur (dec a) (conj [a] v))
        v)))

(def v (z/vector-zip (f 10))

где z относится к clojure.zip. Обратите внимание, что 10 могло быть гораздо большим числом.

Теперь, как мне добавить узел в v, используя функции из API для clojure.zip, чтобы результат был равен

((def v (z/vector-zip (f (inc 10)) ? 

Таким образом, узел добавляется к самому левому узлу на самом глубоком уровне (если это помогает).

Причина, по которой задается этот вопрос, заключается в том, что ответ на вопрос 37484870 подразумевает цикл из 10

(z/down)
(z/right)

функции, но, возможно, структуры с застежкой-молнией предлагают более прямое решение.


person nilo de roock    schedule 27.05.2016    source источник


Ответы (1)


Одним из возможных решений является

(-> v
    (#(let [next (z/next %)]
       (if (z/end? next)
         %
         (recur next))))
    (#(z/insert-right % [(inc (z/node %))]))
    (z/root))
person SerCe    schedule 27.05.2016
comment
Думаю над более грамотным решением вроде создания функций или макросов для перехода на определенные позиции в дереве, как дополнение к следующему и т.д. - person nilo de roock; 28.05.2016