#define _GLIBCXX_USE_NANOSLEEP
#define _GLIBCXX_USE_SCHED_YIELD
#include <thread>
#include <chrono>
#include <iostream>
#include <functional>
#include <string>
using namespace std;
template < class T>
struct Return
{
Return( T val) : _val( val) { }
void runCont( function< void ( T) > k)
{
k( _val) ;
}
T _val;
} ;
template < class T, class C1, class C2>
struct Bind
{
Bind( C1 const & ktor, function< C2( T) > rest)
: _ktor( ktor) , _rest( rest)
{ }
void runCont( function < void ( T) > k)
{
function< C2( T) > rest = _rest;
function< void ( T) > lambda = [ k, rest] ( T a)
{
return rest( a) .runCont ( k) ;
} ;
_ktor.runCont ( lambda) ;
}
C1 _ktor;
function< C2( T) > _rest;
} ;
void asyncApi( function< void ( string) > handler)
{
thread th( [ handler] ( ) {
cout << "Started async\n " ;
this_thread:: sleep_for ( chrono:: seconds ( 3 ) ) ;
handler( "Done async" ) ;
} ) ;
th.detach ( ) ;
}
// Continuator
struct AsyncApi {
void runCont( function< void ( string) > k) {
asyncApi( k) ;
}
} ;
struct Loop {
Loop( string s) : _s( s) { }
void runCont( function< void ( string) > k) {
cout << _s << endl;
Bind< string, AsyncApi, Loop> (
AsyncApi( ) ,
[ ] ( string s)
{
return Loop( s) ; // recursion?
} ) .runCont ( k) ;
}
string _s;
} ;
int main( )
{
Loop( "Loop: " ) .runCont ( [ ] ( string s)
{
cout << s << endl;
} ) ;
for ( int i = 0 ; i < 200 ; ++ i)
{
cout << "for : " << i << endl;
this_thread:: sleep_for ( chrono:: seconds ( 1 ) ) ;
}
}
I2RlZmluZSBfR0xJQkNYWF9VU0VfTkFOT1NMRUVQCiNkZWZpbmUgX0dMSUJDWFhfVVNFX1NDSEVEX1lJRUxECgojaW5jbHVkZSA8dGhyZWFkPgojaW5jbHVkZSA8Y2hyb25vPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgojaW5jbHVkZSA8c3RyaW5nPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlPGNsYXNzIFQ+CnN0cnVjdCBSZXR1cm4KewogICAgUmV0dXJuKFQgdmFsKSA6IF92YWwodmFsKSB7fQogICAgdm9pZCBydW5Db250KGZ1bmN0aW9uPHZvaWQgKFQpPiBrKQogICAgewogICAgICAgIGsoX3ZhbCk7CiAgICB9CgogICAgVCBfdmFsOwp9OwoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgQzEsIGNsYXNzIEMyPgpzdHJ1Y3QgQmluZAp7CiAgICBCaW5kKEMxIGNvbnN0ICZrdG9yLCBmdW5jdGlvbjxDMihUKT4gcmVzdCkKICAgICAgICA6ICAgX2t0b3Ioa3RvciksIF9yZXN0KHJlc3QpCiAgICB7fQoKICAgIHZvaWQgcnVuQ29udChmdW5jdGlvbiA8dm9pZChUKT4gaykKICAgIHsKICAgICAgICBmdW5jdGlvbjxDMihUKT4gcmVzdCA9IF9yZXN0OwogICAgICAgIGZ1bmN0aW9uPHZvaWQoVCk+IGxhbWJkYSA9IFtrLCByZXN0XShUIGEpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcmVzdChhKS5ydW5Db250KGspOwogICAgICAgIH07CiAgICAgICAgX2t0b3IucnVuQ29udChsYW1iZGEpOwogICAgfQoKICAgIEMxIF9rdG9yOwogICAgZnVuY3Rpb248QzIoVCk+IF9yZXN0Owp9OwoKdm9pZCBhc3luY0FwaShmdW5jdGlvbjx2b2lkKHN0cmluZyk+IGhhbmRsZXIpCnsKICAgIHRocmVhZCB0aChbaGFuZGxlcl0oKXsKICAgICAgICAgICAgY291dCA8PCAiU3RhcnRlZCBhc3luY1xuIjsKICAgICAgICAgICAgdGhpc190aHJlYWQ6OnNsZWVwX2ZvcihjaHJvbm86OnNlY29uZHMoMykpOwogICAgICAgICAgICBoYW5kbGVyKCJEb25lIGFzeW5jIik7CiAgICAgICAgICAgIH0pOwogICAgdGguZGV0YWNoKCk7Cn0KCi8vIENvbnRpbnVhdG9yCnN0cnVjdCBBc3luY0FwaSB7CiAgICB2b2lkIHJ1bkNvbnQoZnVuY3Rpb248dm9pZChzdHJpbmcpPiBrKSB7CiAgICAgICAgYXN5bmNBcGkoayk7CiAgICB9Cn07CgpzdHJ1Y3QgTG9vcCB7CiAgICBMb29wKHN0cmluZyBzKSA6IF9zKHMpIHt9CiAgICB2b2lkIHJ1bkNvbnQoZnVuY3Rpb248dm9pZChzdHJpbmcpPiBrKSB7CiAgICAgICAgY291dCA8PCBfcyA8PCBlbmRsOwogICAgICAgIEJpbmQ8c3RyaW5nLCBBc3luY0FwaSwgTG9vcD4gKAogICAgICAgICAgICBBc3luY0FwaSgpLAogICAgICAgICAgICBbXShzdHJpbmcgcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIExvb3Aocyk7IC8vIHJlY3Vyc2lvbj8KICAgICAgICAgICAgfSkucnVuQ29udChrKTsKICAgIH0KICAgIHN0cmluZyBfczsKfTsKCmludCBtYWluKCkKewogICAgTG9vcCgiTG9vcDogIikucnVuQ29udChbXShzdHJpbmcgcykKICAgIHsKICAgICAgICBjb3V0IDw8IHMgPDwgZW5kbDsKICAgIH0pOwoKICAgIGZvcihpbnQgaSA9IDA7IGkgPCAyMDA7ICsraSkKICAgIHsKICAgICAgICBjb3V0IDw8ICJmb3IgOiAiIDw8IGkgPDwgZW5kbDsKICAgICAgICB0aGlzX3RocmVhZDo6c2xlZXBfZm9yKGNocm9ubzo6c2Vjb25kcygxKSk7CiAgICB9Cn0K