summaryrefslogtreecommitdiff
path: root/src/cli/runtime/PersistentHashtableMap.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/cli/runtime/PersistentHashtableMap.cs')
-rw-r--r--src/cli/runtime/PersistentHashtableMap.cs33
1 files changed, 22 insertions, 11 deletions
diff --git a/src/cli/runtime/PersistentHashtableMap.cs b/src/cli/runtime/PersistentHashtableMap.cs
index b54166a0..76dd01f1 100644
--- a/src/cli/runtime/PersistentHashtableMap.cs
+++ b/src/cli/runtime/PersistentHashtableMap.cs
@@ -170,35 +170,41 @@ override public IEnumerator GetEnumerator() {
}
override public ISeq seq() {
- return Seq.create(array);
+ if(count() == 0)
+ return null;
+ return Seq.create(array,count());
}
class Seq : ASeq{
- PersistentArray buckets;
- int b;
- ISeq e;
+ readonly PersistentArray buckets;
+ readonly int b;
+ readonly ISeq e;
+ readonly int cnt;
- static public Seq create(PersistentArray buckets) {
- return next(buckets, -1, null);
+ static public Seq create(PersistentArray buckets,int cnt) {
+ return next(buckets, -1, null,cnt);
}
- static Seq next(PersistentArray buckets, int b, ISeq e) {
+ static Seq next(PersistentArray buckets, int b, ISeq e, int cnt)
+ {
if(e != null && e.rest() != null)
- return new Seq(buckets,b,e.rest());
+ return new Seq(buckets,b,e.rest(),cnt);
for(b = b+1;b<buckets.length();b++)
{
IPersistentCollection a = (IPersistentCollection) buckets.nth(b);
if(a != null && a.seq() != null)
- return new Seq(buckets,b,a.seq());
+ return new Seq(buckets,b,a.seq(),cnt);
}
return null;
}
- Seq(PersistentArray buckets, int b, ISeq e) {
+ Seq(PersistentArray buckets, int b, ISeq e, int cnt)
+ {
this.buckets = buckets;
this.b = b;
this.e = e;
+ this.cnt = cnt;
}
override public Object first() {
@@ -206,8 +212,13 @@ class Seq : ASeq{
}
override public ISeq rest() {
- return next(buckets,b,e);
+ return next(buckets,b,e,cnt-1);
}
+
+ public override int count()
+ {
+ return cnt;
+ }
}
internal class Iter : IEnumerator{