package openmods.datastore;
import com.google.common.collect.Sets;
import java.util.Map;
import java.util.Set;
import openmods.utils.io.IStreamReader;
import openmods.utils.io.IStreamWriter;
public class DataStoreWrapper<K, V> {
private final DataStore<K, V> localData;
private DataStore<K, V> activeData;
private final Set<IDataVisitor<K, V>> visitors = Sets.newIdentityHashSet();
private final IStreamWriter<K> keyWriter;
private final IStreamWriter<V> valueWriter;
private final IStreamReader<K> keyReader;
private final IStreamReader<V> valueReader;
DataStoreWrapper(Map<K, V> localData, IStreamWriter<K> keyWriter, IStreamWriter<V> valueWriter, IStreamReader<K> keyReader, IStreamReader<V> valueReader) {
this.localData = new DataStore<K, V>(localData);
this.keyWriter = keyWriter;
this.valueWriter = valueWriter;
this.keyReader = keyReader;
this.valueReader = valueReader;
}
private void notifyVisitors() {
for (IDataVisitor<K, V> visitor : visitors)
activeData.visit(visitor);
}
public void activateData(DataStore<K, V> data) {
this.activeData = data;
notifyVisitors();
}
public void activateLocalData() {
this.activeData = localData;
notifyVisitors();
}
public DataStoreReader<K, V> createReader() {
return new DataStoreReader<K, V>(this, keyReader, valueReader);
}
public DataStoreWriter<K, V> createWriter() {
return new DataStoreWriter<K, V>(localData, keyWriter, valueWriter);
}
public DataStore<K, V> localData() {
return localData;
}
public DataStore<K, V> activeData() {
return activeData;
}
public void addVisitor(IDataVisitor<K, V> visitor) {
visitors.add(visitor);
}
}