2020-11-02 18:24:20 +03:00
|
|
|
/**********************************************************************
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
**********************************************/ /* c8 ignore next 2 */
|
|
|
|
|
((typeof define)[0]=='u'?function(f){module.exports=f(require)}:define)
|
|
|
|
|
(function(require){ var module={} // make module AMD/node compatible...
|
|
|
|
|
/*********************************************************************/
|
|
|
|
|
|
|
|
|
|
var object = require('ig-object')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*********************************************************************/
|
|
|
|
|
|
2020-11-16 02:38:19 +03:00
|
|
|
// XXX does this need to be a distinct object???
|
|
|
|
|
Promise.cooperative = function(){
|
|
|
|
|
var handlers
|
|
|
|
|
return object.mixinFlat(
|
|
|
|
|
new Promise(function(resolve, reject){
|
|
|
|
|
handlers = { resolve, reject, } }),
|
|
|
|
|
{
|
|
|
|
|
get isSet(){
|
|
|
|
|
return handlers === false },
|
|
|
|
|
set: function(value){
|
|
|
|
|
// can't set twice...
|
|
|
|
|
if(this.isSet){
|
|
|
|
|
throw new Error('Promise.cooperative().set(..): can not set twice') }
|
|
|
|
|
// bind to promise...
|
|
|
|
|
if(value && value.then && value.catch){
|
|
|
|
|
value.then(handlers.resolve)
|
|
|
|
|
value.catch(handlers.reject)
|
|
|
|
|
// resolve with value...
|
|
|
|
|
} else {
|
|
|
|
|
handlers.resolve(value) }
|
|
|
|
|
// cleanup and prevent setting twice...
|
|
|
|
|
handlers = false
|
|
|
|
|
return this },
|
|
|
|
|
}) }
|
2020-11-02 18:24:20 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-11-09 06:22:32 +03:00
|
|
|
//---------------------------------------------------------------------
|
|
|
|
|
// promise iterators...
|
|
|
|
|
|
2020-11-16 02:38:19 +03:00
|
|
|
// XXX we need to:
|
|
|
|
|
// - wrap each elem in a promise
|
|
|
|
|
// - on each map/filter/... chain the handler to each elem and return
|
|
|
|
|
// a new iterable with the combination
|
2020-11-09 06:22:32 +03:00
|
|
|
// XXX like Promise.all(..) but creates an iterable promise...
|
|
|
|
|
var IterablePromise =
|
|
|
|
|
module.IterablePromise =
|
|
|
|
|
Promise.iter =
|
|
|
|
|
object.Constructor('IterablePromise', Promise, {
|
2020-11-10 01:58:51 +03:00
|
|
|
// XXX
|
|
|
|
|
__list: null,
|
|
|
|
|
|
|
|
|
|
map: function(func){
|
2020-11-16 02:38:19 +03:00
|
|
|
return IterablePromise(this.__list, function(e, i){
|
|
|
|
|
return [func(e, i)] }) },
|
|
|
|
|
filter: function(func){
|
|
|
|
|
return IterablePromise(this.__list, function(e, i){
|
|
|
|
|
return func(e, i) ?
|
|
|
|
|
[e]
|
|
|
|
|
: [] }) },
|
2020-11-10 01:58:51 +03:00
|
|
|
reduce: function(func, res){},
|
|
|
|
|
flat: function(){},
|
|
|
|
|
|
|
|
|
|
all: function(){},
|
|
|
|
|
|
2020-11-16 02:38:19 +03:00
|
|
|
// XXX how does this support reduce???
|
|
|
|
|
// handler(e, i)
|
|
|
|
|
// -> [value]
|
|
|
|
|
// -> []
|
|
|
|
|
//
|
|
|
|
|
__new__: function(_, list, handler=false){
|
2020-11-10 01:58:51 +03:00
|
|
|
// instance...
|
|
|
|
|
var obj = Reflect.construct(IterablePromise.__proto__, [
|
|
|
|
|
function(resolve, reject){
|
|
|
|
|
// NOTE: this is here for Promise compatibilty...
|
|
|
|
|
if(typeof(list) == 'function'){
|
|
|
|
|
return func.call(this, ...arguments) }
|
|
|
|
|
|
2020-11-16 02:38:19 +03:00
|
|
|
var all = Promise.all(list)
|
|
|
|
|
|
2020-11-10 01:58:51 +03:00
|
|
|
// XXX
|
|
|
|
|
var res = []
|
2020-11-16 02:38:19 +03:00
|
|
|
list.forEach(function(e, i){
|
|
|
|
|
if(handler && e && e.then && e.catch){
|
|
|
|
|
e.then(function(v){
|
|
|
|
|
return (res[i] = handler(v, i)) })
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
res[i] = e } })
|
2020-11-10 01:58:51 +03:00
|
|
|
}],
|
|
|
|
|
IterablePromise)
|
|
|
|
|
|
|
|
|
|
return obj },
|
2020-11-09 06:22:32 +03:00
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-11-02 18:24:20 +03:00
|
|
|
|
|
|
|
|
/**********************************************************************
|
|
|
|
|
* vim:set ts=4 sw=4 : */ return module })
|