summaryrefslogtreecommitdiff
path: root/src/org
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2006-06-09 13:24:23 +0000
committerRich Hickey <richhickey@gmail.com>2006-06-09 13:24:23 +0000
commit7b244d43c7c52dfab7fef2d77073705aeac604cc (patch)
tree9eb3319a3d18a8c3555b7caa76ebcf0d1d41e288 /src/org
parente4e5b0612f3acbcd223e8a7c27510bf9a2dde856 (diff)
made ISequential
Diffstat (limited to 'src/org')
-rw-r--r--src/org/clojure/runtime/PersistentArray.java40
1 files changed, 33 insertions, 7 deletions
diff --git a/src/org/clojure/runtime/PersistentArray.java b/src/org/clojure/runtime/PersistentArray.java
index b581ecf6..7c8bf52f 100644
--- a/src/org/clojure/runtime/PersistentArray.java
+++ b/src/org/clojure/runtime/PersistentArray.java
@@ -46,26 +46,32 @@ import java.util.Random;
* I added hybrid most-recent-sequential-range + shared-bitset idea, multi-thread-safety
*/
-public class PersistentArray implements Iterable{
+public class PersistentArray implements Iterable, ISequential{
public Iterator iterator(){
return new ValIter(this);
}
+public ISeq seq() {
+ if(length() > 0)
+ return new Seq(this, 0);
+ return null;
+}
+
static class Master{
- final Entry[] array;
- final Object defaultVal;
+ final Entry[] array;
+ final Object defaultVal;
int rev;
int load;
- final int maxLoad;
+ final int maxLoad;
final float loadFactor;
Master(int size,Object defaultVal, float loadFactor){
- this.array = new Entry[size];//new AtomicReferenceArray(size);
- this.defaultVal = defaultVal;
+ this.array = new Entry[size];//new AtomicReferenceArray(size);
+ this.defaultVal = defaultVal;
this.rev = 0;//new AtomicInteger(0);
this.load = 0;//new AtomicInteger(0);
- this.maxLoad = (int) (size * loadFactor);
+ this.maxLoad = (int) (size * loadFactor);
this.loadFactor = loadFactor;
}
}
@@ -103,6 +109,26 @@ static class EntryLink extends Entry{
}
}
+static class Seq implements ISeq{
+ PersistentArray p;
+ int i;
+
+ Seq(PersistentArray p, int i){
+ this.p = p;
+ this.i = i;
+ }
+
+ public Object first() {
+ return p.get(i);
+ }
+
+ public ISeq rest() {
+ if(i+1 < p.length())
+ return new Seq(p, i + 1);
+ return null;
+ }
+}
+
static class ValIter implements Iterator{
PersistentArray p;
int i;