summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2009-06-24 12:19:18 -0400
committerRich Hickey <richhickey@gmail.com>2009-06-24 12:19:18 -0400
commit9b6b549df3d2d835f6c2305e6962e31b21b374af (patch)
treec25bcc2390f07c313e345a00607940a969cb5169
parent72de405ca6454ecf5d76a170c7ac09900af5539f (diff)
perf tweaks in reduce
-rw-r--r--src/clj/clojure/core.clj6
-rw-r--r--src/jvm/clojure/lang/ArrayChunk.java6
-rw-r--r--src/jvm/clojure/lang/IChunk.java1
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;
}