(walk inner outer form)
Traverses form, an arbitrary data structure. inner and outer are functions. Applies inner to each element of form, building up a data structure of the same type, then applies outer to the result. Recognizes all Clojure data structures. Consumes seqs as with doall.
(use 'clojure.walk)
user=> (walk #(* 2 %) #(apply + %) [1 2 3 4 5])
30
user=> (walk second #(apply max %) [ [1 2] [3 4] [5 6] ])
6
user=> (walk first #(apply max %) [ [1 2] [3 4] [5 6] ])
5
user=> (walk first reverse [ [1 2] [3 4] [5 6] ])
(5 3 1)
(require '[clojure.walk :as w])
user=> (w/walk (fn [[k v]] [k (* 10 v)]) identity {:a 1 :b 2 :c 3})
{:a 10, :c 30, :b 20}
user=> (w/postwalk #(if (number? %) (* 2 %) %) [[1 2 3] [4 7 2] [2 5 2]])
[[2 4 6] [8 14 4] [4 10 4]]
user=> (let [s [1 '(2 3 [1])]]
(w/postwalk #(if (seq? %) (vec %) %) s))
[1 [2 3 [1]]]
user=> (w/walk (comp vec reverse) identity {0 :start 1 :inprogress 2 :end})
{:start 0, :inprogress 1, :end 2}