aboutsummaryrefslogtreecommitdiff
path: root/src/clojure
diff options
context:
space:
mode:
authorscgilardi <scgilardi@gmail.com>2009-05-24 00:25:49 +0000
committerscgilardi <scgilardi@gmail.com>2009-05-24 00:25:49 +0000
commitd9049bf729b37cd6d21022674d966bec31bcb7a7 (patch)
tree91341b76a8083803f7d086131d5187f31180323b /src/clojure
parent03d773de9019a15e89ff55c82635a5205fddee52 (diff)
clojure.contrib.core: add dissoc-in
Diffstat (limited to 'src/clojure')
-rw-r--r--src/clojure/contrib/core.clj19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/clojure/contrib/core.clj b/src/clojure/contrib/core.clj
index e5fe7c78..55e5e777 100644
--- a/src/clojure/contrib/core.clj
+++ b/src/clojure/contrib/core.clj
@@ -42,3 +42,22 @@
(.?. nil .toUpperCase (.substring 1)) returns nil
"
.. .?.)
+
+;; ----------------------------------------------------------------------
+;; scgilardi at gmail
+
+(defn dissoc-in
+ "Dissociates an entry from a nested associative structure returning a new
+ nested structure. keys is a sequence of keys. Any empty maps that result
+ will not be present in the new structure."
+ [m [k & ks :as keys]]
+ (if ks
+ (if-let [nextmap (get m k)]
+ (let [newmap (dissoc-in nextmap ks)]
+ (if (seq newmap)
+ (assoc m k newmap)
+ (dissoc m k)))
+ m)
+ (dissoc m k)))
+
+;; ----------------------------------------------------------------------