diff options
author | Rich Hickey <richhickey@gmail.com> | 2006-07-28 20:50:09 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2006-07-28 20:50:09 +0000 |
commit | 0c422d65c6dc16d9e2887695ee5f6fa3e07fe617 (patch) | |
tree | 3c18d16e2a02b9083f0e184fd6fd7826200bb71e /src/jvm/clojure | |
parent | 709e897e44e353f2bda74d1f5b4bcaf413bf5a54 (diff) |
derived from Obj, removed Exception declaration on withMeta
Diffstat (limited to 'src/jvm/clojure')
-rw-r--r-- | src/jvm/clojure/lang/AFn.java | 8 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Obj.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentArray.java | 8 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentArrayMap.java | 8 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentHashtableMap.java | 8 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentListIdentityMap.java | 59 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentListMap.java | 103 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentTreeMap.java | 31 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Symbol.java | 2 |
9 files changed, 155 insertions, 74 deletions
diff --git a/src/jvm/clojure/lang/AFn.java b/src/jvm/clojure/lang/AFn.java index ec54cc67..ae27e48b 100644 --- a/src/jvm/clojure/lang/AFn.java +++ b/src/jvm/clojure/lang/AFn.java @@ -99,9 +99,15 @@ public static Object throwArity() throw new IllegalArgumentException("Wrong number of args passed"); } -public Obj withMeta(IPersistentMap meta) throws Exception { +public Obj withMeta(IPersistentMap meta) { + try{ Obj ret = (Obj) clone(); ret._meta = meta; return ret; + } + catch(CloneNotSupportedException ignore) + { + return null; + } } } diff --git a/src/jvm/clojure/lang/Obj.java b/src/jvm/clojure/lang/Obj.java index 37af46be..3e3fe570 100644 --- a/src/jvm/clojure/lang/Obj.java +++ b/src/jvm/clojure/lang/Obj.java @@ -21,6 +21,6 @@ public IPersistentMap meta() { return _meta; } -abstract public Obj withMeta(IPersistentMap meta) throws Exception; +abstract public Obj withMeta(IPersistentMap meta); } diff --git a/src/jvm/clojure/lang/PersistentArray.java b/src/jvm/clojure/lang/PersistentArray.java index 9a51c526..2f5a5813 100644 --- a/src/jvm/clojure/lang/PersistentArray.java +++ b/src/jvm/clojure/lang/PersistentArray.java @@ -58,10 +58,16 @@ public ISeq seq() { return null; } -public Obj withMeta(IPersistentMap meta) throws Exception { +public Obj withMeta(IPersistentMap meta) { + try{ Obj ret = (Obj) clone(); ret._meta = meta; return ret; + } + catch(CloneNotSupportedException ignore) + { + return null; + } } static class Master{ diff --git a/src/jvm/clojure/lang/PersistentArrayMap.java b/src/jvm/clojure/lang/PersistentArrayMap.java index 19a1b255..c4bae5e7 100644 --- a/src/jvm/clojure/lang/PersistentArrayMap.java +++ b/src/jvm/clojure/lang/PersistentArrayMap.java @@ -46,10 +46,16 @@ IPersistentMap createHT(Object[] init){ return ret;
}
-public Obj withMeta(IPersistentMap meta) throws Exception {
+public Obj withMeta(IPersistentMap meta) {
+ try{
Obj ret = (Obj) clone();
ret._meta = meta;
return ret;
+ }
+ catch(CloneNotSupportedException ignore)
+ {
+ return null;
+ }
}
/**
diff --git a/src/jvm/clojure/lang/PersistentHashtableMap.java b/src/jvm/clojure/lang/PersistentHashtableMap.java index d60d15ba..c5e75a32 100644 --- a/src/jvm/clojure/lang/PersistentHashtableMap.java +++ b/src/jvm/clojure/lang/PersistentHashtableMap.java @@ -54,10 +54,16 @@ PersistentHashtableMap(int count,PersistentArray array,int growAt) { this.growAtCount = growAt;
}
-public Obj withMeta(IPersistentMap meta) throws Exception {
+public Obj withMeta(IPersistentMap meta) {
+ try{
Obj ret = (Obj) clone();
ret._meta = meta;
return ret;
+ }
+ catch(CloneNotSupportedException ignore)
+ {
+ return null;
+ }
}
int calcPrimeCapacity(int capacity) {
diff --git a/src/jvm/clojure/lang/PersistentListIdentityMap.java b/src/jvm/clojure/lang/PersistentListIdentityMap.java index 1eea34f3..0fd86339 100644 --- a/src/jvm/clojure/lang/PersistentListIdentityMap.java +++ b/src/jvm/clojure/lang/PersistentListIdentityMap.java @@ -28,13 +28,25 @@ import java.util.Iterator; * code duplication here is kind of gross, but most efficient
*/
-public class PersistentListIdentityMap implements IPersistentMap, IMapEntry, ISeq, ISequential
+public class PersistentListIdentityMap extends Obj implements IPersistentMap, IMapEntry, ISeq, ISequential,Cloneable
{
static public PersistentListIdentityMap EMPTY = new PersistentListIdentityMap();
static public PersistentListIdentityMap create(Object key, Object val){
- return new Tail(key, val);
+ return new Tail(key, val,null);
+}
+
+public Obj withMeta(IPersistentMap meta) {
+ try{
+ Obj ret = (Obj) clone();
+ ret._meta = meta;
+ return ret;
+ }
+ catch(CloneNotSupportedException ignore)
+ {
+ return null;
+ }
}
public Object key(){
@@ -66,7 +78,7 @@ public IPersistentMap add(Object key, Object val) throws Exception { }
public PersistentListIdentityMap put(Object key, Object val){
- return new Tail(key, val);
+ return new Tail(key, val,_meta);
}
public PersistentListIdentityMap remove(Object key){
@@ -103,7 +115,7 @@ static class Iter implements Iterator{ }
public boolean hasNext(){
- return e != EMPTY;
+ return e.count() > 0;
}
public Object next(){
@@ -125,10 +137,11 @@ static class Tail extends PersistentListIdentityMap { final Object _key;
final Object _val;
- Tail(Object key,Object val){
+ Tail(Object key,Object val,IPersistentMap meta){
this._key = key;
this._val = val;
- }
+ this._meta = meta;
+ }
PersistentListIdentityMap next(){
return EMPTY;
@@ -171,7 +184,7 @@ static class Tail extends PersistentListIdentityMap { {
throw new Exception("Key already present");
}
- return new Link(key,val,this);
+ return new Link(key,val,this,_meta);
}
public PersistentListIdentityMap put(Object key, Object val){
@@ -179,15 +192,18 @@ static class Tail extends PersistentListIdentityMap { {
if(val == _val)
return this;
- return new Tail(key,val);
+ return new Tail(key,val,_meta);
}
- return new Link(key,val,this);
+ return new Link(key,val,this,_meta);
}
public PersistentListIdentityMap remove(Object key){
if(key == _key)
- return EMPTY;
- return this;
+ {
+ if(_meta == null)
+ return EMPTY;
+ return (PersistentListIdentityMap) EMPTY.withMeta(_meta);
+ } return this;
}
public Object first() {
@@ -208,11 +224,12 @@ static class Link extends PersistentListIdentityMap { final Object _val;
final PersistentListIdentityMap _rest;
- Link(Object key,Object val,PersistentListIdentityMap next){
+ Link(Object key,Object val,PersistentListIdentityMap next,IPersistentMap meta){
this._key = key;
this._val = val;
this._rest = next;
- }
+ this._meta = meta;
+ }
public Object key(){
return _key;
@@ -246,7 +263,7 @@ static class Link extends PersistentListIdentityMap { {
throw new Exception("Key already present");
}
- return new Link(key,val,this);
+ return new Link(key,val,this,_meta);
}
public PersistentListIdentityMap put(Object key, Object val){
@@ -257,12 +274,16 @@ static class Link extends PersistentListIdentityMap { return this;
return create(_key,_val,remove(key));
}
- return new Link(key,val,this);
+ return new Link(key,val,this,_meta);
}
public PersistentListIdentityMap remove(Object key){
if(key == _key)
- return _rest;
+ {
+ if(_rest._meta == _meta)
+ return _rest;
+ return (PersistentListIdentityMap) _rest.withMeta(_meta);
+ }
PersistentListIdentityMap r = _rest.remove(key);
if(r == _rest) //not there
return this;
@@ -293,9 +314,9 @@ static class Link extends PersistentListIdentityMap { }
PersistentListIdentityMap create(Object k,Object v,PersistentListIdentityMap r){
- if(r == EMPTY)
- return new Tail(k,v);
- return new Link(k, v, r);
+ if(r.count() == 0)
+ return new Tail(k,v,_meta);
+ return new Link(k, v, r,_meta);
}
}
diff --git a/src/jvm/clojure/lang/PersistentListMap.java b/src/jvm/clojure/lang/PersistentListMap.java index 53777019..c2881363 100644 --- a/src/jvm/clojure/lang/PersistentListMap.java +++ b/src/jvm/clojure/lang/PersistentListMap.java @@ -26,15 +26,26 @@ import java.util.Iterator; * * null keys and values are ok, but you won't be able to distinguish a null value via get - use contains/find */ -public class PersistentListMap implements IPersistentMap, IMapEntry, ISeq, ISequential +public class PersistentListMap extends Obj implements IPersistentMap, IMapEntry, ISeq, ISequential, Cloneable { static public PersistentListMap EMPTY = new PersistentListMap(); static public PersistentListMap create(Object key, Object val){ - return new Tail(key, val); + return new Tail(key, val,null); } +public Obj withMeta(IPersistentMap meta) { + try{ + Obj ret = (Obj) clone(); + ret._meta = meta; + return ret; + } + catch(CloneNotSupportedException ignore) + { + return null; + } +} public Object key(){ return null; @@ -64,12 +75,12 @@ public IPersistentMap add(Object key, Object val) throws Exception { return put(key, val); } -public PersistentListMap put(Object key, Object val){ - return new Tail(key, val); +public PersistentListMap put(Object key, Object val) { + return new Tail(key, val,_meta); } -public PersistentListMap remove(Object key){ - return this; +public PersistentListMap remove(Object key) { + return this; } public Object get(Object key){ @@ -101,7 +112,7 @@ static class Iter implements Iterator{ } public boolean hasNext(){ - return e != EMPTY; + return e.count() != 0; } public Object next(){ @@ -123,10 +134,11 @@ static class Tail extends PersistentListMap { final Object _key; final Object _val; - Tail(Object key,Object val){ + Tail(Object key,Object val, IPersistentMap meta){ this._key = key; this._val = val; - } + this._meta = meta; + } PersistentListMap next(){ return EMPTY; @@ -169,7 +181,7 @@ static class Tail extends PersistentListMap { { throw new Exception("Key already present"); } - return new Link(key,val,this); + return new Link(key,val,this,_meta); } public PersistentListMap put(Object key, Object val){ @@ -177,16 +189,20 @@ static class Tail extends PersistentListMap { { if(val == _val) return this; - return new Tail(key,val); + return new Tail(key,val,_meta); } - return new Link(key,val,this); + return new Link(key,val,this,_meta); } - public PersistentListMap remove(Object key){ - if(equalKey(key,_key)) - return EMPTY; - return this; - } + public PersistentListMap remove(Object key) { + if(equalKey(key,_key)) + { + if(_meta == null) + return EMPTY; + return (PersistentListMap) EMPTY.withMeta(_meta); + } + return this; + } public Object first() { return this; @@ -207,11 +223,12 @@ static class Link extends PersistentListMap { final Object _val; final PersistentListMap _rest; - Link(Object key,Object val,PersistentListMap next){ + Link(Object key,Object val,PersistentListMap next,IPersistentMap meta){ this._key = key; this._val = val; this._rest = next; - } + this._meta = meta; + } public Object key(){ return _key; @@ -245,28 +262,32 @@ static class Link extends PersistentListMap { { throw new Exception("Key already present"); } - return new Link(key,val,this); + return new Link(key,val,this,_meta); } - public PersistentListMap put(Object key, Object val){ - IMapEntry e = find(key); - if(e != null) - { - if(e.val() == val) - return this; - return create(_key,_val,remove(key)); - } - return new Link(key,val,this); - } + public PersistentListMap put(Object key, Object val) { + IMapEntry e = find(key); + if(e != null) + { + if(e.val() == val) + return this; + return create(_key,_val,remove(key)); + } + return new Link(key,val,this,_meta); + } - public PersistentListMap remove(Object key){ - if(equalKey(key,_key)) - return _rest; - PersistentListMap r = _rest.remove(key); - if(r == _rest) //not there - return this; - return create(_key,_val,r); - } + public PersistentListMap remove(Object key) { + if(equalKey(key,_key)) + { + if(_rest._meta == _meta) + return _rest; + return (PersistentListMap) _rest.withMeta(_meta); + } + PersistentListMap r = _rest.remove(key); + if(r == _rest) //not there + return this; + return create(_key,_val,r); + } public Object get(Object key){ IMapEntry e = find(key); @@ -292,9 +313,9 @@ static class Link extends PersistentListMap { } PersistentListMap create(Object k,Object v,PersistentListMap r){ - if(r == EMPTY) - return new Tail(k,v); - return new Link(k, v, r); + if(r.count() == 0) + return new Tail(k,v,_meta); + return new Link(k, v, r,_meta); } } diff --git a/src/jvm/clojure/lang/PersistentTreeMap.java b/src/jvm/clojure/lang/PersistentTreeMap.java index 5b978215..c83378c6 100644 --- a/src/jvm/clojure/lang/PersistentTreeMap.java +++ b/src/jvm/clojure/lang/PersistentTreeMap.java @@ -22,7 +22,7 @@ import java.util.*; * See Okasaki, Kahrs, Larsen et al */ -public class PersistentTreeMap implements IPersistentMap, ISequential { +public class PersistentTreeMap extends Obj implements IPersistentMap, ISequential, Cloneable { public final Comparator comp; public final Node tree; @@ -38,6 +38,18 @@ public PersistentTreeMap(Comparator comp){ _count = 0; } +public Obj withMeta(IPersistentMap meta) { + try{ + Obj ret = (Obj) clone(); + ret._meta = meta; + return ret; + } + catch(CloneNotSupportedException ignore) + { + return null; + } +} + public boolean contains(Object key){ return find(key) != null; } @@ -49,7 +61,7 @@ public PersistentTreeMap add(Object key, Object val) throws Exception { { throw new Exception("Key already present"); } - return new PersistentTreeMap(comp, t.blacken(), _count + 1); + return new PersistentTreeMap(comp, t.blacken(), _count + 1, _meta); } public PersistentTreeMap put(Object key, Object val){ @@ -60,9 +72,9 @@ public PersistentTreeMap put(Object key, Object val){ Node foundNode = (Node) found.val; if(foundNode.val() == val) //note only get same collection on identity of val, not equals() return this; - return new PersistentTreeMap(comp, replace(tree, key, val), _count); + return new PersistentTreeMap(comp, replace(tree, key, val), _count,_meta); } - return new PersistentTreeMap(comp, t.blacken(), _count + 1); + return new PersistentTreeMap(comp, t.blacken(), _count + 1,_meta); } @@ -74,9 +86,11 @@ public PersistentTreeMap remove(Object key){ if(found.val == null)//null == doesn't contain key return this; //empty - return new PersistentTreeMap(comp); - } - return new PersistentTreeMap(comp, t.blacken(), _count - 1); + PersistentTreeMap ret = new PersistentTreeMap(comp); + ret._meta = _meta; + return ret; + } + return new PersistentTreeMap(comp, t.blacken(), _count - 1,_meta); } public ISeq seq() throws Exception { @@ -328,10 +342,11 @@ Node replace(Node t, Object key, Object val){ c > 0 ? replace(t.right(), key, val) : t.right()); } -PersistentTreeMap(Comparator comp, Node tree, int count){ +PersistentTreeMap(Comparator comp, Node tree, int count, IPersistentMap meta){ this.comp = comp; this.tree = tree; this._count = count; + this._meta = meta; } static Red red(Object key, Object val, Node left, Node right){ diff --git a/src/jvm/clojure/lang/Symbol.java b/src/jvm/clojure/lang/Symbol.java index 4351d5bb..fc97543c 100644 --- a/src/jvm/clojure/lang/Symbol.java +++ b/src/jvm/clojure/lang/Symbol.java @@ -84,7 +84,7 @@ public int compareTo(Object o) { return hashCode() - ((Symbol)o).hashCode(); } -public Obj withMeta(IPersistentMap meta) throws Exception { +public Obj withMeta(IPersistentMap meta) { this._meta = meta; return this; } |