diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-03-01 15:54:59 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-03-01 15:54:59 +0000 |
commit | 978af02b0a7e2b430c917b32b58215edcae2ad2d (patch) | |
tree | b1273f9e5635bc7fb2d5b7efd43c7b018105a9d6 /src | |
parent | 9aaa7bf632bf84a3d32788f23116d07e6fe2b1a8 (diff) |
made map entries vectors
Diffstat (limited to 'src')
-rw-r--r-- | src/jvm/clojure/lang/AMapEntry.java | 108 | ||||
-rw-r--r-- | src/jvm/clojure/lang/MapEntry.java | 160 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentArrayMap.java | 49 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentHashMap.java | 6 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentTreeMap.java | 6 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 18 |
6 files changed, 196 insertions, 151 deletions
diff --git a/src/jvm/clojure/lang/AMapEntry.java b/src/jvm/clojure/lang/AMapEntry.java new file mode 100644 index 00000000..c1113058 --- /dev/null +++ b/src/jvm/clojure/lang/AMapEntry.java @@ -0,0 +1,108 @@ +/** + * Copyright (c) Rich Hickey. All rights reserved. + * The use and distribution terms for this software are covered by the + * Common Public License 1.0 (http://opensource.org/licenses/cpl.php) + * which can be found in the file CPL.TXT at the root of this distribution. + * By using this software in any fashion, you are agreeing to be bound by + * the terms of this license. + * You must not remove this notice, or any other, from this software. + **/ + +/* rich Mar 1, 2008 */ + +package clojure.lang; + +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()); +} + +public int hashCode(){ + return RT.hashCombine(RT.hash(key()), RT.hash(val())); +} + +public String toString(){ + StringWriter sw = new StringWriter(); + try + { + RT.print(this,sw); + } + catch(Exception e) + { + //checked exceptions stink! + throw new RuntimeException(e); + } + return sw.toString(); +} + +public int length(){ + return 2; +} + +public Object nth(int i){ + if(i == 0) + return key(); + else if (i == 1) + return val(); + else + throw new IndexOutOfBoundsException(); +} + +private IPersistentVector asVector(){ + return PersistentVector.create(key(), val()); +} + +public IPersistentVector assocN(int i, Object val){ + return asVector().assocN(i, val); +} + +public int count(){ + return 2; +} + +public ISeq seq(){ + return asVector().seq(); +} + +public IPersistentVector cons(Object o){ + return asVector().cons(o); +} + +public boolean containsKey(Object key){ + return asVector().containsKey(key); +} + +public IMapEntry entryAt(Object key){ + return asVector().entryAt(key); +} + +public Associative assoc(Object key, Object val){ + return asVector().assoc(key,val); +} + +public Object valAt(Object key){ + return asVector().valAt(key); +} + +public Object valAt(Object key, Object notFound){ + return asVector().valAt(key,notFound); +} + +public Object peek(){ + return val(); +} + +public IPersistentStack pop(){ + return PersistentVector.create(key()); +} + +public ISeq rseq() throws Exception{ + return asVector().rseq(); +} +} diff --git a/src/jvm/clojure/lang/MapEntry.java b/src/jvm/clojure/lang/MapEntry.java index 7ab5041a..36469ac2 100644 --- a/src/jvm/clojure/lang/MapEntry.java +++ b/src/jvm/clojure/lang/MapEntry.java @@ -12,7 +12,7 @@ package clojure.lang; import java.util.Iterator;
-public class MapEntry extends APersistentMap implements IMapEntry{
+public class MapEntry extends AMapEntry{
final Object _key;
final Object _val;
@@ -22,15 +22,11 @@ public MapEntry(Object key, Object val){ }
-public MapEntry(IPersistentMap meta, Object _key, Object _val){
- super(meta);
- this._key = _key;
- this._val = _val;
-}
-
-public String toString(){
- return RT.entryString(_key, _val);
-}
+//public MapEntry(IPersistentMap meta, Object _key, Object _val){
+// super(meta);
+// this._key = _key;
+// this._val = _val;
+//}
public Object key(){
return _key;
@@ -52,78 +48,78 @@ public Object setValue(Object value){ throw new UnsupportedOperationException();
}
-public boolean containsKey(Object key){
- return RT.equal(_key, key);
-}
-
-public IMapEntry entryAt(Object key){
- return RT.equal(_key, key) ? this : null;
-}
-
-public IPersistentMap assoc(Object key, Object val){
- if(RT.equal(_key, key))
- {
- if(_val == val)
- return this;
- return new MapEntry(meta(), key, 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 valAt(key, null);
-}
-
-public IPersistentMap assocEx(Object key, Object val) throws Exception{
- if(RT.equal(_key, key))
- throw new Exception("Key already present");
- return assoc(key, val);
-}
-
-public IPersistentMap without(Object key){
- if(RT.equal(_key, key))
- return (IPersistentMap) PersistentArrayMap.EMPTY.withMeta(meta());
- return this;
-}
-
-public int count(){
- return 1;
-}
-
-public Iterator iterator(){
- return new Iter(this);
-}
-
-public MapEntry withMeta(IPersistentMap meta){
- return new MapEntry(meta, _key, _val);
-}
-
-static class Iter implements Iterator{
- MapEntry e;
-
- public Iter(MapEntry e){
- this.e = e;
- }
-
- public boolean hasNext(){
- return e != null;
- }
-
- public Object next(){
- Object ret = e;
- e = null;
- return ret;
- }
-
- public void remove(){
- throw new UnsupportedOperationException();
- }
-}
-
+//public boolean containsKey(Object key){
+// return RT.equal(_key, key);
+//}
+//
+//public IMapEntry entryAt(Object key){
+// return RT.equal(_key, key) ? this : null;
+//}
+//
+//public IPersistentMap assoc(Object key, Object val){
+// if(RT.equal(_key, key))
+// {
+// if(_val == val)
+// return this;
+// return new MapEntry(meta(), key, 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 valAt(key, null);
+//}
+//
+//public IPersistentMap assocEx(Object key, Object val) throws Exception{
+// if(RT.equal(_key, key))
+// throw new Exception("Key already present");
+// return assoc(key, val);
+//}
+//
+//public IPersistentMap without(Object key){
+// if(RT.equal(_key, key))
+// return (IPersistentMap) PersistentArrayMap.EMPTY.withMeta(meta());
+// return this;
+//}
+//
+//public int count(){
+// return 1;
+//}
+//
+//public Iterator iterator(){
+// return new Iter(this);
+//}
+//
+//public MapEntry withMeta(IPersistentMap meta){
+// return new MapEntry(meta, _key, _val);
+//}
+//
+//static class Iter implements Iterator{
+// MapEntry e;
+//
+// public Iter(MapEntry e){
+// this.e = e;
+// }
+//
+// public boolean hasNext(){
+// return e != null;
+// }
+//
+// public Object next(){
+// Object ret = e;
+// e = null;
+// return ret;
+// }
+//
+// public void remove(){
+// throw new UnsupportedOperationException();
+// }
+//}
+//
public ISeq seq(){
return new Seq(this);
diff --git a/src/jvm/clojure/lang/PersistentArrayMap.java b/src/jvm/clojure/lang/PersistentArrayMap.java index 01343bfe..a7672ca9 100644 --- a/src/jvm/clojure/lang/PersistentArrayMap.java +++ b/src/jvm/clojure/lang/PersistentArrayMap.java @@ -72,7 +72,7 @@ public boolean containsKey(Object key){ public IMapEntry entryAt(Object key){
int i = indexOf(key);
if(i >= 0)
- return new Iter(array, i);
+ return new MapEntry(key,array[i+1]);
return null;
}
@@ -186,7 +186,7 @@ public ISeq seq(){ return null;
}
-static class Seq extends ASeq implements IMapEntry{
+static class Seq extends ASeq{
final Object[] array;
final int i;
@@ -201,28 +201,8 @@ static class Seq extends ASeq implements IMapEntry{ this.i = i;
}
- public Object key(){
- return array[i];
- }
-
- public Object val(){
- return array[i + 1];
- }
-
- public Object getKey(){
- return key();
- }
-
- public Object getValue(){
- return val();
- }
-
- public Object setValue(Object value){
- throw new UnsupportedOperationException();
- }
-
public Object first(){
- return this;
+ return new MapEntry(array[i],array[i+1]);
}
public ISeq rest(){
@@ -240,7 +220,7 @@ static class Seq extends ASeq implements IMapEntry{ }
}
-static class Iter implements Iterator, IMapEntry{
+static class Iter implements Iterator{
Object[] array;
int i;
@@ -261,31 +241,12 @@ static class Iter implements Iterator, IMapEntry{ public Object next(){
i += 2;
- return this;
+ return new MapEntry(array[i],array[i+1]);
}
public void remove(){
throw new UnsupportedOperationException();
}
- public Object key(){
- return array[i];
- }
-
- public Object val(){
- return array[i + 1];
- }
-
- public Object getKey(){
- return key();
- }
-
- public Object getValue(){
- return val();
- }
-
- public Object setValue(Object value){
- throw new UnsupportedOperationException();
- }
}
}
diff --git a/src/jvm/clojure/lang/PersistentHashMap.java b/src/jvm/clojure/lang/PersistentHashMap.java index 38fa551d..acde076a 100644 --- a/src/jvm/clojure/lang/PersistentHashMap.java +++ b/src/jvm/clojure/lang/PersistentHashMap.java @@ -484,7 +484,7 @@ final static class BitmapIndexedNode implements INode{ } -final static class LeafNode implements INode, IMapEntry, Map.Entry{ +final static class LeafNode extends AMapEntry implements INode{ final int hash; final Object key; final Object val; @@ -495,10 +495,6 @@ final static class LeafNode implements INode, IMapEntry, Map.Entry{ this.val = val; } - public String toString(){ - return RT.entryString(key, val); - } - public INode assoc(int shift, int hash, Object key, Object val, Box addedLeaf){ if(hash == this.hash) { diff --git a/src/jvm/clojure/lang/PersistentTreeMap.java b/src/jvm/clojure/lang/PersistentTreeMap.java index f9d27e08..8383f4b4 100644 --- a/src/jvm/clojure/lang/PersistentTreeMap.java +++ b/src/jvm/clojure/lang/PersistentTreeMap.java @@ -404,7 +404,7 @@ static Black black(Object key, Object val, Node left, Node right){ return new BlackBranchVal(key, val, left, right); } -static abstract class Node implements IMapEntry{ +static abstract class Node extends AMapEntry{ final Object key; Node(Object key){ @@ -419,10 +419,6 @@ static abstract class Node implements IMapEntry{ return null; } - public String toString(){ - return RT.entryString(key(), val()); - } - public Object getKey(){ return key(); } diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index 9cdce742..52bf88db 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -463,7 +463,7 @@ static public Object get(Object coll, Object key, Object notFound){ static public Associative assoc(Object coll, Object key, Object val){ if(coll == null) - return new MapEntry(key, val); + return new PersistentArrayMap(new Object[]{key, val}); return ((Associative) coll).assoc(key, val); } @@ -492,10 +492,6 @@ static public Object find(Object coll, Object key){ return ((Associative) coll).entryAt(key); } -static public String entryString(Object key, Object val){ - return "<" + key + " " + val + ">"; -} - //takes a seq of key,val,key,val //returns tail starting at val of matching key if found, else null @@ -531,15 +527,7 @@ static public Object nth(Object coll, int n){ return ((List) coll).get(n); else if(coll instanceof Matcher) return ((Matcher) coll).group(n); - else if(coll instanceof Map.Entry) - { - Map.Entry e = (Map.Entry) coll; - if(n == 0) - return e.getKey(); - else if(n == 1) - return e.getValue(); - throw new IndexOutOfBoundsException(); - } + else if(coll instanceof Sequential) { ISeq seq = ((IPersistentCollection) coll).seq(); @@ -679,7 +667,7 @@ static public double doubleCast(Object x){ static public IPersistentMap map(Object... init){ if(init != null && init.length == 2) - return new MapEntry(init[0], init[1]); + return new PersistentArrayMap(init); return PersistentHashMap.create(init); } |