-
-
Save darkleaf/f760221ab29308de7af2ff5430904ffd to your computer and use it in GitHub Desktop.
Clojure merge-with-key
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(ns mlimotte.util) | |
; A variation on clojure.core/merge-with | |
(defn merge-with-key | |
"Returns a map that consists of the rest of the maps conj-ed onto | |
the first. If a key occurs in more than one map, the mapping(s) | |
from the latter (left-to-right) will be combined with the mapping in | |
the result by calling (f key val-in-result val-in-latter)." | |
[f & maps] | |
(when (some identity maps) | |
(let [merge-entry (fn [m e] | |
(let [k (key e) v (val e)] | |
(if (contains? m k) | |
(assoc m k (f k (get m k) v)) | |
(assoc m k v)))) | |
merge2 (fn [m1 m2] | |
(reduce merge-entry (or m1 {}) (seq m2)))] | |
(reduce merge2 maps)))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment