summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-04-21 02:21:25 +0000
committerRich Hickey <richhickey@gmail.com>2008-04-21 02:21:25 +0000
commit29dd6d70b825b8127b0fc8db7ac6e053e797caa6 (patch)
tree27e446aee4f97d5ca74a0a5bdf478dbc4052f790 /src
parentdff8bca0286f2af46ab5522cf9d86165ab83eaa6 (diff)
made ArraySeq and seq work for primitive arrays
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/ArraySeq.java32
-rw-r--r--src/jvm/clojure/lang/PersistentList.java2
-rw-r--r--src/jvm/clojure/lang/RT.java4
3 files changed, 23 insertions, 15 deletions
diff --git a/src/jvm/clojure/lang/ArraySeq.java b/src/jvm/clojure/lang/ArraySeq.java
index ec89eb45..5be99193 100644
--- a/src/jvm/clojure/lang/ArraySeq.java
+++ b/src/jvm/clojure/lang/ArraySeq.java
@@ -12,8 +12,10 @@
package clojure.lang;
+import java.lang.reflect.Array;
+
public class ArraySeq extends ASeq implements IndexedSeq{
-final Object[] array;
+final Object array;
final int i;
//ISeq _rest;
@@ -27,24 +29,30 @@ static public ArraySeq create(Object... array){
return new ArraySeq(array, 0);
}
-ArraySeq(Object[] array, int i){
+static ArraySeq createFromObject(Object array){
+ if(array == null || Array.getLength(array) == 0)
+ return null;
+ return new ArraySeq(array, 0);
+}
+
+ArraySeq(Object array, int i){
this.array = array;
this.i = i;
// this._rest = this;
}
-ArraySeq(IPersistentMap meta, Object[] array, int i){
+ArraySeq(IPersistentMap meta, Object array, int i){
super(meta);
this.array = array;
this.i = i;
}
public Object first(){
- return array[i];
+ return Array.get(array,i);
}
public ISeq rest(){
- if(i + 1 < array.length)
+ if(i + 1 < Array.getLength(array))
return new ArraySeq(array, i + 1);
return null;
// if(_rest == this)
@@ -57,7 +65,7 @@ public ISeq rest(){
}
public int count(){
- return array.length - i;
+ return Array.getLength(array) - i;
}
public int index(){
@@ -69,16 +77,16 @@ public ArraySeq withMeta(IPersistentMap meta){
}
public Object reduce(IFn f) throws Exception{
- Object ret = array[i];
- for(int x = i+1;x < array.length;x++)
- ret = f.invoke(ret, array[x]);
+ Object ret = Array.get(array,i);
+ for(int x = i+1;x < Array.getLength(array);x++)
+ ret = f.invoke(ret, Array.get(array,x));
return ret;
}
public Object reduce(IFn f, Object start) throws Exception{
- Object ret = f.invoke(start,array[i]);
- for(int x = i+1;x < array.length;x++)
- ret = f.invoke(ret, array[x]);
+ Object ret = f.invoke(start,Array.get(array,i));
+ for(int x = i+1;x < Array.getLength(array);x++)
+ ret = f.invoke(ret, Array.get(array,x));
return ret;
}
}
diff --git a/src/jvm/clojure/lang/PersistentList.java b/src/jvm/clojure/lang/PersistentList.java
index d31d3c57..112eede6 100644
--- a/src/jvm/clojure/lang/PersistentList.java
+++ b/src/jvm/clojure/lang/PersistentList.java
@@ -24,7 +24,7 @@ public static IFn creator = new RestFn(0){
protected Object doInvoke(Object args) throws Exception{
if(args instanceof ArraySeq)
{
- Object[] argsarray = ((ArraySeq) args).array;
+ Object[] argsarray = (Object[]) ((ArraySeq) args).array;
ISeq ret = EMPTY;
for(int i = argsarray.length - 1; i >= 0; --i)
ret = ret.cons(argsarray[i]);
diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java
index 53657635..294cc313 100644
--- a/src/jvm/clojure/lang/RT.java
+++ b/src/jvm/clojure/lang/RT.java
@@ -347,8 +347,8 @@ static public ISeq seq(Object coll){
return ((IPersistentCollection) coll).seq();
else if(coll instanceof Iterable)
return IteratorSeq.create(((Iterable) coll).iterator());
- else if(coll instanceof Object[])
- return ArraySeq.create((Object[]) coll);
+ else if(coll.getClass().isArray())
+ return ArraySeq.createFromObject(coll);
else if(coll instanceof String)
return StringSeq.create((String) coll);
else if(coll instanceof Map)