diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-03-01 16:34:39 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-03-01 16:34:39 +0000 |
commit | 7705d1c11ba26627f4889f7b6afceb1e634c7839 (patch) | |
tree | ebf3a1543ed368949e28dfb734dba8f12e236e45 /src | |
parent | 978af02b0a7e2b430c917b32b58215edcae2ad2d (diff) |
unified map entry and vector equality and hash
support conj of vector pair onto map
Diffstat (limited to 'src')
-rw-r--r-- | src/jvm/clojure/lang/AMapEntry.java | 8 | ||||
-rw-r--r-- | src/jvm/clojure/lang/APersistentMap.java | 8 | ||||
-rw-r--r-- | src/jvm/clojure/lang/APersistentVector.java | 17 |
3 files changed, 19 insertions, 14 deletions
diff --git a/src/jvm/clojure/lang/AMapEntry.java b/src/jvm/clojure/lang/AMapEntry.java index c1113058..24313bf2 100644 --- a/src/jvm/clojure/lang/AMapEntry.java +++ b/src/jvm/clojure/lang/AMapEntry.java @@ -17,14 +17,12 @@ import java.io.StringWriter; public abstract class AMapEntry implements IMapEntry, IPersistentVector{ public boolean equals(Object obj){ - if(!(obj instanceof IMapEntry)) - return false; - IMapEntry o = (IMapEntry) obj; - return RT.equal(key(), o.key()) && RT.equal(val(), o.val()); + return APersistentVector.doEquals(this, obj); } public int hashCode(){ - return RT.hashCombine(RT.hash(key()), RT.hash(val())); + //must match logic in APersistentVector + return RT.hashCombine(RT.hashCombine(0,RT.hash(key())), RT.hash(val())); } public String toString(){ diff --git a/src/jvm/clojure/lang/APersistentMap.java b/src/jvm/clojure/lang/APersistentMap.java index 807dfe9c..9e7cc289 100644 --- a/src/jvm/clojure/lang/APersistentMap.java +++ b/src/jvm/clojure/lang/APersistentMap.java @@ -29,10 +29,12 @@ public String toString(){ }
public IPersistentCollection cons(Object o){
- if(o instanceof IMapEntry)
+ if(o instanceof IPersistentVector)
{
- IMapEntry e = (IMapEntry) o;
- return assoc(e.key(), e.val());
+ IPersistentVector v = (IPersistentVector) o;
+ if(v.count() != 2)
+ throw new IllegalArgumentException("Vector arg to map conj must be a pair");
+ return assoc(v.nth(0), v.nth(1));
}
IPersistentMap ret = this;
diff --git a/src/jvm/clojure/lang/APersistentVector.java b/src/jvm/clojure/lang/APersistentVector.java index 15ce1870..ffadc444 100644 --- a/src/jvm/clojure/lang/APersistentVector.java +++ b/src/jvm/clojure/lang/APersistentVector.java @@ -38,15 +38,15 @@ public ISeq rseq(){ return null; } -public boolean equals(Object obj){ +static boolean doEquals(IPersistentVector v, Object obj){ if(obj instanceof IPersistentVector) { IPersistentVector ma = (IPersistentVector) obj; - if(ma.count() != count() || ma.hashCode() != hashCode()) + if(ma.count() != v.count() || ma.hashCode() != v.hashCode()) return false; - for(int i = 0; i < count(); i++) + for(int i = 0; i < v.count(); i++) { - if(!RT.equal(nth(i), ma.nth(i))) + if(!RT.equal(v.nth(i), ma.nth(i))) return false; } } @@ -55,9 +55,9 @@ public boolean equals(Object obj){ if(!(obj instanceof Sequential)) return false; ISeq ms = ((IPersistentCollection) obj).seq(); - for(int i = 0; i < count(); i++, ms = ms.rest()) + for(int i = 0; i < v.count(); i++, ms = ms.rest()) { - if(ms == null || !RT.equal(nth(i), ms.first())) + if(ms == null || !RT.equal(v.nth(i), ms.first())) return false; } if(ms != null) @@ -65,6 +65,11 @@ public boolean equals(Object obj){ } return true; + +} + +public boolean equals(Object obj){ + return doEquals(this, obj); } public int hashCode(){ |