(function (gen) {
return function (...args) {
var step = gen(...args);
return new Promise(resolve => {
next(0);
function next(state, awaited_data) {
if (state == -1) {
resolve(awaited_data);
return;
}
var [new_state, result] = step(state, awaited_data);
if (result && typeof result.then == 'function')
result.then(awaited_data => next(new_state, awaited_data));