summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStuart Halloway <stu@thinkrelevance.com>2010-06-05 13:20:35 -0400
committerStuart Halloway <stu@thinkrelevance.com>2010-06-07 10:03:25 -0400
commiteb4502cb1e9cbc7a9a9378af1f8b8c1cd8cc6507 (patch)
treeb3b97ed3d3a7aaaf5d3950562f0859618d9271ea
parentc19ce8145053578763ac3bef4de9d8c3c44e1b11 (diff)
make get-in faster #256
Signed-off-by: Stuart Halloway <stu@thinkrelevance.com>
-rw-r--r--src/clj/clojure/core.clj15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj
index ca615435..017b0b70 100644
--- a/src/clj/clojure/core.clj
+++ b/src/clj/clojure/core.clj
@@ -4910,12 +4910,19 @@
"Returns the value in a nested associative structure,
where ks is a sequence of ke(ys. Returns nil if the key is not present,
or the not-found value if supplied."
+ {:added "1.2"}
([m ks]
- (reduce get m ks))
+ (reduce get m ks))
([m ks not-found]
- (if (seq ks)
- (get (reduce get m (butlast ks)) (last ks) not-found)
- m)))
+ (loop [sentinel (Object.)
+ m m
+ ks (seq ks)]
+ (if ks
+ (let [m (get m (first ks) sentinel)]
+ (if (identical? sentinel m)
+ not-found
+ (recur sentinel m (next ks))))
+ m))))
(defn assoc-in
"Associates a value in a nested associative structure, where ks is a