From 51d5db2e94c149969d1edc113368339c6ba033a1 Mon Sep 17 00:00:00 2001 From: "Alex A. Naanou" Date: Thu, 29 Dec 2022 15:53:16 +0300 Subject: [PATCH] bugfix... Signed-off-by: Alex A. Naanou --- Promise.js | 42 +++++++++++++++++++++++++++++------------- package.json | 2 +- test.js | 26 ++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 14 deletions(-) diff --git a/Promise.js b/Promise.js index c90b10d..90f65a7 100644 --- a/Promise.js +++ b/Promise.js @@ -306,6 +306,18 @@ object.Constructor('IterablePromise', Promise, { : list }, // transform/handle packed array (sync, but can return promises in the list)... // XXX need a strict spec... + // XXX BUG??? + // await Promise.iter([ + // Promise.sync.resolve([1,1,1]), + // [2,2,2], + // Promise.resolve([3,3,3]), + // Promise.iter([4,4,4]), + // Promise.all([5,5,5]), + // ], + // e => e instanceof Array ? [[1,2,3]] : e) + // -> [ 1, 2, 3, [ 1, 2, 3 ], [ 1, 2, 3 ], [ 1, 2, 3 ], [ 1, 2, 3 ] ] + // ...the fist result seems odd... + // XXX FIXED but need to add a test for IterablePromise branch below... __handle: function(list, handler=undefined, onerror=undefined){ var that = this if(typeof(list) == 'function'){ @@ -325,38 +337,42 @@ object.Constructor('IterablePromise', Promise, { 'smap' : 'map' var stop = false + var unwrap = function(elem){ + return elem.length == 1 ? + elem[0] + : elem } return list [map]( function(elem){ return elem instanceof IterablePromise ? - // XXX should this be expanded??? (like Array below) + // XXX should elem be expanded??? (like Array below) (elem.isSync() ? handler(elem.sync()) // XXX need to handle this but keep it IterablePromise... : elem.iterthen(handler)) + // sync sync promise... : (elem instanceof SyncPromise && !(elem.sync() instanceof Promise)) ? - // XXX should this be expanded??? (like Array below) - handler(elem.sync()) + [handler(unwrap(elem.sync()))] // promise / promise-like... : elem && elem.then ? // NOTE: when this is explicitly stopped we - // do not call any more handlers... + // do not call any more handlers after + // STOP is thrown/returned... // XXX TEST!!! elem.then(function(elem){ return !stop ? - handler( - elem.length == 1 ? - elem[0] - :elem) + handler(unwrap(elem)) : [] }) : elem instanceof Array ? - [handler( - elem.length == 1 ? - elem[0] - : elem)] + // NOTE: we are calling .flat() on the result + // so we need to keep a handled array as + // a single element by wrapping the return + // of handled(..)... + [handler(unwrap(elem))] : handler(elem) }, - function(res){ + // handle STOP... + function(){ stop = true }) .flat() }, //*/ diff --git a/package.json b/package.json index e1b0c8d..eb45d4b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ig-types", - "version": "6.24.12", + "version": "6.24.13", "description": "Generic JavaScript types and type extensions...", "main": "main.js", "scripts": { diff --git a/test.js b/test.js index c17e0bf..69bff27 100755 --- a/test.js +++ b/test.js @@ -265,6 +265,32 @@ var cases = test.Cases({ await Promise.iter([1, Promise.resolve(2), 3]), [1, 2, 3], 'promises as elements') + + // XXX need a recursive assert... + var should_be = [ [1], [2], [3], [4], [5] ] + var got = await Promise.iter([ + [1,1,1], + Promise.sync.resolve([2,2,2]), + Promise.resolve([3,3,3]), + Promise.iter([4,4,4]), + Promise.all([5,5,5]), + ], + function(e){ + return e instanceof Array ? + [[ e[0] ]] + // XXX + : e }) + assert( + should_be + .reduce(function(res, e, i){ + //console.log('---', e, got[i]) + if(res === false){ + return false } + return e instanceof Array + && got[i] instanceof Array + && e.length == got[i].length + && e[0] == got[i][0] }, true), + 'pack/unpack') }, // Date.js