mirror of
https://github.com/flynx/types.js.git
synced 2025-10-29 02:20:07 +00:00
added generator support to promise iterators (experimental)...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
d0782e0c1b
commit
af0409dc0c
45
Promise.js
45
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 },
|
||||
})
|
||||
|
||||
|
||||
@ -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
82
package-lock.json
generated
@ -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",
|
||||
|
||||
@ -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": {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user