I'm trying to figure out if there is a better / more concise / more generic
way to write an update function. The data I have is a vector of maps
containing vectors of maps.
For example:
[{:values [{:y 1 :x 4}{:y 2 :x 7}]}{:values [{:y 5 :x 8}]}]
The goal is to update all the :y values or all the :x values according to a
passed-in function. As a concrete example, I'd like to invert the sign of
all the :y values.
So here's the working function which I've come up with:
(defn update-nested-fields
"Updates a vector of maps containing vectors of maps"
[col [k1 k2] f]
(map (fn [outer-map]
(update-in outer-map
[k1]
(fn [inner-col]
(map
(fn [inner-map]
(update-in inner-map [k2] f))
inner-col))))
col))
;; invert the :y values
(update-nested-fields
[{:values [{:y 1 :x 4}{:y 2 :x 7}]}{:values [{:y 5 :x 8}]}]
[:values :y]
(partial * -1))
As you can see, at a simple level it is: (map (update-in (map (update-in
f))).
I'm really wondering if I'm missing an obvious simplification. I've tried
to decide if a threading macro would help, but I don't see how, since the
outer collection is provided to the outermost map function, rather than the
inner-most function.
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.