Size: a a a

Clojure — русскоговорящее сообщество

2020 October 16

PP

Pavel Peganov in Clojure — русскоговорящее сообщество
Так просто reduce же, не? Структура ведь линейная.
источник

PP

Pavel Peganov in Clojure — русскоговорящее сообщество
А, пардон, reduce не взлетит, ибо там не совсем коллекция с элементами.
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
(def data {:tag/uuid "a"
          :parent {:tag/uuid "b"
                   :parent {:tag/uuid "c"}}})

(def nodes
 (tree-seq (fn [node]
           (-> node :parent some?))
         (fn [node]
           (-> node :parent vector))
         data))

(map :tag/uuid nodes)

("a" "b" "c")
источник

AC

Alexey Cheremisin in Clojure — русскоговорящее сообщество
Ivan Grishaev
(def data {:tag/uuid "a"
          :parent {:tag/uuid "b"
                   :parent {:tag/uuid "c"}}})

(def nodes
 (tree-seq (fn [node]
           (-> node :parent some?))
         (fn [node]
           (-> node :parent vector))
         data))

(map :tag/uuid nodes)

("a" "b" "c")
O!!! Божественно! Спасибо!
источник

PP

Pavel Peganov in Clojure — русскоговорящее сообщество
Я о чём-то таком думал:

(map :tag/uuid
(take-while map?
 (iterate :parent input))
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
Iterate тоже круто, но только если родитель один.
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
Чаще бывает, что у ноды потомки
источник

PP

Pavel Peganov in Clojure — русскоговорящее сообщество
В мапке может быть только один ключ :parent, и в нём не коллекция 🤔
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
Да я понимаю. Просто если будет не parent, а children с вектором, то iterate вернет коллекции
источник

PP

Pavel Peganov in Clojure — русскоговорящее сообщество
Всё так. Я о чём и говорю, что здесь коллекция хоть и с вложенностью, но линейная.
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
Для такой коллекции iterate супер, взял не заметку
источник

AC

Alexey Cheremisin in Clojure — русскоговорящее сообщество
Из datahike можно и детей вытащить, тогда вектора будут. В общем оба варианта хороши! Спасибо!
источник

PP

Pavel Peganov in Clojure — русскоговорящее сообщество
Для случая с :children любопытно попробовать, не затолкается ли туда flatten 🤔
Но оно уже точно проиграет по элегантности tree-seq, который прям для этого придуман.
источник

AC

Alexey Cheremisin in Clojure — русскоговорящее сообщество
пошел вкуривать tree-seq...
источник

AC

Anton Chikin in Clojure — русскоговорящее сообщество
А никто не помнит - была хорошая статья с объяснением tree-seq?
источник

AC

Anton Chikin in Clojure — русскоговорящее сообщество
@dos я тебе не кидал эту статью?
источник

T

The2lb3oz4dr10½grOfH... in Clojure — русскоговорящее сообщество
Alexey Cheremisin
что-то я запутался, помогите, есть такая структура
{:tag/uuid "three", :parent {:tag/uuid "two",  :parent {:tag/uuid "one"}}}
нужно из нее вытащить все :tag/uuid
["three" "two" "one"]
Можно лупом обычным, если сложно
источник

T

The2lb3oz4dr10½grOfH... in Clojure — русскоговорящее сообщество
(defn collect-uuids [data]
(loop [acc  []
       node data]
 (let [r (conj acc (:tag/uuid node))]
  (cond-> r
   (some? (:parent node))
   (recur (:parent node))))))
источник

AC

Alexey Cheremisin in Clojure — русскоговорящее сообщество
спасибо!
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
The2lb3oz4dr10½grOfHedgehogs
(defn collect-uuids [data]
(loop [acc  []
       node data]
 (let [r (conj acc (:tag/uuid node))]
  (cond-> r
   (some? (:parent node))
   (recur (:parent node))))))
можно ж деструктурнуть
(defn collect-uuids [data]
 (loop [acc []
        {:keys [tag/uuid parent]} data]
   (let [r (conj acc uuid)]
     (if parent
       (recur r parent)
       r))))
источник