const Thunk = function (fn) {
return function (...args) {
return function (callback) {
return fn.call(this, ...args, callback)
}
}
}
function run(fn) {
let gen = fn()
function next(err, data) {
let result = gen.next(data)
if (result.done) return
result.value(next)
}
next()
}
let sleep = function (n, callback) {
setTimeout(() => {
console.log(n)
callback && callback(n)
}, n)
}
let sleepThunk = Thunk(sleep)
let gen = function* () {
let f1 = yield sleepThunk(1000)
let f2 = yield sleepThunk(1500)
let fn = yield sleepThunk(2000)
}
run(gen)
console