summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cli/runtime/APersistentMap.cs43
-rw-r--r--src/cli/runtime/RT.cs10
-rw-r--r--src/jvm/clojure/lang/APersistentMap.java44
-rw-r--r--src/jvm/clojure/lang/RT.java8
4 files changed, 105 insertions, 0 deletions
diff --git a/src/cli/runtime/APersistentMap.cs b/src/cli/runtime/APersistentMap.cs
index e107e857..e96cdad0 100644
--- a/src/cli/runtime/APersistentMap.cs
+++ b/src/cli/runtime/APersistentMap.cs
@@ -67,6 +67,49 @@ override public int GetHashCode() {
abstract public IPersistentMap without(object key);
+ public class KeySeq : ASeq{
+ ISeq _seq;
+
+ static public KeySeq create(ISeq seq){
+ if(seq == null)
+ return null;
+ return new KeySeq(seq);
+ }
+
+ private KeySeq(ISeq seq) {
+ this._seq = seq;
+ }
+
+ public override Object first() {
+ return ((IMapEntry)_seq.first()).key();
+ }
+
+ public override ISeq rest() {
+ return create(_seq.rest());
+ }
+}
+
+public class ValSeq : ASeq{
+ ISeq _seq;
+
+ static public ValSeq create(ISeq seq){
+ if(seq == null)
+ return null;
+ return new ValSeq(seq);
+ }
+
+ private ValSeq(ISeq seq) {
+ this._seq = seq;
+ }
+
+ public override Object first() {
+ return ((IMapEntry)_seq.first()).val();
+ }
+
+ public override ISeq rest() {
+ return create(_seq.rest());
+ }
+}
#endregion
diff --git a/src/cli/runtime/RT.cs b/src/cli/runtime/RT.cs
index ef30e8f2..059bdad6 100644
--- a/src/cli/runtime/RT.cs
+++ b/src/cli/runtime/RT.cs
@@ -105,6 +105,16 @@ static public ISeq seq(Object coll) {
throw new ArgumentException("Don't know how to create ISeq from arg");
}
+static public ISeq keys(Object coll)
+ {
+ return APersistentMap.KeySeq.create(seq(coll));
+ }
+
+static public ISeq vals(Object coll)
+ {
+ return APersistentMap.ValSeq.create(seq(coll));
+ }
+
static public Object meta(Object x)
{
if (x == null)
diff --git a/src/jvm/clojure/lang/APersistentMap.java b/src/jvm/clojure/lang/APersistentMap.java
index f0e2d8da..4b5805fd 100644
--- a/src/jvm/clojure/lang/APersistentMap.java
+++ b/src/jvm/clojure/lang/APersistentMap.java
@@ -66,4 +66,48 @@ public int hashCode() {
return _hash;
}
+static public class KeySeq extends ASeq{
+ ISeq seq;
+
+ static public KeySeq create(ISeq seq){
+ if(seq == null)
+ return null;
+ return new KeySeq(seq);
+ }
+
+ private KeySeq(ISeq seq) {
+ this.seq = seq;
+ }
+
+ public Object first() {
+ return ((IMapEntry)seq.first()).key();
+ }
+
+ public ISeq rest() {
+ return create(seq.rest());
+ }
+}
+
+static public class ValSeq extends ASeq{
+ ISeq seq;
+
+ static public ValSeq create(ISeq seq){
+ if(seq == null)
+ return null;
+ return new ValSeq(seq);
+ }
+
+ private ValSeq(ISeq seq) {
+ this.seq = seq;
+ }
+
+ public Object first() {
+ return ((IMapEntry)seq.first()).val();
+ }
+
+ public ISeq rest() {
+ return create(seq.rest());
+ }
+}
+
}
diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java
index 037d8ca1..17b0999e 100644
--- a/src/jvm/clojure/lang/RT.java
+++ b/src/jvm/clojure/lang/RT.java
@@ -104,6 +104,14 @@ static public ISeq seq(Object coll) {
throw new IllegalAccessError("Don't know how to create ISeq from arg");
}
+static public ISeq keys(Object coll) {
+ return APersistentMap.KeySeq.create(seq(coll));
+}
+
+static public ISeq vals(Object coll) {
+ return APersistentMap.ValSeq.create(seq(coll));
+}
+
static public Object meta(Object x) {
if(x == null)
return null;