functional programming - Default value for a nested map in clojure -


i have been looking clojure while now, couldnt find function supply default value nested map. example if have map below,

(def paths {:a {:b 5, :d 5, :e 7},             :b {:c 4},             :c {:d 8, :e 2},             :d {:c 8, :e 6},             :e {:b 3}             }) 

i want function creates map below, given hash-map,

{:a {:b 5, :c default_val :d 5, :e 7},             :b {:a default_val, :c 4, :d default_val, :e default_val},             :c {:a default_val, :b default_val, :c default_val, :d 8, :e 2},             :d {:a default_val, :b default_val,  :c 8, :d default_val, :e 6},             :e {:a default_val, :b 3,  :c 8, :d default_val, :e 3}             } 

from reading example it's hard tell when want default value included, though there common pattern of providing set of defaults , merging input wherever value given it's used , if it's not there particular key default value used:

user> (def default-values {:a :default :b :default :c :default :d :default}) #'user/default-values  user> (def paths {:a {:b 5, :d 5, :e 7},             :b {:c 4},             :c {:d 8, :e 2},             :d {:c 8, :e 6},             :e {:b 3}}) #'user/paths  user> (keys paths) (:a :d :b :c :e)  user> (vals paths) ({:d 5, :b 5, :e 7} {:c 8, :e 6} {:c 4} {:d 8, :e 2} {:b 3})  user> (map #(merge default-values %) (vals paths)) ({:a :default, :d 5, :b 5, :c :default, :e 7}   {:a :default, :d :default, :b :default, :c 8, :e 6}   {:a :default, :d :default, :b :default, :c 4}  {:a :default, :d 8, :b :default, :c :default, :e 2}   {:a :default, :d :default, :b 3, :c :default})  user> (clojure.pprint/pprint        (zipmap (keys paths)                 (map #(merge default-values %)                      (vals paths)))) {:e {:a :default, :d :default, :b 3, :c :default},  :c {:a :default, :d 8, :b :default, :c :default, :e 2},  :b {:a :default, :d :default, :b :default, :c 4},  :d {:a :default, :d :default, :b :default, :c 8, :e 6},  :a {:a :default, :d 5, :b 5, :c :default, :e 7}}