diff options
author | Rich Hickey <richhickey@gmail.com> | 2009-06-24 12:19:18 -0400 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2009-06-24 12:19:18 -0400 |
commit | 9b6b549df3d2d835f6c2305e6962e31b21b374af (patch) | |
tree | c25bcc2390f07c313e345a00607940a969cb5169 | |
parent | 72de405ca6454ecf5d76a170c7ac09900af5539f (diff) |
perf tweaks in reduce
-rw-r--r-- | src/clj/clojure/core.clj | 6 | ||||
-rw-r--r-- | src/jvm/clojure/lang/ArrayChunk.java | 6 | ||||
-rw-r--r-- | src/jvm/clojure/lang/IChunk.java | 1 |
3 files changed, 8 insertions, 5 deletions
diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj index 141ec2d6..6b7661fb 100644 --- a/src/clj/clojure/core.clj +++ b/src/clj/clojure/core.clj @@ -605,11 +605,7 @@ (if s (if (chunked-seq? s) (recur f - (let [c (chunk-first s)] - (loop [val val i (int 0)] - (if (< i (count c)) - (recur (f val (.nth c i)) (inc i)) - val))) + (.reduce (chunk-first s) f val) (chunk-next s)) (recur f (f val (first s)) (next s))) val)))) diff --git a/src/jvm/clojure/lang/ArrayChunk.java b/src/jvm/clojure/lang/ArrayChunk.java index 90264c57..d5a5a77b 100644 --- a/src/jvm/clojure/lang/ArrayChunk.java +++ b/src/jvm/clojure/lang/ArrayChunk.java @@ -46,4 +46,10 @@ public IChunk dropFirst(){ return new ArrayChunk(array, off + 1, end); } +public Object reduce(IFn f, Object start) throws Exception{ + Object ret = f.invoke(start, array[off]); + for(int x = off + 1; x < end; x++) + ret = f.invoke(ret, array[x]); + return ret; +} } diff --git a/src/jvm/clojure/lang/IChunk.java b/src/jvm/clojure/lang/IChunk.java index 53e9bf08..fd667161 100644 --- a/src/jvm/clojure/lang/IChunk.java +++ b/src/jvm/clojure/lang/IChunk.java @@ -16,4 +16,5 @@ public interface IChunk extends Indexed{ IChunk dropFirst(); +Object reduce(IFn f, Object start) throws Exception; } |