package regexgolf2.model.containers; import java.util.Optional; import com.google.java.contract.Ensures; import regexgolf2.model.Word; import regexgolf2.services.persistence.PersistenceException; import regexgolf2.services.persistence.saving.Savable; import regexgolf2.services.persistence.saving.SaveVisitor; import regexgolf2.util.Validator; public class WordPool extends Container<Word> implements Savable { private final Validator<String> _textValidator; public WordPool() { _textValidator = createValidator(); } @Override public boolean add(Word item) { if (getWithText(item.getText()).isPresent()) return false; item.setTextValidator(_textValidator); return super.add(item); } @Ensures( { "result != null", "contains(result)" }) public Word getEmpty() { Optional<Word> emptyWord = getWithText(""); if (emptyWord.isPresent()) return emptyWord.get(); else { Word empty = new Word(); add(empty); return empty; } } private Validator<String> createValidator() { return s -> !getWithText(s).isPresent(); } private Optional<Word> getWithText(String text) { return stream().filter(w -> w.getText().equals(text)).findFirst(); } @Override public void accept(SaveVisitor visitor) throws PersistenceException { visitor.visit(this); } }