function* dashboard(user) {
    const departure = yield getDeparture(user)
    const weather = yield getWeather(departure)
    const forecast = yield getForecast(departure)
    return {departure, weather, forecast}
}


var generator = dashboard(user);
triggerGenerators(generator)
.catch(e => {
    console.log('recovering from ' + e.message)
})
.then(result => {
  console.log(`done!, ${result}`)
});


//library
function triggerGenerators(generator) {
    return new Promise(function (resolve, reject)=> {
      doItAgain(() => generator.next());

       function doItAgain(continue) {
          let next
           try {
             continue()
           } catch(e => {
             reject(e)
             return
           })
           if(next.done) {
             resolve(next.value)
             return
           }
           const promise = Promise.resolve(next.value)
           promise.then(
             success => doItAgain(() => generator.next(success)),
             error => doItAgain(() => generator.throw(error)))
         }

    })

}