package jas.spawner.refactor.entities;
import jas.spawner.refactor.entities.GenericGroup.GenericGroups;
import jas.spawner.refactor.entities.GenericGroup.ReversibleGenericGroups;
import java.util.HashMap;
import java.util.Map;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ListMultimap;
public class GenericGroupsHelper {
public static class ImmutableMapBuilder<PID, ID, CONTENT, RESULT, GROUP extends GenericGroup<ID, CONTENT, RESULT>>
implements GenericGroups.ImmutableMapBuilder<PID, ID, CONTENT, RESULT, GROUP> {
private HashMap<ID, GROUP> iDToGroup = new HashMap<ID, GROUP>();
private PID key;
@Override
public PID key() {
return key;
}
public ImmutableMapBuilder(PID key) {
this.key = key;
}
@Override
public Map<ID, GROUP> iDToGroup() {
return iDToGroup;
}
@Override
public void clear() {
iDToGroup.clear();
}
@Override
public void removeGroup(GROUP group) {
iDToGroup.remove(group.iD());
}
@Override
public void addGroup(GROUP group) {
iDToGroup.put(group.iD(), group);
}
@Override
public ImmutableMap<ID, GROUP> buildIDToGroup() {
return ImmutableMap.<ID, GROUP> builder().putAll(iDToGroup).build();
}
}
public static class ReversibleImmutableMapBuilder<PID, ID, CONTENT, RESULT, GROUP extends GenericGroup<ID, CONTENT, RESULT>>
implements ReversibleGenericGroups.ImmutableMapBuilder<PID, ID, CONTENT, RESULT, GROUP> {
private HashMap<ID, GROUP> iDToGroup = new HashMap<ID, GROUP>();
private ListMultimap<RESULT, ID> mappingToGroupIDBuilder = ArrayListMultimap.create();
private PID key;
@Override
public PID key() {
return key;
}
public ReversibleImmutableMapBuilder(PID key) {
this.key = key;
}
@Override
public Map<ID, GROUP> iDToGroup() {
return iDToGroup;
}
@Override
public void clear() {
iDToGroup.clear();
mappingToGroupIDBuilder.clear();
}
@Override
public void removeGroup(GROUP group) {
iDToGroup.remove(group.iD());
for (RESULT mapping : group.results()) {
mappingToGroupIDBuilder.get(mapping).remove(group.iD());
}
}
@Override
public void addGroup(GROUP group) {
iDToGroup.put(group.iD(), group);
for (RESULT mapping : group.results()) {
mappingToGroupIDBuilder.get(mapping).add(group.iD());
}
}
@Override
public ImmutableMap<ID, GROUP> buildIDToGroup() {
return ImmutableMap.<ID, GROUP> builder().putAll(iDToGroup).build();
}
@Override
public ImmutableListMultimap<RESULT, ID> buildMappingToGroupID() {
return ImmutableListMultimap.<RESULT, ID> builder().putAll(mappingToGroupIDBuilder).build();
}
}
}