mirror of
https://github.com/flynx/types.js.git
synced 2025-12-19 09:51:40 +00:00
experimenting with async generators...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
c1f7ba1b03
commit
41fd0c8a6a
21
Promise.js
21
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', <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'){
|
||||
|
||||
@ -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
|
||||
|
||||
47
generator.js
47
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)
|
||||
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user