package nebula.data.impl;
import java.util.List;
import java.util.Set;
import nebula.data.Classificator;
import nebula.data.DataListener;
import nebula.data.Timable;
import com.google.common.base.Function;
import com.google.common.base.Objects;
import com.google.common.base.Preconditions;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ListMultimap;
public class DataClassificator<K, V extends Timable> implements DataListener<V>, Classificator<K, V> {
final ListMultimap<K, V> values = ArrayListMultimap.create();
final Function<V, K> indexFunction;
public DataClassificator(Function<V, K> indexFunction) {
this.indexFunction = indexFunction;
}
public DataClassificator(Iterable<V> values, Function<V, K> indexFunction) {
this.indexFunction = indexFunction;
for (V value : values) {
Preconditions.checkNotNull(value, values);
this.values.put(indexFunction.apply(value), value);
}
}
public void onAdd(V v) {
K classification = indexFunction.apply(v);
if (classification != null) this.values.get(classification).add(v);
}
public void onUpdate(V oldData, V newData) {
if (Objects.equal(oldData, newData)) {
return;
}
K oldClassification = indexFunction.apply(oldData);
K newClassification = indexFunction.apply(newData);
if (oldClassification != null) this.values.get(oldClassification).remove(oldData);
if (newClassification != null) this.values.get(newClassification).add(newData);
}
public void onRemove(V v) {
K classification = indexFunction.apply(v);
if (classification != null) this.values.get(classification).remove(v);
}
public Set<K> getClassifications() {
return this.values.keySet();
}
public List<V> getData(K classification) {
return this.values.get(classification);
}
@Override
public List<V> getData(K classification, K classification2) {
// TODO Not realized getData(K classification, K classification2)
return null;
}
}