summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-03-01 15:54:59 +0000
committerRich Hickey <richhickey@gmail.com>2008-03-01 15:54:59 +0000
commit978af02b0a7e2b430c917b32b58215edcae2ad2d (patch)
treeb1273f9e5635bc7fb2d5b7efd43c7b018105a9d6 /src
parent9aaa7bf632bf84a3d32788f23116d07e6fe2b1a8 (diff)
made map entries vectors
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/AMapEntry.java108
-rw-r--r--src/jvm/clojure/lang/MapEntry.java160
-rw-r--r--src/jvm/clojure/lang/PersistentArrayMap.java49
-rw-r--r--src/jvm/clojure/lang/PersistentHashMap.java6
-rw-r--r--src/jvm/clojure/lang/PersistentTreeMap.java6
-rw-r--r--src/jvm/clojure/lang/RT.java18
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);
}