package xapi.collect.impl;
import xapi.gwt.collect.JsDictionary;
import xapi.util.api.ConvertsValue;
import xapi.util.api.ReceivesValue;
import java.util.Map.Entry;
import java.util.Iterator;
public class InitMapDefault <Key, Value> extends AbstractInitMap<Key,Value>{
protected final ConvertsValue<Key,Value> valueProvider;
private final JsDictionary<Value> map =
JsDictionary.create(null);// we send null and promise not to use value[]
public InitMapDefault(ConvertsValue<Key,String> keyProvider, ConvertsValue<Key,Value> valueProvider) {
super(keyProvider);
assert valueProvider != null : "Cannot use null value provider for init map.";
this.valueProvider = valueProvider;
}
public static <Key, Value> InitMapDefault<Key,Value> createInitMap(
ConvertsValue<Key,String> keyProvider, ConvertsValue<Key,Value> valueProvider) {
return new InitMapDefault<Key,Value>(keyProvider, valueProvider);
}
@Override
public boolean hasKey(String key) {
return map.containsKey(key);
}
@Override
public Value getValue(String key) {
return map.get(key);
}
@Override
public Value setValue(String key, Value value) {
return map.put(key, value);
}
@Override
public Value removeValue(String key) {
return map.removeAndReturn(key);
}
@Override
public void clearValues() {
map.clear();
}
@Override
public Value initialize(Key k) {
return valueProvider.convert(k);
}
@Override
public void forKeys(ReceivesValue<String> receiver) {
for (String key : map.keys())
receiver.set(key);
}
public Iterable<String> keys() {
return map.keys();
}
public Iterator<Entry<String, Value>> iterator() {
return map.entries().iterator();
}
}