summaryrefslogtreecommitdiff
path: root/src/jvm/clojure
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-12-09 14:24:08 +0000
committerRich Hickey <richhickey@gmail.com>2007-12-09 14:24:08 +0000
commit3e01095b3f355c2f597dd6efc2a049caf682f5d1 (patch)
tree7e20dcbeff7cd30254d001780177917ba39c5bbb /src/jvm/clojure
parenta273729aec06a817e077cb4c2fc1d3b7f517c3dd (diff)
AFn implements Comparator
Diffstat (limited to 'src/jvm/clojure')
-rw-r--r--src/jvm/clojure/lang/AFn.java17
-rw-r--r--src/jvm/clojure/lang/PersistentTreeMap.java10
2 files changed, 21 insertions, 6 deletions
diff --git a/src/jvm/clojure/lang/AFn.java b/src/jvm/clojure/lang/AFn.java
index 0589821a..eeba3ca4 100644
--- a/src/jvm/clojure/lang/AFn.java
+++ b/src/jvm/clojure/lang/AFn.java
@@ -12,7 +12,9 @@
package clojure.lang;
-public abstract class AFn extends Obj implements IFn{
+import java.util.Comparator;
+
+public abstract class AFn extends Obj implements IFn, Comparator{
public AFn(IPersistentMap meta){
super(meta);
@@ -29,6 +31,19 @@ public Object call() throws Exception{
return invoke();
}
+
+public int compare(Object o1, Object o2){
+ try
+ {
+ Number n = (Number) invoke(o1, o2);
+ return n.intValue();
+ }
+ catch(Exception e)
+ {
+ throw new RuntimeException(e);
+ }
+}
+
public Object invoke() throws Exception{
return throwArity();
}
diff --git a/src/jvm/clojure/lang/PersistentTreeMap.java b/src/jvm/clojure/lang/PersistentTreeMap.java
index f0db84ee..2015a8e0 100644
--- a/src/jvm/clojure/lang/PersistentTreeMap.java
+++ b/src/jvm/clojure/lang/PersistentTreeMap.java
@@ -218,7 +218,7 @@ public Node entryAt(Object key){
Node t = tree;
while(t != null)
{
- int c = compare(key, t.key);
+ int c = doCompare(key, t.key);
if(c == 0)
return t;
else if(c < 0)
@@ -229,7 +229,7 @@ public Node entryAt(Object key){
return t;
}
-int compare(Object k1, Object k2){
+public int doCompare(Object k1, Object k2){
if(comp != null)
return comp.compare(k1, k2);
return ((Comparable) k1).compareTo(k2);
@@ -242,7 +242,7 @@ Node add(Node t, Object key, Object val, Box found){
return new Red(key);
return new RedVal(key, val);
}
- int c = compare(key, t.key);
+ int c = doCompare(key, t.key);
if(c == 0)
{
found.val = t;
@@ -259,7 +259,7 @@ Node add(Node t, Object key, Object val, Box found){
Node remove(Node t, Object key, Box found){
if(t == null)
return null; //not found indicator
- int c = compare(key, t.key);
+ int c = doCompare(key, t.key);
if(c == 0)
{
found.val = t;
@@ -366,7 +366,7 @@ static Node rightBalance(Object key, Object val, Node left, Node ins){
}
Node replace(Node t, Object key, Object val){
- int c = compare(key, t.key);
+ int c = doCompare(key, t.key);
return t.replace(t.key,
c == 0 ? val : t.val(),
c < 0 ? replace(t.left(), key, val) : t.left(),