package org.ggp.base.util.reasoner.gdl;
import java.util.Collections;
import java.util.Map;
import java.util.Map.Entry;
import org.ggp.base.util.gdl.grammar.GdlSentence;
import org.ggp.base.util.gdl.model.SentenceForm;
import org.ggp.base.util.gdl.model.assignments.AddibleFunctionInfo;
import org.ggp.base.util.gdl.model.assignments.MutableFunctionInfo;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multimaps;
import com.google.common.collect.SetMultimap;
/**
* Contains a set of GdlSentences arranged by SentenceForm and the
* associated FunctionInfo for each SentenceForm. The FunctionInfos
* are continually and automatically maintained as sentences are
* added to the set.
*
* Note that this class is not thread-safe.
*/
public class GdlSentenceSet {
private final SetMultimap<SentenceForm, GdlSentence> sentences;
private final Map<SentenceForm, AddibleFunctionInfo> functionInfoMap;
private GdlSentenceSet() {
this.sentences = HashMultimap.create();
this.functionInfoMap = Maps.newHashMap();
}
public static GdlSentenceSet create() {
return new GdlSentenceSet();
}
public static GdlSentenceSet create(Multimap<SentenceForm, GdlSentence> sentences) {
GdlSentenceSet result = create();
result.putAll(sentences);
return result;
}
/**
* Returns an unmodifiable view of the sentences in this set.
* Note that this view may change if the collection is concurrently
* modified.
*/
public SetMultimap<SentenceForm, GdlSentence> getSentences() {
return Multimaps.unmodifiableSetMultimap(sentences);
}
/**
* Returns true iff the given sentence is in this set of sentences.
*/
public boolean containsSentence(SentenceForm form, GdlSentence sentence) {
return sentences.containsEntry(form, sentence);
}
public void putAll(Multimap<SentenceForm, GdlSentence> newSentences) {
for (Entry<SentenceForm, GdlSentence> entry : newSentences.entries()) {
put(entry.getKey(), entry.getValue());
}
}
public void put(SentenceForm form, GdlSentence sentence) {
if (!containsSentence(form, sentence)) {
sentences.put(form, sentence);
if (!functionInfoMap.containsKey(form)) {
functionInfoMap.put(form, MutableFunctionInfo.create(form));
}
functionInfoMap.get(form).addSentence(sentence);
}
}
/**
* Returns an unmodifiable view of the function information
*/
public Map<SentenceForm, AddibleFunctionInfo> getFunctionInfo() {
return Collections.unmodifiableMap(functionInfoMap);
}
}