diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/boot.clj | 17 | ||||
-rw-r--r-- | src/jvm/clojure/lang/APersistentMap.java | 6 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Keyword.java | 9 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentTreeMap.java | 26 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Symbol.java | 16 |
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); +} } |