diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-12-09 14:24:08 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-12-09 14:24:08 +0000 |
commit | 3e01095b3f355c2f597dd6efc2a049caf682f5d1 (patch) | |
tree | 7e20dcbeff7cd30254d001780177917ba39c5bbb /src/jvm/clojure | |
parent | a273729aec06a817e077cb4c2fc1d3b7f517c3dd (diff) |
AFn implements Comparator
Diffstat (limited to 'src/jvm/clojure')
-rw-r--r-- | src/jvm/clojure/lang/AFn.java | 17 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentTreeMap.java | 10 |
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(), |