summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/boot.clj8
-rw-r--r--src/jvm/clojure/lang/APersistentVector.java2
-rw-r--r--src/jvm/clojure/lang/ASeq.java26
-rw-r--r--src/jvm/clojure/lang/ArraySeq.java10
-rw-r--r--src/jvm/clojure/lang/IReduce.java19
-rw-r--r--src/jvm/clojure/lang/ISeq.java4
-rw-r--r--src/jvm/clojure/lang/PersistentList.java16
-rw-r--r--src/jvm/clojure/lang/Range.java2
8 files changed, 60 insertions, 27 deletions
diff --git a/src/boot.clj b/src/boot.clj
index ad0cf15a..410a9cf9 100644
--- a/src/boot.clj
+++ b/src/boot.clj
@@ -442,12 +442,16 @@
([f coll]
(let [s (seq coll)]
(if s
- (. s (reduce f))
+ (if (instance? clojure.lang.IReduce s)
+ (. s (reduce f))
+ (reduce f (first s) (rest s)))
(f))))
([f val coll]
(let [s (seq coll)]
(if s
- (. s (reduce f val))
+ (if (instance? clojure.lang.IReduce s)
+ (. s (reduce f val))
+ (recur f (f val (first s)) (rest s)))
val))))
(defn reverse
diff --git a/src/jvm/clojure/lang/APersistentVector.java b/src/jvm/clojure/lang/APersistentVector.java
index 46dfbb25..de16efda 100644
--- a/src/jvm/clojure/lang/APersistentVector.java
+++ b/src/jvm/clojure/lang/APersistentVector.java
@@ -230,7 +230,7 @@ public int length(){
return count();
}
-static class Seq extends ASeq implements IndexedSeq{
+static class Seq extends ASeq implements IndexedSeq, IReduce{
//todo - something more efficient
final IPersistentVector v;
final int i;
diff --git a/src/jvm/clojure/lang/ASeq.java b/src/jvm/clojure/lang/ASeq.java
index e519621d..89a4546e 100644
--- a/src/jvm/clojure/lang/ASeq.java
+++ b/src/jvm/clojure/lang/ASeq.java
@@ -58,19 +58,19 @@ public int hashCode(){
return _hash;
}
-public Object reduce(IFn f) throws Exception{
- Object ret = first();
- for(ISeq s = rest(); s != null; s = s.rest())
- ret = f.invoke(ret, s.first());
- return ret;
-}
-
-public Object reduce(IFn f, Object start) throws Exception{
- Object ret = f.invoke(start, first());
- for(ISeq s = rest(); s != null; s = s.rest())
- ret = f.invoke(ret, s.first());
- return ret;
-}
+//public Object reduce(IFn f) throws Exception{
+// Object ret = first();
+// for(ISeq s = rest(); s != null; s = s.rest())
+// ret = f.invoke(ret, s.first());
+// return ret;
+//}
+//
+//public Object reduce(IFn f, Object start) throws Exception{
+// Object ret = f.invoke(start, first());
+// for(ISeq s = rest(); s != null; s = s.rest())
+// ret = f.invoke(ret, s.first());
+// return ret;
+//}
//public Object peek(){
// return first();
diff --git a/src/jvm/clojure/lang/ArraySeq.java b/src/jvm/clojure/lang/ArraySeq.java
index c1b7e4d8..9cf79e8f 100644
--- a/src/jvm/clojure/lang/ArraySeq.java
+++ b/src/jvm/clojure/lang/ArraySeq.java
@@ -14,7 +14,7 @@ package clojure.lang;
import java.lang.reflect.Array;
-public class ArraySeq extends ASeq implements IndexedSeq{
+public class ArraySeq extends ASeq implements IndexedSeq, IReduce{
final Object array;
final int i;
//ISeq _rest;
@@ -101,7 +101,7 @@ public Object reduce(IFn f, Object start) throws Exception{
//////////////////////////////////// specialized primitive versions ///////////////////////////////
-static public class ArraySeq_int extends ASeq implements IndexedSeq{
+static public class ArraySeq_int extends ASeq implements IndexedSeq, IReduce{
final int[] array;
final int i;
@@ -149,7 +149,7 @@ public Object reduce(IFn f, Object start) throws Exception{
}
-static public class ArraySeq_float extends ASeq implements IndexedSeq{
+static public class ArraySeq_float extends ASeq implements IndexedSeq, IReduce{
final float[] array;
final int i;
@@ -196,7 +196,7 @@ public Object reduce(IFn f, Object start) throws Exception{
}
}
-static public class ArraySeq_double extends ASeq implements IndexedSeq{
+static public class ArraySeq_double extends ASeq implements IndexedSeq, IReduce{
final double[] array;
final int i;
@@ -243,7 +243,7 @@ public Object reduce(IFn f, Object start) throws Exception{
}
}
-static public class ArraySeq_long extends ASeq implements IndexedSeq{
+static public class ArraySeq_long extends ASeq implements IndexedSeq, IReduce{
final long[] array;
final int i;
diff --git a/src/jvm/clojure/lang/IReduce.java b/src/jvm/clojure/lang/IReduce.java
new file mode 100644
index 00000000..83ddf80c
--- /dev/null
+++ b/src/jvm/clojure/lang/IReduce.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) Rich Hickey. All rights reserved.
+ * The use and distribution terms for this software are covered by the
+ * Common Public License 1.0 (http://opensource.org/licenses/cpl.php)
+ * which can be found in the file CPL.TXT at the root of this distribution.
+ * By using this software in any fashion, you are agreeing to be bound by
+ * the terms of this license.
+ * You must not remove this notice, or any other, from this software.
+ **/
+
+/* rich Jun 11, 2008 */
+
+package clojure.lang;
+
+public interface IReduce{
+Object reduce(IFn f) throws Exception;
+
+Object reduce(IFn f, Object start) throws Exception;
+}
diff --git a/src/jvm/clojure/lang/ISeq.java b/src/jvm/clojure/lang/ISeq.java
index 2fdd8eec..08c66cf9 100644
--- a/src/jvm/clojure/lang/ISeq.java
+++ b/src/jvm/clojure/lang/ISeq.java
@@ -24,8 +24,4 @@ ISeq rest();
ISeq cons(Object o);
-Object reduce(IFn f) throws Exception;
-
-Object reduce(IFn f, Object start) throws Exception;
-
}
diff --git a/src/jvm/clojure/lang/PersistentList.java b/src/jvm/clojure/lang/PersistentList.java
index 9009f016..930cd887 100644
--- a/src/jvm/clojure/lang/PersistentList.java
+++ b/src/jvm/clojure/lang/PersistentList.java
@@ -14,7 +14,7 @@ import java.util.List;
import java.util.ListIterator;
import java.util.LinkedList;
-public class PersistentList extends ASeq implements IPersistentList{
+public class PersistentList extends ASeq implements IPersistentList, IReduce{
private final Object _first;
private final IPersistentList _rest;
@@ -100,6 +100,20 @@ public PersistentList withMeta(IPersistentMap meta){
return this;
}
+public Object reduce(IFn f) throws Exception{
+ Object ret = first();
+ for(ISeq s = rest(); s != null; s = s.rest())
+ ret = f.invoke(ret, s.first());
+ return ret;
+}
+
+public Object reduce(IFn f, Object start) throws Exception{
+ Object ret = f.invoke(start, first());
+ for(ISeq s = rest(); s != null; s = s.rest())
+ ret = f.invoke(ret, s.first());
+ return ret;
+}
+
static class EmptyList extends Obj implements IPersistentList{
EmptyList(IPersistentMap meta){
diff --git a/src/jvm/clojure/lang/Range.java b/src/jvm/clojure/lang/Range.java
index e5d51761..ccb98b19 100644
--- a/src/jvm/clojure/lang/Range.java
+++ b/src/jvm/clojure/lang/Range.java
@@ -12,7 +12,7 @@
package clojure.lang;
-public class Range extends ASeq{
+public class Range extends ASeq implements IReduce{
final int end;
final int n;