ulib/3party/rxcpp/Rx/v2/examples/println/main.cpp
2024-01-10 09:33:36 +08:00

70 lines
1.7 KiB
C++

#include "rxcpp/rx.hpp"
// create alias' to simplify code
// these are owned by the user so that
// conflicts can be managed by the user.
namespace rx=rxcpp;
namespace rxu=rxcpp::util;
#include<string>
// At this time, RxCpp will fail to compile if the contents
// of the std namespace are merged into the global namespace
// DO NOT USE: 'using namespace std;'
#if 0
//
// println will insert values into the specified stream
//
template<class OStream>
struct println_function
{
OStream& os;
println_function(OStream& os) : os(os) {}
template<class... TN>
void operator()(const TN&... tn) const {
bool inserts[] = {(os << tn, true)...};
os << std::endl;
}
template<class... TN>
void operator()(const std::tuple<TN...>& tpl) const {
apply(tpl, *this);
}
};
template<class OStream>
auto println(OStream& os)
-> println_function<OStream> {
return println_function<OStream>(os);
}
#endif
#ifdef UNICODE
int wmain()
#else
int main()
#endif
{
auto get_names = [](){return rx::observable<>::from<std::string>(
"Matthew",
"Aaron"
);};
std::cout << "===== println stream of std::string =====" << std::endl;
auto hello_str = [&](){return get_names().map([](std::string n){
return "Hello, " + n + "!";
}).as_dynamic();};
hello_str().subscribe(rxu::println(std::cout));
std::cout << "===== println stream of std::tuple =====" << std::endl;
auto hello_tpl = [&](){return get_names().map([](std::string n){
return std::make_tuple("Hello, ", n, "! (", n.size(), ")");
}).as_dynamic();};
hello_tpl().subscribe(rxu::println(std::cout));
hello_tpl().subscribe(rxu::print_followed_by(std::cout, " and "), rxu::endline(std::cout));
return 0;
}