Skip to content

Instantly share code, notes, and snippets.

@paultopia
Last active September 4, 2023 22:16
Show Gist options
  • Save paultopia/78ba6791d7eba48293da45d9d5d58c57 to your computer and use it in GitHub Desktop.
Save paultopia/78ba6791d7eba48293da45d9d5d58c57 to your computer and use it in GitHub Desktop.
merge for clojure that doesn't overwrite existing values with nil values
(require '[clojure.core.match :refer [match]])
(defn discard-nils [a b]
(match [a b]
[_ nil] a
:else b))
(def safe-merge (partial merge-with discard-nils))
;; examples
(safe-merge {:a 1 :b 1} {:a 5 :b nil} {:a nil :b 3})
;; => {:a 5, :b 3}
(merge {:a 1 :b 1} {:a 5 :b nil} {:a nil :b 3})
;; => {:a nil, :b 3}
(safe-merge {:a 1 :b nil} {:a nil :b 4 :c 5 :d nil})
;; => {:a 1, :b 4, :c 5, :d nil}
(merge {:a 1 :b nil} {:a nil :b 4 :c 5 :d nil})
;; => {:a nil, :b 4, :c 5, :d nil}
@D00mch
Copy link

D00mch commented Sep 4, 2023

(def safe-merge (partial merge-with #(or %2 %1)))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment