Skip to content

Commit

Permalink
TransientMap interface in clj-ds; changes in clj-lang for compatibility.
Browse files Browse the repository at this point in the history
  • Loading branch information
Stanislas Nanchen committed Aug 4, 2013
1 parent fdb1050 commit 9627762
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 16 deletions.
13 changes: 13 additions & 0 deletions src/main/java/com/trifork/clj_ds/TransientMap.java
@@ -0,0 +1,13 @@
package com.trifork.clj_ds;

import com.trifork.clj_lang.ITransientMap;

public interface TransientMap<K, V> extends ITransientMap<K, V> {

TransientMap<K,V> assoc(K key, V val);

TransientMap<K,V> without(K key);

PersistentMap<K,V> persistentMap();

}
17 changes: 16 additions & 1 deletion src/main/java/com/trifork/clj_ds/Transients.java
@@ -1,9 +1,11 @@
package com.trifork.clj_ds;

import com.trifork.clj_lang.PersistentArrayMap;
import com.trifork.clj_lang.PersistentHashMap;
import com.trifork.clj_lang.PersistentHashSet;
import com.trifork.clj_lang.PersistentVector;

public class Transients {
public final class Transients {

public static final <E> TransientVector<E> transientVector() {
return PersistentVector.<E>emptyVector().asTransient();
Expand All @@ -13,4 +15,17 @@ public static final <E> TransientSet<E> transientHashSet() {
return PersistentHashSet.<E>emptySet().asTransient();
}

@SuppressWarnings("unchecked")
public static final <K, V> TransientMap<K, V> transientHashMap() {
return PersistentHashMap.<K, V>emptyMap().asTransient();
}

@SuppressWarnings("unchecked")
public static final <K, V> TransientMap<K, V> transientArrayMap() {
return PersistentArrayMap.EMPTY.asTransient();
}

private Transients() {
}

}
17 changes: 9 additions & 8 deletions src/main/java/com/trifork/clj_lang/ATransientMap.java
Expand Up @@ -12,16 +12,17 @@

import java.util.Map;

import com.trifork.clj_lang.PersistentHashMap.INode;
import com.trifork.clj_ds.PersistentMap;
import com.trifork.clj_ds.TransientMap;


abstract class ATransientMap<K,V> extends AFn implements ITransientMap<K,V>{
abstract class ATransientMap<K,V> extends AFn implements ITransientMap<K,V>, TransientMap<K, V>{
abstract void ensureEditable();
abstract ITransientMap<K,V> doAssoc(K key, V val);
abstract ITransientMap<K,V> doWithout(K key);
abstract TransientMap<K,V> doAssoc(K key, V val);
abstract TransientMap<K,V> doWithout(K key);
abstract V doValAt(K key, V notFound);
abstract int doCount();
abstract IPersistentMap<K,V> doPersistent();
abstract PersistentMap<K,V> doPersistent();

public ITransientMap<K,V> conj(Map.Entry<K, V> o) {
ensureEditable();
Expand All @@ -40,17 +41,17 @@ public final V valAt(K key) {
return valAt(key, null);
}

public final ITransientMap<K,V> assoc(K key, V val) {
public final TransientMap<K,V> assoc(K key, V val) {
ensureEditable();
return doAssoc(key, val);
}

public final ITransientMap<K,V> without(K key) {
public final TransientMap<K,V> without(K key) {
ensureEditable();
return doWithout(key);
}

public final IPersistentMap<K,V> persistentMap() {
public final PersistentMap<K,V> persistentMap() {
ensureEditable();
return doPersistent();
}
Expand Down
9 changes: 5 additions & 4 deletions src/main/java/com/trifork/clj_lang/PersistentArrayMap.java
Expand Up @@ -14,6 +14,7 @@
import java.util.Map;

import com.trifork.clj_ds.PersistentMap;
import com.trifork.clj_ds.TransientMap;

/**
* Simple implementation of persistent map on an array
Expand Down Expand Up @@ -400,7 +401,7 @@ public void remove(){
}


public ITransientMap asTransient(){
public TransientArrayMap asTransient(){
return new TransientArrayMap(array);
}

Expand All @@ -425,7 +426,7 @@ private int indexOf(Object key){
return -1;
}

ITransientMap<K,V> doAssoc(K key, V val){
TransientMap<K,V> doAssoc(K key, V val){
int i = indexOf(key);
if(i >= 0) //already have key,
{
Expand All @@ -442,7 +443,7 @@ ITransientMap<K,V> doAssoc(K key, V val){
return this;
}

ITransientMap<K,V> doWithout(K key) {
TransientArrayMap<K,V> doWithout(K key) {
int i = indexOf(key);
if(i >= 0) //have key, will remove
{
Expand All @@ -467,7 +468,7 @@ int doCount() {
return len / 2;
}

IPersistentMap<K,V> doPersistent(){
PersistentArrayMap<K,V> doPersistent(){
ensureEditable();
owner = null;
Object[] a = new Object[len];
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/com/trifork/clj_lang/PersistentHashMap.java
Expand Up @@ -347,7 +347,7 @@ static final class TransientHashMap<K,V> extends ATransientMap<K,V> {
this.nullValue = nullValue;
}

ITransientMap<K,V> doAssoc(K key, V val) {
TransientHashMap<K,V> doAssoc(K key, V val) {
if (key == null) {
if (this.nullValue != val)
this.nullValue = (V) val;
Expand All @@ -367,7 +367,7 @@ ITransientMap<K,V> doAssoc(K key, V val) {
return this;
}

ITransientMap<K,V> doWithout(K key) {
TransientHashMap<K,V> doWithout(K key) {
if (key == null) {
if (!hasNull) return this;
hasNull = false;
Expand All @@ -385,7 +385,7 @@ ITransientMap<K,V> doWithout(K key) {
return this;
}

IPersistentMap<K,V> doPersistent() {
PersistentHashMap<K,V> doPersistent() {
edit.set(null);
return new PersistentHashMap<K,V>(count, root, hasNull, nullValue);
}
Expand Down

0 comments on commit 9627762

Please sign in to comment.