diff options
-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; } |