Skip to content

Instantly share code, notes, and snippets.

@igrishaev
Created July 22, 2025 17:21
Show Gist options
  • Select an option

  • Save igrishaev/9c18339ae891bb5cf246e3e1d2aa0739 to your computer and use it in GitHub Desktop.

Select an option

Save igrishaev/9c18339ae891bb5cf246e3e1d2aa0739 to your computer and use it in GitHub Desktop.
(require '[clojure.zip :as zip])
(defn ->zipper [data]
(zip/zipper (fn [[_ x]]
(coll? x))
(fn [[_ x]]
(if (map? x)
(seq x)
(map vector (range) x)))
nil
[nil data]))
(defn squash [data]
(loop [z (-> data ->zipper zip/next)
r {}]
(if (zip/end? z)
r
(let [[k v] (zip/node z)]
(if (coll? v)
(recur (zip/next z) r)
(let [path (->> z
zip/path
(rest)
(mapv first))]
(recur (zip/next z) (assoc r (conj path k) v))))))))
(squash {:foo {:bar [{:a 1} {:a 2}]}})
{[:foo :bar 0 :a] 1, [:foo :bar 1 :a] 2}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment