summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2009-05-28 14:47:11 +0000
committerRich Hickey <richhickey@gmail.com>2009-05-28 14:47:11 +0000
commit902a54421b8d2372587d2d9a34abb803624a4911 (patch)
tree3031ee27d5652c2a7c1546b8e2a4ca099caddfd8 /src
parent91f8beb650a37705dc72cf4b0ec489e2344716a3 (diff)
made vector seqs chunked by default
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/LazilyPersistentVector.java75
-rw-r--r--src/jvm/clojure/lang/PersistentVector.java4
2 files changed, 79 insertions, 0 deletions
diff --git a/src/jvm/clojure/lang/LazilyPersistentVector.java b/src/jvm/clojure/lang/LazilyPersistentVector.java
index 3e274402..9ffd9170 100644
--- a/src/jvm/clojure/lang/LazilyPersistentVector.java
+++ b/src/jvm/clojure/lang/LazilyPersistentVector.java
@@ -34,6 +34,81 @@ LazilyPersistentVector(IPersistentMap meta, Object[] array, PersistentVector v){
this.v = v;
}
+public ISeq seq(){
+ if(array.length == 0)
+ return null;
+ return new ChunkedSeq(array);
+}
+
+static class ChunkedSeq extends ASeq implements IChunkedSeq, IndexedSeq{
+ final Object[] array;
+ final int offset;
+ final int end;
+ static final int BLOCK = 32;
+
+ ChunkedSeq(IPersistentMap meta, Object[] array, int offset, int end){
+ super(meta);
+ this.array = array;
+ this.offset = offset;
+ this.end = end;
+ }
+
+ ChunkedSeq(Object[] array){
+ this(array, 0);
+ }
+
+ ChunkedSeq(Object[] array, int offset){
+ this(array,offset,Math.min(offset + BLOCK, array.length));
+ }
+
+ ChunkedSeq(Object[] array, int offset, int end){
+ this.array = array;
+ this.offset = offset;
+ this.end = end;
+ }
+
+ public Obj withMeta(IPersistentMap meta){
+ if(meta != _meta)
+ return new ChunkedSeq(meta, array,offset,end);
+ return this;
+ }
+
+ public Object first(){
+ return array[offset];
+ }
+
+ public ISeq next(){
+ if(offset + 1 < end)
+ return new ChunkedSeq(array,offset + 1,end);
+ return chunkedNext();
+ }
+
+ public Indexed chunkedFirst(){
+ return new ArrayChunk(array, offset, end);
+ }
+
+ public ISeq chunkedNext(){
+ if(end < array.length)
+ return new ChunkedSeq(array,end);
+ return null;
+ }
+
+ public ISeq chunkedMore(){
+ ISeq s = chunkedNext();
+ if(s == null)
+ return PersistentList.EMPTY;
+ return s;
+ }
+
+ public int index(){
+ return offset;
+ }
+
+ public int count(){
+ return array.length - offset;
+ }
+}
+
public Object[] toArray(){
return array.clone();
}
diff --git a/src/jvm/clojure/lang/PersistentVector.java b/src/jvm/clojure/lang/PersistentVector.java
index c62215a5..87bd11d7 100644
--- a/src/jvm/clojure/lang/PersistentVector.java
+++ b/src/jvm/clojure/lang/PersistentVector.java
@@ -174,6 +174,10 @@ public IChunkedSeq chunkedSeq(){
return new ChunkedSeq(this,0,0);
}
+public ISeq seq(){
+ return chunkedSeq();
+}
+
static public final class ChunkedSeq extends ASeq implements IChunkedSeq{
final PersistentVector vec;