diff --git a/Promise.js b/Promise.js index c14898c..9fe036e 100644 --- a/Promise.js +++ b/Promise.js @@ -30,6 +30,8 @@ var object = require('ig-object') +//var generator = require('./generator') + //--------------------------------------------------------------------- @@ -58,6 +60,7 @@ var object = require('ig-object') // // XXX how do we handle errors/rejections??? // ...mostly the current state is OK, but need more testing... +// XXX add support for async generators... // var iterPromiseProxy = @@ -117,6 +120,10 @@ object.Constructor('IterablePromise', Promise, { // stop will stop the handlers not yet run and not the next // handlers in sequence. // XXX EXPEREMENTAL: STOP... + // XXX add support for async generators... + // ... an async generator is not "parallel", i.e. intil one + // returned promise is resolved the generator blocks (will not + // advance)... __pack: function(list, handler=undefined){ var that = this // handle iterable promise list... @@ -198,20 +205,6 @@ object.Constructor('IterablePromise', Promise, { : handler(elem) }) }, //*/ // transform/handle packed array (sync)... - // - // XXX BUG: - // await Promise.iter(['a', Promise.resolve(222), ['c']]) - // .map(async e => e) - // -> ['a', , ['c']] - // is not the same as: - // await Promise.iter(['a', Promise.resolve(222), ['c']]) - // .map(e => e) - // -> ['a', 222, ['c']] - // ...and these works as expected: - // await Promise.iter(['a', Promise.resolve(222), ['c']], async e => [e]) - // -> ['a', 222, ['c']] - // await Promise.iter(['a', Promise.resolve(222), ['c']], e => [e]) - // -> ['a', 222, ['c']] __handle: function(list, handler=undefined){ var that = this if(typeof(list) == 'function'){ diff --git a/README.md b/README.md index 9ce17c9..72aaa65 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,7 @@ Library of JavaScript type extensions, types and utilities. - [`generator.produce(..)`](#generatorproduce) - [Generator helpers](#generator-helpers) - [`generator.stoppable(..)`](#generatorstoppable) + - [Async generator extensions](#async-generator-extensions) - [Containers](#containers) - [`containers.UniqueKeyMap()` (`Map`)](#containersuniquekeymap-map) - [`.set(..)`](#unique-key-mapset) @@ -2483,6 +2484,10 @@ stoppable() +## Async generator extensions + +XXX EXPERIMENTAL + ## Containers diff --git a/generator.js b/generator.js index ecf27e5..1e7561d 100644 --- a/generator.js +++ b/generator.js @@ -439,36 +439,43 @@ ITERATOR_PROTOTYPES // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // XXX EXPERIMENTAL... -var makeAsyncGenerator = function(name, pre){ - return function(...args){ - var that = this - return Object.assign( - async function*(){ - var a = pre ? - pre.call(this, args, ...arguments) - : args - for await (var e of that(...arguments)[name](...a)){ - yield e } }, - { toString: function(){ - return [ - that.toString(), - // XXX need to normalize args better... - `.${ name }(${ args.join(', ') })`, - ].join('\n ') }, }) } } - var AsyncGeneratorMixin = module.AsyncGeneratorMixin = object.Mixin('AsyncGeneratorMixin', 'soft', { - map: makeAsyncGenerator('map'), }) var AsyncGeneratorProtoMixin = module.AsyncGeneratorProtoMixin = object.Mixin('AsyncGeneratorProtoMixin', 'soft', { + // + // .then() + // -> promise + // + // .then(resolve[, reject]) + // -> promise + // + // NOTE: this will unwind the generator... + then: function(resolve, reject){ + var that = this + var p = new Promise(async function(_resolve, _reject){ + var res = [] + for await(var elem of that){ + res.push(elem) } + _resolve(res) }) + resolve + && p.then(resolve) + reject + && p.catch(reject) + return p }, + + // create an iterator promise... + iter: function(handler=undefined){ + // XXX + }, }) -//AsyncGeneratorMixin(AsyncGeneratorPrototype) -//AsyncGeneratorProtoMixin(AsyncGeneratorPrototype.prototype) +AsyncGeneratorMixin(AsyncGeneratorPrototype) +AsyncGeneratorProtoMixin(AsyncGeneratorPrototype.prototype)