From af0409dc0c8cdfd757fe89c33048fbc3aab519da Mon Sep 17 00:00:00 2001 From: "Alex A. Naanou" Date: Wed, 7 Dec 2022 18:15:40 +0300 Subject: [PATCH] added generator support to promise iterators (experimental)... Signed-off-by: Alex A. Naanou --- Promise.js | 45 ++++++++++++++++++-------- README.md | 5 +++ package-lock.json | 82 ++++++++++++++++++++++------------------------- package.json | 2 +- 4 files changed, 75 insertions(+), 59 deletions(-) diff --git a/Promise.js b/Promise.js index 5907234..02b8219 100644 --- a/Promise.js +++ b/Promise.js @@ -30,7 +30,7 @@ var object = require('ig-object') -//var generator = require('./generator') +var generator = require('./generator') @@ -123,18 +123,22 @@ 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)... - // ...can we feed out a results one by one??? + // XXX ITER can we unwind (sync/async) generators one by one??? __pack: function(list, handler=undefined){ var that = this - // handle iterable promise list... + // handle iterator... + // XXX ITER do we unwind the iterator here or wait to unwind later??? + if(typeof(list) == 'object' + && Symbol.iterator in list){ + list = [...list] } + // handle iterable promise... if(list instanceof IterablePromise){ return this.__handle(list.__packed, handler) } - // handle promise list... - if(list instanceof Promise){ + // handle promise / async-iterator... + // XXX ITER do we unwind the iterator here or wait to unwind later??? + if(list instanceof Promise + || (typeof(list) == 'object' + && Symbol.asyncIterator in list)){ return list.then(function(list){ return that.__pack(list, handler) }) } // do the work... @@ -152,6 +156,10 @@ object.Constructor('IterablePromise', Promise, { var pack = function(){ return [list].flat() [map](function(elem){ + // XXX EXPEREMENTAL -- not sure about this yet... + //elem = Symbol.iterator in elem ? + // [...elem] + // : elem // XXX EXPEREMENTAL... return elem instanceof IterablePromise ? (elem.isSync() ? @@ -274,11 +282,16 @@ object.Constructor('IterablePromise', Promise, { // give up on a sync solution... if(e instanceof Promise){ // XXX can we return an IterablePromise??? - // XXX these will cause infinite recursion.... + // XXX this will cause infinite recursion.... //return Promise.iter(list).flat() } + // XXX is there a more elegant way to do this??? return Promise.all(list) .then(function(list){ - return list.flat() }) } + return list.flat() }) + .iter() } + //return Promise.all(list) + // .then(function(list){ + // return list.flat() }) } res.push(e) } return res.flat() }, /*/ @@ -1003,10 +1016,9 @@ object.Constructor('SyncPromise', Promise, { // async... if(!error && value instanceof Promise){ - return value } + return object.ASIS(value) } // sync... var obj = Promise.resolve(value) - obj.__proto__ = this.prototype obj.value = value rejected && (obj.error = error) @@ -1069,7 +1081,12 @@ object.Mixin('PromiseProtoMixin', 'soft', { as: ProxyPromise, iter: function(handler=undefined){ return IterablePromise(this, handler) }, - sync: function(){ + // unify the general promise API with other promise types... + // XXX should this be here??? + // XXX error if given must return the result... (???) + sync: function(error){ + typeof(error) == 'function' + && this.catch(error) return this }, }) diff --git a/README.md b/README.md index ffb3ddb..a382810 100644 --- a/README.md +++ b/README.md @@ -2030,12 +2030,17 @@ the main `` is resolved. ### Sync/async promise +The goal of this is to handle both sync and asynchronous data flows with +one promise-like API, if all of the data can be obtained in a sync manner +this will be sync otherwise we will revert to a normal promise. + #### `Promise.sync(..)` / `promise.SyncPromise(..)` ```dnf Promise.sync() -> + -> (, ) diff --git a/package-lock.json b/package-lock.json index 9b55056..885ae13 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ig-types", - "version": "6.17.0", + "version": "6.24.5", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "ig-types", - "version": "6.17.0", + "version": "6.24.5", "license": "BSD-3-Clause", "dependencies": { "ig-object": "^6.0.0", @@ -50,13 +50,13 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "node_modules/@types/istanbul-lib-coverage": { @@ -211,13 +211,10 @@ "dev": true }, "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -342,11 +339,17 @@ "integrity": "sha512-5MAUWSwfHKQNrgLroXxBHjlhrhVbhzlVqvUcfMDjUeK/ufWQ9THE0HDcvhfu+YrPfRjTR2QpD2Ygp+2H4O0C6g==", "dev": true }, + "node_modules/ig-doc": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ig-doc/-/ig-doc-1.0.0.tgz", + "integrity": "sha512-3+wAFWcvXv4czAk7pNa9+DEMDjlj+aJ7AQcB1ZnK49B+49nuJX7JkKJnBSF38C1YoEoxs12jvjuaqtSrvQa3KA==" + }, "node_modules/ig-object": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ig-object/-/ig-object-6.0.1.tgz", - "integrity": "sha512-6Wba9Y+6w55L7O92mNK1pVVWvTWJLD/MdiJr2fc6u6DfD5CGxvYNxl/gg2U0Ppbnj8ArBDowsg9/yNrQR+n8vg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ig-object/-/ig-object-6.2.1.tgz", + "integrity": "sha512-mVGmqd+yiIf1hUo/hkqhc0JApXApuaFU4chmtO4nudL87bQ6jmJQ2qqSdUfe2hauNOHXNqG226qltCp39FHqXA==", "dependencies": { + "ig-doc": "*", "ig-stoppable": "^2.0.0" } }, @@ -586,12 +589,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, "node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -816,13 +813,13 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "@types/istanbul-lib-coverage": { @@ -958,13 +955,10 @@ "dev": true }, "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true }, "cross-spawn": { "version": "7.0.3", @@ -1064,11 +1058,17 @@ } } }, + "ig-doc": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ig-doc/-/ig-doc-1.0.0.tgz", + "integrity": "sha512-3+wAFWcvXv4czAk7pNa9+DEMDjlj+aJ7AQcB1ZnK49B+49nuJX7JkKJnBSF38C1YoEoxs12jvjuaqtSrvQa3KA==" + }, "ig-object": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ig-object/-/ig-object-6.0.1.tgz", - "integrity": "sha512-6Wba9Y+6w55L7O92mNK1pVVWvTWJLD/MdiJr2fc6u6DfD5CGxvYNxl/gg2U0Ppbnj8ArBDowsg9/yNrQR+n8vg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ig-object/-/ig-object-6.2.1.tgz", + "integrity": "sha512-mVGmqd+yiIf1hUo/hkqhc0JApXApuaFU4chmtO4nudL87bQ6jmJQ2qqSdUfe2hauNOHXNqG226qltCp39FHqXA==", "requires": { + "ig-doc": "*", "ig-stoppable": "^2.0.0" } }, @@ -1250,12 +1250,6 @@ "glob": "^7.1.3" } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", diff --git a/package.json b/package.json index 9b1e989..47f5f66 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ig-types", - "version": "6.24.5", + "version": "6.24.7", "description": "Generic JavaScript types and type extensions...", "main": "main.js", "scripts": {