summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/boot.clj17
-rw-r--r--src/jvm/clojure/lang/APersistentMap.java6
-rw-r--r--src/jvm/clojure/lang/Keyword.java9
-rw-r--r--src/jvm/clojure/lang/PersistentTreeMap.java26
-rw-r--r--src/jvm/clojure/lang/Symbol.java16
5 files changed, 68 insertions, 6 deletions
diff --git a/src/boot.clj b/src/boot.clj
index d40d4699..f687c487 100644
--- a/src/boot.clj
+++ b/src/boot.clj
@@ -17,6 +17,14 @@
([& args]
(. clojure.lang.PersistentHashMap (create args))))
+(defn sorted-map
+ ([& args]
+ (. clojure.lang.PersistentTreeMap (create args))))
+
+(defn sorted-map-by
+ ([comparator & args]
+ (. clojure.lang.PersistentTreeMap (create comparator args))))
+
(defn meta [#^IObj x]
(. x (meta)))
@@ -208,9 +216,14 @@
(defn dissoc [coll key]
(. RT (dissoc coll key)))
-(defn count [coll]
- (. RT (count coll)))
+(defn find [coll key]
+ (. RT (find coll key)))
+
+(defn keys [map]
+ (. RT (keys map)))
+(defn vals [map]
+ (. RT (vals map)))
(defn andfn [& args]
(if (nil? (rest args))
diff --git a/src/jvm/clojure/lang/APersistentMap.java b/src/jvm/clojure/lang/APersistentMap.java
index 8e00853f..18481747 100644
--- a/src/jvm/clojure/lang/APersistentMap.java
+++ b/src/jvm/clojure/lang/APersistentMap.java
@@ -10,7 +10,7 @@
package clojure.lang;
-public abstract class APersistentMap extends Obj implements IPersistentMap{
+public abstract class APersistentMap extends AFn implements IPersistentMap{
int _hash = -1;
@@ -128,4 +128,8 @@ static public class ValSeq extends ASeq{
}
}
+
+public Object invoke(Object arg1) throws Exception{
+ return valAt(arg1);
+}
}
diff --git a/src/jvm/clojure/lang/Keyword.java b/src/jvm/clojure/lang/Keyword.java
index 1576a20d..479a9b2f 100644
--- a/src/jvm/clojure/lang/Keyword.java
+++ b/src/jvm/clojure/lang/Keyword.java
@@ -15,7 +15,7 @@ package clojure.lang;
import java.util.concurrent.ConcurrentHashMap;
-public class Keyword implements IFn{
+public class Keyword implements IFn, Comparable{
private static ConcurrentHashMap<Symbol, Keyword> table = new ConcurrentHashMap();
public final Symbol sym;
@@ -46,6 +46,11 @@ public Object invoke() throws Exception{
return AFn.throwArity();
}
+public int compareTo(Object o){
+ return sym.compareTo(((Keyword) o).sym);
+}
+
+
/**
* Indexer implements IFn for attr access
*
@@ -170,4 +175,6 @@ public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object
public Object applyTo(ISeq arglist) throws Exception{
return AFn.applyToHelper(this, arglist);
}
+
+
}
diff --git a/src/jvm/clojure/lang/PersistentTreeMap.java b/src/jvm/clojure/lang/PersistentTreeMap.java
index d56a803e..d806c610 100644
--- a/src/jvm/clojure/lang/PersistentTreeMap.java
+++ b/src/jvm/clojure/lang/PersistentTreeMap.java
@@ -28,6 +28,8 @@ public final Comparator comp;
public final Node tree;
public final int _count;
+final static public PersistentTreeMap EMPTY = new PersistentTreeMap();
+
public PersistentTreeMap(){
this(null);
}
@@ -36,7 +38,7 @@ public PersistentTreeMap withMeta(IPersistentMap meta){
return new PersistentTreeMap(meta, comp, tree, _count);
}
-public PersistentTreeMap(Comparator comp){
+private PersistentTreeMap(Comparator comp){
this(null, comp);
}
@@ -55,6 +57,28 @@ PersistentTreeMap(IPersistentMap meta, Comparator comp, Node tree, int _count){
this._count = _count;
}
+static public PersistentTreeMap create(ISeq items){
+ IPersistentMap ret = EMPTY;
+ for(; items != null; items = items.rest().rest())
+ {
+ if(items.rest() == null)
+ throw new IllegalArgumentException(String.format("No value supplied for key: %s", items.first()));
+ ret = ret.assoc(items.first(), RT.second(items));
+ }
+ return (PersistentTreeMap) ret;
+}
+
+static public PersistentTreeMap create(Comparator comp, ISeq items){
+ IPersistentMap ret = new PersistentTreeMap(comp);
+ for(; items != null; items = items.rest().rest())
+ {
+ if(items.rest() == null)
+ throw new IllegalArgumentException(String.format("No value supplied for key: %s", items.first()));
+ ret = ret.assoc(items.first(), RT.second(items));
+ }
+ return (PersistentTreeMap) ret;
+}
+
public boolean contains(Object key){
return entryAt(key) != null;
}
diff --git a/src/jvm/clojure/lang/Symbol.java b/src/jvm/clojure/lang/Symbol.java
index 43b05788..dcbce7b2 100644
--- a/src/jvm/clojure/lang/Symbol.java
+++ b/src/jvm/clojure/lang/Symbol.java
@@ -13,7 +13,7 @@
package clojure.lang;
-public class Symbol extends Obj{
+public class Symbol extends Obj implements Comparable{
//these must be interned strings!
public final String ns;
public final String name;
@@ -77,4 +77,18 @@ private Symbol(IPersistentMap meta, String ns, String name){
this.ns = ns;
this.hash = RT.hashCombine(name.hashCode(), RT.hash(ns));
}
+
+public int compareTo(Object o){
+ Symbol s = (Symbol) o;
+ if(this.equals(o))
+ return 0;
+ if(this.ns == null && s.ns != null)
+ return -1;
+ if(this.ns != null && s.ns == null)
+ return 1;
+ int nsc = this.name.compareTo(s.name);
+ if(nsc != 0)
+ return nsc;
+ return this.name.compareTo(s.name);
+}
}