summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cli/runtime/IPersistentMap.cs2
-rw-r--r--src/cli/runtime/PersistentHashtableMap.cs40
-rw-r--r--src/cli/runtime/PersistentHybridMap.cs11
-rw-r--r--src/org/clojure/runtime/IPersistentMap.java2
-rw-r--r--src/org/clojure/runtime/PersistentHashtableMap.java40
-rw-r--r--src/org/clojure/runtime/PersistentHybridMap.java3
6 files changed, 95 insertions, 3 deletions
diff --git a/src/cli/runtime/IPersistentMap.cs b/src/cli/runtime/IPersistentMap.cs
index dc333eeb..aa072c56 100644
--- a/src/cli/runtime/IPersistentMap.cs
+++ b/src/cli/runtime/IPersistentMap.cs
@@ -14,7 +14,7 @@ using System.Collections;
namespace org.clojure.runtime
{
-public interface IPersistentMap : IEnumerable{
+public interface IPersistentMap : IEnumerable, ISequential{
int count();
diff --git a/src/cli/runtime/PersistentHashtableMap.cs b/src/cli/runtime/PersistentHashtableMap.cs
index e00cd565..66732b72 100644
--- a/src/cli/runtime/PersistentHashtableMap.cs
+++ b/src/cli/runtime/PersistentHashtableMap.cs
@@ -152,6 +152,46 @@ public virtual IEnumerator GetEnumerator() {
return new Iter(array);
}
+public ISeq seq() {
+ return Seq.create(array);
+}
+
+class Seq : ISeq{
+ PersistentArray buckets;
+ int b;
+ ISeq e;
+
+
+ static public Seq create(PersistentArray buckets) {
+ return next(buckets, -1, null);
+ }
+
+ static Seq next(PersistentArray buckets, int b, ISeq e) {
+ if(e != null && e.rest() != null)
+ return new Seq(buckets,b,e.rest());
+ for(b = b+1;b<buckets.length();b++)
+ {
+ ISequential a = (ISequential) buckets.get(b);
+ if(a != null && a.seq() != null)
+ return new Seq(buckets,b,a.seq());
+ }
+ return null;
+ }
+
+ Seq(PersistentArray buckets, int b, ISeq e) {
+ this.buckets = buckets;
+ this.b = b;
+ this.e = e;
+ }
+
+ public Object first() {
+ return e.first();
+ }
+
+ public ISeq rest() {
+ return next(buckets,b,e);
+ }
+}
internal class Iter : IEnumerator{
PersistentArray buckets;
diff --git a/src/cli/runtime/PersistentHybridMap.cs b/src/cli/runtime/PersistentHybridMap.cs
index 5ca17c9c..7c0cc88e 100644
--- a/src/cli/runtime/PersistentHybridMap.cs
+++ b/src/cli/runtime/PersistentHybridMap.cs
@@ -100,6 +100,15 @@ virtual internal IPersistentMap createHashtableMap(int initialCapacity) {
return new PersistentHashtableMap(initialCapacity);
}
-}
+
+#region ISequential Members
+
+public ISeq seq()
+ {
+ return impl.seq();
+ }
+
+#endregion
+ }
}
diff --git a/src/org/clojure/runtime/IPersistentMap.java b/src/org/clojure/runtime/IPersistentMap.java
index aff5f8a0..0f4ee467 100644
--- a/src/org/clojure/runtime/IPersistentMap.java
+++ b/src/org/clojure/runtime/IPersistentMap.java
@@ -11,7 +11,7 @@
package org.clojure.runtime;
-public interface IPersistentMap extends Iterable {
+public interface IPersistentMap extends Iterable, ISequential {
int count();
diff --git a/src/org/clojure/runtime/PersistentHashtableMap.java b/src/org/clojure/runtime/PersistentHashtableMap.java
index 2ffa7b6c..89215197 100644
--- a/src/org/clojure/runtime/PersistentHashtableMap.java
+++ b/src/org/clojure/runtime/PersistentHashtableMap.java
@@ -145,6 +145,46 @@ public Iterator iterator() {
return new Iter(array);
}
+public ISeq seq() {
+ return Seq.create(array);
+}
+
+static class Seq implements ISeq{
+ PersistentArray buckets;
+ int b;
+ ISeq e;
+
+
+ static public Seq create(PersistentArray buckets) {
+ return next(buckets, -1, null);
+ }
+
+ static Seq next(PersistentArray buckets, int b, ISeq e) {
+ if(e != null && e.rest() != null)
+ return new Seq(buckets,b,e.rest());
+ for(b = b+1;b<buckets.length();b++)
+ {
+ ISequential a = (ISequential) buckets.get(b);
+ if(a != null && a.seq() != null)
+ return new Seq(buckets,b,a.seq());
+ }
+ return null;
+ }
+
+ Seq(PersistentArray buckets, int b, ISeq e) {
+ this.buckets = buckets;
+ this.b = b;
+ this.e = e;
+ }
+
+ public Object first() {
+ return e.first();
+ }
+
+ public ISeq rest() {
+ return next(buckets,b,e);
+ }
+}
static class Iter implements Iterator{
PersistentArray buckets;
diff --git a/src/org/clojure/runtime/PersistentHybridMap.java b/src/org/clojure/runtime/PersistentHybridMap.java
index 0779a09a..7f517cb6 100644
--- a/src/org/clojure/runtime/PersistentHybridMap.java
+++ b/src/org/clojure/runtime/PersistentHybridMap.java
@@ -98,4 +98,7 @@ IPersistentMap createHashtableMap(int initialCapacity) {
return new PersistentHashtableMap(initialCapacity);
}
+public ISeq seq() {
+ return impl.seq();
+}
}