#include <utility>
#include <iostream>
auto tuple = [](auto... args) { return [=](auto f) { return f(args...); }; };
auto map = [](auto... args) {
return [=](auto f) { return tuple(f(args)...); };
};
auto cat_raw = [](auto... largs) {
return [=](auto... rargs) { return tuple(largs..., rargs...); };
};
auto rcat = [](auto... largs) {
return [=](auto rhs) { return rhs(cat_raw)(largs...); };
};
auto print_tuple = [](auto t) {
return t(map)([](auto e) {
std::cout << e << " ";
return e;
});
};
class olo {
// olo(const& olo) = delete;
public:
olo() {}
operator const char*() { return "olo"; }
};
int main() {
auto t = tuple(5u, 6, 7l, 8.0, olo())(rcat)(tuple(1u, 2, 3l, 4.0));
print_tuple(t);
}
I2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCmF1dG8gdHVwbGUgPSBbXShhdXRvLi4uIGFyZ3MpIHsgcmV0dXJuIFs9XShhdXRvIGYpIHsgcmV0dXJuIGYoYXJncy4uLik7IH07IH07CgphdXRvIG1hcCA9IFtdKGF1dG8uLi4gYXJncykgewogIHJldHVybiBbPV0oYXV0byBmKSB7IHJldHVybiB0dXBsZShmKGFyZ3MpLi4uKTsgfTsKfTsKCmF1dG8gY2F0X3JhdyA9IFtdKGF1dG8uLi4gbGFyZ3MpIHsKICByZXR1cm4gWz1dKGF1dG8uLi4gcmFyZ3MpIHsgcmV0dXJuIHR1cGxlKGxhcmdzLi4uLCByYXJncy4uLik7IH07Cn07CgphdXRvIHJjYXQgPSBbXShhdXRvLi4uIGxhcmdzKSB7CiAgcmV0dXJuIFs9XShhdXRvIHJocykgeyByZXR1cm4gcmhzKGNhdF9yYXcpKGxhcmdzLi4uKTsgfTsKfTsKCmF1dG8gcHJpbnRfdHVwbGUgPSBbXShhdXRvIHQpIHsKICByZXR1cm4gdChtYXApKFtdKGF1dG8gZSkgewogICAgc3RkOjpjb3V0IDw8IGUgPDwgIiAiOwogICAgcmV0dXJuIGU7CiAgfSk7Cn07CgpjbGFzcyBvbG8gewovLwlvbG8oY29uc3QmIG9sbykgPSBkZWxldGU7CnB1YmxpYzoKCW9sbygpIHt9CglvcGVyYXRvciBjb25zdCBjaGFyKigpIHsgcmV0dXJuICJvbG8iOyB9Cn07CgppbnQgbWFpbigpIHsKICBhdXRvIHQgPSB0dXBsZSg1dSwgNiwgN2wsIDguMCwgb2xvKCkpKHJjYXQpKHR1cGxlKDF1LCAyLCAzbCwgNC4wKSk7CgogIHByaW50X3R1cGxlKHQpOwp9