experimenting with async generators...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2022-06-17 12:01:04 +03:00
parent c1f7ba1b03
commit 41fd0c8a6a
3 changed files with 39 additions and 34 deletions

View File

@ -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', <promise>, ['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'){

View File

@ -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)
- [`<unique-key-map>.set(..)`](#unique-key-mapset)
@ -2483,6 +2484,10 @@ stoppable(<generator>)
<!-- XXX example? -->
## Async generator extensions
XXX EXPERIMENTAL
## Containers

View File

@ -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)