90 using Text2TextMap = std::map<std::string, std::string>;
93 struct TranslationDictionary :
public TopicState 95 TranslationDictionary()
96 : map(
std::make_shared<Text2TextMap>())
100 TranslationDictionary(
const std::shared_ptr<const Text2TextMap>& aMapPtr)
105 bool Lookup(std::string inStr, std::string& outStr)
const 107 Text2TextMap::const_iterator lookupIterator = map->find(inStr);
108 if (lookupIterator != map->end())
110 outStr = lookupIterator->second;
119 std::shared_ptr<const Text2TextMap> map;
125 EnglishText(std::string aText =
"") : text(aText) {}
131 PortugueseText(std::string aText =
"") : text(aText) {}
140 class EnglishToPortugueseTranslator :
147 EnglishToPortugueseTranslator(
Graph* graph) :
Detector(graph)
149 Subscribe<TranslationDictionary>(
this);
150 Subscribe<EnglishText>(
this);
151 SetupPublishing<PortugueseText>(
this);
155 TranslationDictionary mDatabase;
157 virtual void Evaluate(
const TranslationDictionary& aDatabase)
159 mDatabase = aDatabase;
162 virtual void Evaluate(
const EnglishText& aEnglishText)
164 std::vector<std::string> outputWords;
165 auto englishWords = split(aEnglishText.text,
"\\s+");
166 for (
auto inWord : englishWords)
169 bool hasTranslation = mDatabase.Lookup(inWord, outWord);
170 outputWords.push_back((hasTranslation) ? outWord : inWord);
173 Publish(PortugueseText(join(outputWords,
" ")));
177 std::vector<std::string> split(
const std::string& input,
const std::string& regex) {
178 std::regex re(regex);
180 std::sregex_token_iterator first{input.begin(), input.end(), re, -1 };
181 std::sregex_token_iterator last;
182 return {first, last};
184 std::string join(
const std::vector<std::string>& lst,
const std::string& delim)
187 for(
const auto &s : lst) {
204 TextTranslatorGraph() : mEnglishToPortugueseTranslator(&mGraph)
208 virtual void ProcessOutput()
210 auto actionRequestTopic = mGraph.ResolveTopic<PortugueseText>();
211 if (actionRequestTopic->HasNewValue())
213 const PortugueseText& actionRequest = actionRequestTopic->GetNewValue();
214 cout << actionRequest.text << endl;
219 EnglishToPortugueseTranslator mEnglishToPortugueseTranslator;
224 TextTranslatorGraph graph;
226 std::shared_ptr<Text2TextMap> database = std::make_shared<Text2TextMap>();
227 database->insert({
"brown",
"marrom"});
228 database->insert({
"dog",
"cao"});
229 database->insert({
"fox",
"raposao"});
230 database->insert({
"jumped",
"pulou"});
231 database->insert({
"lazy",
"preguicoso"});
232 database->insert({
"over",
"sobre"});
233 database->insert({
"quick",
"rapido"});
234 database->insert({
"the",
"o"});
237 graph.ProcessData(TranslationDictionary(database));
239 graph.ProcessData(EnglishText(
"the quick brown fox jumped over the lazy dog"));
Implements a graph of Topics & Detectors with Input/Output APIs.
A Base class for a basic Graph container.
Base struct for topic data types.
Base class that implements a Publisher behavior.
A unit of logic in a DetectorGraph.
A Pure interface that declares the Subscriber behavior.