#include "emittra/emittra.hpp"
#include <iostream>
#include <string>
int main() {
emittra::Emittra emitter;
// Register an event listener
emitter.on("greet", [](const auto& respond, const std::vector<std::any>& args) {
std::cout << "Hello, " << std::any_cast<std::string>(args[0]) << "!" << std::endl;
});
// Emit an event
emitter.emit("greet", {"World"s});
// Process the emitted events
emitter.flush();
return 0;
}
#include "emittra/emittra.hpp"
#include <iostream>
#include <future>
int main() {
emittra::Emittra emitter;
emitter.on("calculate", [](const emittra::Emittra::RespondFunction& respond, const std::vector<std::any>& args) {
auto [a,b] = emittra::demarshall_args<int,int>(args);
respond(a + b);
});
auto result = emitter.request("calculate", {5, 3});
// Process the request
emitter.flush();
std::cout << "Result: " << std::any_cast<int>(result.get()) << std::endl;
return 0;
}
#include "emittra/emittra.hpp"
#include <iostream>
#include <thread>
#include <chrono>
#include <atomic>
int main() {
emittra::Emittra emitter;
std::atomic<bool> stop_processing{false};
std::thread worker([&emitter, &stop_processing]() {
emitter.on("data", [](const auto& respond, const auto& args) {
auto [value] = emittra::demarshall_args<int>(args);
std::cout << "Worker processed data: " << value << std::endl;
respond(value * 2);
});
auto events_cv = emitter.make_cv({"data"});
while (!stop_processing) {
emitter.flush({"data"});
emitter.wait_for_event(events_cv, std::chrono::milliseconds(100));
}
emitter.flush({"data"});
emitter.remove_all_listeners("data");
});
emitter.emit("data", {1});
emitter.emit("data", {2});
emitter.emit("data", {3});
auto future = emitter.request("data", {4});
auto result = std::any_cast<int>(future.get());
std::cout << "Main received result: " << result << std::endl;
stop_processing = true;
worker.join();
return 0;
}