diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-12-07 13:43:02 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-12-07 13:43:02 +0000 |
commit | 14287172ee1ea7549e83e115e8b943a94c444736 (patch) | |
tree | 554c93475ac778702ec6ed36d4b5f4d2121d78a6 | |
parent | e953a3bbe78362b8d180f72400af3cc6d3e6c641 (diff) |
added (get map key not-found-val) support
-rw-r--r-- | src/boot.clj | 7 | ||||
-rw-r--r-- | src/jvm/clojure/lang/IPersistentMap.java | 5 | ||||
-rw-r--r-- | src/jvm/clojure/lang/MapEntry.java | 6 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentArrayMap.java | 8 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentHashMap.java | 8 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentTreeMap.java | 8 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 10 |
7 files changed, 40 insertions, 12 deletions
diff --git a/src/boot.clj b/src/boot.clj index a67b37f8..869ad38a 100644 --- a/src/boot.clj +++ b/src/boot.clj @@ -254,8 +254,11 @@ (defn contains [map key] (. clojure.lang.RT (contains map key))) -(defn get [map key] - (. clojure.lang.RT (get map key))) +(defn get + ([map key] + (. clojure.lang.RT (get map key))) + ([map key not-found] + (. clojure.lang.RT (get map key not-found)))) (defn assoc [map key val] (. clojure.lang.RT (assoc map key val))) diff --git a/src/jvm/clojure/lang/IPersistentMap.java b/src/jvm/clojure/lang/IPersistentMap.java index c0632edc..4a7e2d48 100644 --- a/src/jvm/clojure/lang/IPersistentMap.java +++ b/src/jvm/clojure/lang/IPersistentMap.java @@ -11,11 +11,14 @@ package clojure.lang;
-public interface IPersistentMap extends Iterable, Associative {
+public interface IPersistentMap extends Iterable, Associative{
IPersistentMap assoc(Object key, Object val);
+
IPersistentMap assocEx(Object key, Object val) throws Exception;
IPersistentMap without(Object key);
+
+Object valAt(Object key, Object notFound);
}
diff --git a/src/jvm/clojure/lang/MapEntry.java b/src/jvm/clojure/lang/MapEntry.java index ae1207c3..f4e824df 100644 --- a/src/jvm/clojure/lang/MapEntry.java +++ b/src/jvm/clojure/lang/MapEntry.java @@ -54,8 +54,12 @@ public IPersistentMap assoc(Object key, Object val){ return new PersistentArrayMap(meta(), new Object[]{_key, _val, key, val});
}
+public Object valAt(Object key, Object notFound){
+ return RT.equal(_key, key) ? _val : notFound;
+}
+
public Object valAt(Object key){
- return RT.equal(_key, key) ? _val : null;
+ return valAt(key, null);
}
public IPersistentMap assocEx(Object key, Object val) throws Exception{
diff --git a/src/jvm/clojure/lang/PersistentArrayMap.java b/src/jvm/clojure/lang/PersistentArrayMap.java index 35ca450e..9a44d45f 100644 --- a/src/jvm/clojure/lang/PersistentArrayMap.java +++ b/src/jvm/clojure/lang/PersistentArrayMap.java @@ -146,11 +146,15 @@ IPersistentMap empty(){ return (IPersistentMap) EMPTY.withMeta(meta());
}
-final public Object valAt(Object key){
+final public Object valAt(Object key, Object notFound){
int i = indexOf(key);
if(i >= 0)
return array[i + 1];
- return null;
+ return notFound;
+}
+
+public Object valAt(Object key){
+ return valAt(key, null);
}
public int capacity(){
diff --git a/src/jvm/clojure/lang/PersistentHashMap.java b/src/jvm/clojure/lang/PersistentHashMap.java index 48d413f0..1529691b 100644 --- a/src/jvm/clojure/lang/PersistentHashMap.java +++ b/src/jvm/clojure/lang/PersistentHashMap.java @@ -108,11 +108,15 @@ public IPersistentMap assoc(Object key, Object val){ return new PersistentHashMap(meta(), addedLeaf.val == null ? count : count + 1, newroot); } -public Object valAt(Object key){ +public Object valAt(Object key, Object notFound){ IMapEntry e = entryAt(key); if(e != null) return e.val(); - return null; + return notFound; +} + +public Object valAt(Object key){ + return valAt(key, null); } public IPersistentMap assocEx(Object key, Object val) throws Exception{ diff --git a/src/jvm/clojure/lang/PersistentTreeMap.java b/src/jvm/clojure/lang/PersistentTreeMap.java index 8abbb69e..e3ad3546 100644 --- a/src/jvm/clojure/lang/PersistentTreeMap.java +++ b/src/jvm/clojure/lang/PersistentTreeMap.java @@ -197,9 +197,13 @@ int depth(Node t){ return 1 + Math.max(depth(t.left()), depth(t.right())); } -public Object valAt(Object key){ +public Object valAt(Object key, Object notFound){ Node n = entryAt(key); - return (n != null) ? n.val() : null; + return (n != null) ? n.val() : notFound; +} + +public Object valAt(Object key){ + return valAt(key, null); } public int capacity(){ diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index b2e1b16f..47265323 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -232,8 +232,8 @@ static public ISeq seq(Object coll){ return IteratorSeq.create(((Iterable) coll).iterator()); else if(coll instanceof Object[]) return ArraySeq.create((Object[]) coll); - else if(coll instanceof String) - return StringSeq.create((String) coll); + else if(coll instanceof Object[]) + return ArraySeq.create((Object[]) coll); else throw new IllegalAccessError("Don't know how to create ISeq from arg"); } @@ -318,6 +318,12 @@ static public Object get(Object coll, Object key){ return ((Associative) coll).valAt(key); } +static public Object get(Object coll, Object key, Object notFound){ + if(coll == null) + return notFound; + return ((IPersistentMap) coll).valAt(key, notFound); +} + static public Associative assoc(Object coll, Object key, Object val){ if(coll == null) return new MapEntry(key, val); |