(defn safe-merge "Like merge, but throws if maps have the same keys but different values." [& maps] (reduce (fn [m [m2k m2v :as re]] (if-some [[_ mv :as le] (find m m2k)] (if (= mv m2v) m (throw (ex-info "Attempted to safe-merge maps with conflicting entries" {:left-entry le :right-entry re}))) (conj m re))) (first maps) (apply concat (rest maps))))