Skip to content

Instantly share code, notes, and snippets.

@ZacharyL2
Created July 18, 2022 08:35
Show Gist options
  • Save ZacharyL2/433b2f2aabbd764afa1af6203d7f469a to your computer and use it in GitHub Desktop.
Save ZacharyL2/433b2f2aabbd764afa1af6203d7f469a to your computer and use it in GitHub Desktop.
const enum StepKey {
next = 'next',
throw = 'throw',
}
const generator2async = <
P extends any[],
T = unknown,
TReturn = any,
TNext = unknown,
>(
generatorFunction: (...args: P) => Generator<T, TReturn, TNext>,
) => {
return (...args: P) => {
const generator = generatorFunction(...args);
return new Promise<TReturn>((resolve, reject) => {
(function step(key: StepKey, previousValue?: T) {
let genResult: IteratorResult<T, TReturn>;
try {
genResult = generator[key](previousValue);
} catch (err) {
reject(err);
return;
}
const { value, done } = genResult;
if (done) {
resolve(value);
return;
}
Promise.resolve<T>(value).then(
(e) => {
step(StepKey.next, e);
},
(e) => {
step(StepKey.throw, e);
},
);
})(StepKey.next);
});
};
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment