diff --git a/src/async.js b/src/async.js new file mode 100644 index 0000000000..8285c73ccd --- /dev/null +++ b/src/async.js @@ -0,0 +1,28 @@ +import { curryN, bind } from 'ramda'; + +import resolveP from './resolveP'; +import rejectP from './rejectP'; + +const async = generatorFn => + curryN(generatorFn.length, function asyncWrapper(...args) { + const iterator = bind(generatorFn, this)(...args); + + const handle = result => { + const resolved = resolveP(result.value); + + return result.done + ? resolved + : resolved.then( + value => handle(iterator.next(value)), + error => handle(iterator.throw(error)) + ); + }; + + try { + return handle(iterator.next()); + } catch (error) { + return rejectP(error); + } + }); + +export default async;