From 2b6dfb35c2417b79ecdc2f4a23979416925f815c Mon Sep 17 00:00:00 2001 From: "Alex A. Naanou" Date: Wed, 22 Jun 2022 10:26:04 +0300 Subject: [PATCH] experimenting with AsyncGenerator static methods... Signed-off-by: Alex A. Naanou --- README.md | 3 +++ generator.js | 41 +++++++++++++++++++++++++++-------------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index f684455..69b9a26 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,7 @@ Library of JavaScript type extensions, types and utilities. - [Generator helpers](#generator-helpers) - [`generator.stoppable(..)`](#generatorstoppable) - [Async generator extensions](#async-generator-extensions) + - [`generator.AsyncGenerator`](#generatorasyncgenerator) - [`.then(..)` / `.catch(..)` / `.finally(..)`](#async-generatorthen--async-generatorcatch--async-generatorfinally) - [`.iter(..)`](#async-generatoriter) - [`.map(..)` / `.filter(..)` / `.reduce(..)`](#async-generatormap--async-generatorfilter--async-generatorreduce) @@ -2493,6 +2494,8 @@ stoppable() XXX EXPERIMENTAL +#### `generator.AsyncGenerator` + #### `.then(..)` / `.catch(..)` / `.finally(..)` #### `.iter(..)` diff --git a/generator.js b/generator.js index 01a06bd..26e3220 100644 --- a/generator.js +++ b/generator.js @@ -121,9 +121,11 @@ Generator.iter = // // makeGenerator() +// makeGenerator(, ) // -> // -// makeGenerator(, ) +// makeGenerator('async', ) +// makeGenerator('async', , ) // -> // // @@ -140,14 +142,26 @@ Generator.iter = // XXX this needs to be of the correct type... (???) // XXX need to accept generators as handlers... var makeGenerator = function(name, pre){ + var sync = true + if(name == 'async'){ + sync = false + var [name, pre] = [...arguments].slice(1) } return function(...args){ var that = this return Object.assign( - function*(){ - var a = pre ? - pre.call(this, args, ...arguments) - : args - yield* that(...arguments)[name](...a) }, + // NOTE: the two branches here are identical, the only + // difference is the async keyword... + sync ? + function*(){ + var a = pre ? + pre.call(this, args, ...arguments) + : args + yield* that(...arguments)[name](...a) } + : async function*(){ + var a = pre ? + pre.call(this, args, ...arguments) + : args + yield* that(...arguments)[name](...a) }, { toString: function(){ return [ that.toString(), @@ -461,19 +475,18 @@ ITERATOR_PROTOTYPES var AsyncGeneratorMixin = module.AsyncGeneratorMixin = object.Mixin('AsyncGeneratorMixin', 'soft', { + // XXX TEST... + iter: makeGenerator('async', 'iter'), + map: makeGenerator('async', 'map'), + filter: makeGenerator('async', 'filter'), + reduce: makeGenerator('async', 'reduce'), }) var AsyncGeneratorProtoMixin = module.AsyncGeneratorProtoMixin = object.Mixin('AsyncGeneratorProtoMixin', 'soft', { + // promise... // - // .then() - // -> promise - // - // .then(resolve[, reject]) - // -> promise - // - // NOTE: this makes this await compatible... // NOTE: this will unwind the generator... // XXX create an iterator promise??? // XXX should we unwind??? @@ -539,7 +552,7 @@ object.Mixin('AsyncGeneratorProtoMixin', 'soft', { yield* this }, // XXX - // slice + // slice -- not sure if we need this... // ... })