(defn
assoc-in
"Associates a value in a nested associative structure, where ks is a\n sequence of keys and v is the new value and returns a new nested structure.\n If any levels do not exist, hash-maps will be created."
[m [k & ks] v]
(if ks (assoc m k (assoc-in (get m k) ks v)) (assoc m k v)))