diff options
author | Stuart Halloway <stu@thinkrelevance.com> | 2010-06-05 13:20:35 -0400 |
---|---|---|
committer | Stuart Halloway <stu@thinkrelevance.com> | 2010-06-07 10:03:25 -0400 |
commit | eb4502cb1e9cbc7a9a9378af1f8b8c1cd8cc6507 (patch) | |
tree | b3b97ed3d3a7aaaf5d3950562f0859618d9271ea | |
parent | c19ce8145053578763ac3bef4de9d8c3c44e1b11 (diff) |
make get-in faster #256
Signed-off-by: Stuart Halloway <stu@thinkrelevance.com>
-rw-r--r-- | src/clj/clojure/core.clj | 15 |
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 |