added generator support to promise iterators (experimental)...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2022-12-07 18:15:40 +03:00
parent d0782e0c1b
commit af0409dc0c
4 changed files with 75 additions and 59 deletions

View File

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

View File

@ -2030,12 +2030,17 @@ the main `<promise>` 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(<func>)
-> <sync-promise>
-> <promise>
<func>(<resolve>, <reject>)

82
package-lock.json generated
View File

@ -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",

View File

@ -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": {