diff options
-rw-r--r-- | src/jvm/clojure/lang/LazilyPersistentVector.java | 75 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentVector.java | 4 |
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; |