summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-12-07 13:43:02 +0000
committerRich Hickey <richhickey@gmail.com>2007-12-07 13:43:02 +0000
commit14287172ee1ea7549e83e115e8b943a94c444736 (patch)
tree554c93475ac778702ec6ed36d4b5f4d2121d78a6
parente953a3bbe78362b8d180f72400af3cc6d3e6c641 (diff)
added (get map key not-found-val) support
-rw-r--r--src/boot.clj7
-rw-r--r--src/jvm/clojure/lang/IPersistentMap.java5
-rw-r--r--src/jvm/clojure/lang/MapEntry.java6
-rw-r--r--src/jvm/clojure/lang/PersistentArrayMap.java8
-rw-r--r--src/jvm/clojure/lang/PersistentHashMap.java8
-rw-r--r--src/jvm/clojure/lang/PersistentTreeMap.java8
-rw-r--r--src/jvm/clojure/lang/RT.java10
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);