#include <bits/stdc++.h>
using namespace std;
template<class...Ts>
struct sink:std::function<void(Ts...)>{
using std::function<void(Ts...)>::function;
};
template<class...Ts>
using source=sink<sink<Ts...>>;
template<class In, class Out>
using process=sink< source<In>, sink<Out> >;
template<class In, class Out>
sink<In> operator|( process< In, Out > a, sink< Out > b ){
return [a,b]( In in ){
a( [&in]( sink<In> s )mutable{ s(std::forward<In>(in)); }, b );
};
}
template<class In, class Out>
source<Out> operator|( source< In > a, process< In, Out > b ){
return [a,b]( sink<Out> out ){
b( a, out );
};
}
template<class In, class Mid, class Out>
process<In, Out> operator|( process<In, Mid> a, process<Mid, Out> b ){
return [a,b]( source<In> in, sink<Out> out ){
a( in, b|out ); // or b( in|a, out )
};
}
template<class...Ts>
sink<> operator|( source<Ts...> a, sink<Ts...> b ){
return[a,b]{ a(b); };
}
process<char, char> to_upper = []( source<char> in, sink<char> out ){
in( [&out]( char c ) { out( std::toupper(c) ); } );
};
process<char, char> with_new_line = []( source<char> in, sink<char> out ){
in( [&out]( char c ) { out(c);out('\n'); } );
};
source<char> hello_world = [ptr="hello world"]( sink<char> s ){
for (auto it = ptr; *it; ++it ){ s(*it); }
};
sink<char> print = [](char c){std::cout<<c;};
int main(){
auto prog = hello_world|to_upper|with_new_line|print;
prog();
/*string s="hello world";
for(auto&c:s){
auto out=std::toupper(c);string t;t.push_back(out);
cout<<t<<'\n';
}*/
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnRlbXBsYXRlPGNsYXNzLi4uVHM+CnN0cnVjdCBzaW5rOnN0ZDo6ZnVuY3Rpb248dm9pZChUcy4uLik+ewogIHVzaW5nIHN0ZDo6ZnVuY3Rpb248dm9pZChUcy4uLik+OjpmdW5jdGlvbjsKfTsKdGVtcGxhdGU8Y2xhc3MuLi5Ucz4KdXNpbmcgc291cmNlPXNpbms8c2luazxUcy4uLj4+Owp0ZW1wbGF0ZTxjbGFzcyBJbiwgY2xhc3MgT3V0Pgp1c2luZyBwcm9jZXNzPXNpbms8IHNvdXJjZTxJbj4sIHNpbms8T3V0PiA+Owp0ZW1wbGF0ZTxjbGFzcyBJbiwgY2xhc3MgT3V0PgpzaW5rPEluPiBvcGVyYXRvcnwoIHByb2Nlc3M8IEluLCBPdXQgPiBhLCBzaW5rPCBPdXQgPiBiICl7CiAgcmV0dXJuIFthLGJdKCBJbiBpbiApewogICAgYSggWyZpbl0oIHNpbms8SW4+IHMgKW11dGFibGV7IHMoc3RkOjpmb3J3YXJkPEluPihpbikpOyB9LCBiICk7CiAgfTsKfQp0ZW1wbGF0ZTxjbGFzcyBJbiwgY2xhc3MgT3V0Pgpzb3VyY2U8T3V0PiBvcGVyYXRvcnwoIHNvdXJjZTwgSW4gPiBhLCBwcm9jZXNzPCBJbiwgT3V0ID4gYiApewogIHJldHVybiBbYSxiXSggc2luazxPdXQ+IG91dCApewogICAgYiggYSwgb3V0ICk7CiAgfTsKfQoKdGVtcGxhdGU8Y2xhc3MgSW4sIGNsYXNzIE1pZCwgY2xhc3MgT3V0Pgpwcm9jZXNzPEluLCBPdXQ+IG9wZXJhdG9yfCggcHJvY2VzczxJbiwgTWlkPiBhLCBwcm9jZXNzPE1pZCwgT3V0PiBiICl7CiAgcmV0dXJuIFthLGJdKCBzb3VyY2U8SW4+IGluLCBzaW5rPE91dD4gb3V0ICl7CiAgICBhKCBpbiwgYnxvdXQgKTsgLy8gb3IgYiggaW58YSwgb3V0ICkKICB9Owp9CnRlbXBsYXRlPGNsYXNzLi4uVHM+CnNpbms8PiBvcGVyYXRvcnwoIHNvdXJjZTxUcy4uLj4gYSwgc2luazxUcy4uLj4gYiApewogIHJldHVyblthLGJdeyBhKGIpOyB9Owp9CnByb2Nlc3M8Y2hhciwgY2hhcj4gdG9fdXBwZXIgPSBbXSggc291cmNlPGNoYXI+IGluLCBzaW5rPGNoYXI+IG91dCApewogIGluKCBbJm91dF0oIGNoYXIgYyApIHsgb3V0KCBzdGQ6OnRvdXBwZXIoYykgKTsgfSApOwp9Owpwcm9jZXNzPGNoYXIsIGNoYXI+IHdpdGhfbmV3X2xpbmUgPSBbXSggc291cmNlPGNoYXI+IGluLCBzaW5rPGNoYXI+IG91dCApewogIGluKCBbJm91dF0oIGNoYXIgYyApIHsgb3V0KGMpO291dCgnXG4nKTsgfSApOwp9Owpzb3VyY2U8Y2hhcj4gaGVsbG9fd29ybGQgPSBbcHRyPSJoZWxsbyB3b3JsZCJdKCBzaW5rPGNoYXI+IHMgKXsKICBmb3IgKGF1dG8gaXQgPSBwdHI7ICppdDsgKytpdCApeyBzKCppdCk7IH0KfTsKc2luazxjaGFyPiBwcmludCA9IFtdKGNoYXIgYyl7c3RkOjpjb3V0PDxjO307CgppbnQgbWFpbigpewogIGF1dG8gcHJvZyA9IGhlbGxvX3dvcmxkfHRvX3VwcGVyfHdpdGhfbmV3X2xpbmV8cHJpbnQ7CiAgcHJvZygpOwogIC8qc3RyaW5nIHM9ImhlbGxvIHdvcmxkIjsKICBmb3IoYXV0byZjOnMpewogIAlhdXRvIG91dD1zdGQ6OnRvdXBwZXIoYyk7c3RyaW5nIHQ7dC5wdXNoX2JhY2sob3V0KTsKICAJY291dDw8dDw8J1xuJzsKICB9Ki8KfQ==