ig-types 6.24.13 → 6.24.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/Promise.js +87 -75
  2. package/package.json +1 -1
  3. package/test.js +4 -3
package/Promise.js CHANGED
@@ -306,18 +306,6 @@ object.Constructor('IterablePromise', Promise, {
306
306
  : list },
307
307
  // transform/handle packed array (sync, but can return promises in the list)...
308
308
  // XXX need a strict spec...
309
- // XXX BUG???
310
- // await Promise.iter([
311
- // Promise.sync.resolve([1,1,1]),
312
- // [2,2,2],
313
- // Promise.resolve([3,3,3]),
314
- // Promise.iter([4,4,4]),
315
- // Promise.all([5,5,5]),
316
- // ],
317
- // e => e instanceof Array ? [[1,2,3]] : e)
318
- // -> [ 1, 2, 3, [ 1, 2, 3 ], [ 1, 2, 3 ], [ 1, 2, 3 ], [ 1, 2, 3 ] ]
319
- // ...the fist result seems odd...
320
- // XXX FIXED but need to add a test for IterablePromise branch below...
321
309
  __handle: function(list, handler=undefined, onerror=undefined){
322
310
  var that = this
323
311
  if(typeof(list) == 'function'){
@@ -337,40 +325,40 @@ object.Constructor('IterablePromise', Promise, {
337
325
  'smap'
338
326
  : 'map'
339
327
  var stop = false
340
- var unwrap = function(elem){
341
- return elem.length == 1 ?
342
- elem[0]
343
- : elem }
328
+ // XXX do we handle generators here???
329
+ var each = function(elem){
330
+ return elem instanceof Array ?
331
+ elem
332
+ .map(handler)
333
+ .flat()
334
+ : handler(elem) }
344
335
  return list
345
336
  [map](
346
337
  function(elem){
338
+ // NOTE: we are calling .flat() on the result so we
339
+ // need to keep a handled array as a single
340
+ // element by wrapping the return of handled(..)...
347
341
  return elem instanceof IterablePromise ?
348
- // XXX should elem be expanded??? (like Array below)
349
342
  (elem.isSync() ?
350
- handler(elem.sync())
351
- // XXX need to handle this but keep it IterablePromise...
352
- : elem.iterthen(handler))
343
+ each(elem.sync())
344
+ : elem.iterthen(each))
353
345
  // sync sync promise...
354
346
  : (elem instanceof SyncPromise
355
347
  && !(elem.sync() instanceof Promise)) ?
356
- [handler(unwrap(elem.sync()))]
348
+ [each(elem.sync())]
357
349
  // promise / promise-like...
358
350
  : elem && elem.then ?
359
351
  // NOTE: when this is explicitly stopped we
360
352
  // do not call any more handlers after
361
353
  // STOP is thrown/returned...
362
- // XXX TEST!!!
354
+ // NOTE: the promise protects this from .flat()
363
355
  elem.then(function(elem){
364
356
  return !stop ?
365
- handler(unwrap(elem))
357
+ each(elem)
366
358
  : [] })
367
359
  : elem instanceof Array ?
368
- // NOTE: we are calling .flat() on the result
369
- // so we need to keep a handled array as
370
- // a single element by wrapping the return
371
- // of handled(..)...
372
- [handler(unwrap(elem))]
373
- : handler(elem) },
360
+ [each(elem)]
361
+ : each(elem) },
374
362
  // handle STOP...
375
363
  function(){
376
364
  stop = true })
@@ -772,7 +760,8 @@ object.Constructor('IterablePromise', Promise, {
772
760
  // instance...
773
761
  var promise
774
762
  var obj = Reflect.construct(
775
- IterablePromise.__proto__,
763
+ Promise,
764
+ //this.constructor.__proto__,
776
765
  [function(resolve, reject){
777
766
  // NOTE: this is here for Promise compatibility...
778
767
  if(typeof(list) == 'function'){
@@ -781,13 +770,14 @@ object.Constructor('IterablePromise', Promise, {
781
770
  if(list === false){
782
771
  return reject() }
783
772
  promise = {resolve, reject} }],
784
- IterablePromise)
773
+ this.constructor)
785
774
 
786
775
  // populate new instance...
787
776
  if(promise){
788
777
  // handle/pack input data...
789
778
  if(handler != 'raw'){
790
- list = list instanceof IterablePromise ?
779
+ //list = list instanceof IterablePromise ?
780
+ list = list instanceof this.constructor ?
791
781
  obj.__handle(list.__packed, handler, onerror)
792
782
  : obj.__pack(list, handler, onerror) }
793
783
  Object.defineProperty(obj, '__packed', {
@@ -827,53 +817,75 @@ object.Constructor('IterablePromise', Promise, {
827
817
  //---------------------------------------------------------------------
828
818
  // XXX EXPEREMENTAL/HACK...
829
819
 
830
- // XXX we are getting a list with promises triggered outside, we can't
831
- // control order of execution of this but we can control in what
832
- // order the handler is called...
833
- // XXX this potentially shows a bug with IterablePromise:
834
- // Promise.seqiter(
835
- // [1, Promise.resolve(2), 3, Promise.resolve(4)],
836
- // e => (console.log('---', e), e))
837
- // ...this will not resolve/replace the 4's promise...
838
- // for context:
839
- // await Promise.resolve(Promise.resolve(Promise.resolve(123)))
840
- // -> 123
841
- // ...is this just a nesting issue here???
842
- // Q: what IterablePromise does/should do if a promise resolves to
843
- // a promise multiple times...
820
+ // This like IterablePromise but guarantees handler execution in order
821
+ // element occurrence.
822
+ //
823
+ // For comparison:
824
+ // Promise.all([ .. ]).then(func)
825
+ // - func is called on element list
826
+ // - func is called when all the elements are resolved
827
+ // Promise.iter([ .. ]).iter(func)
828
+ // - func per element
829
+ // - func is called when an element is resolved/ready
830
+ // in any order
831
+ // Promise.seqiter([ .. ]).iter(func)
832
+ // - func per element
833
+ // - func is called when an element is resolved/ready
834
+ // and when all elements before it are handled
835
+ //
836
+ // NOTE: that here a promise will block handling of later promises even
837
+ // if they are resolved before it.
838
+ //
839
+ // XXX BUG:
840
+ // await Promise.seqiter([
841
+ // 1,
842
+ // Promise.resolve(2),
843
+ // Promise.resolve(3)
844
+ // Promise.resolve(4)
845
+ // Promise.resolve(5)
846
+ // ])
847
+ // -> [ 1, 2, [3], [[4]], [[[5]]] ]
848
+ // looks like we need to flatten things...
849
+ // XXX FIXED but need more testing...
844
850
  // XXX not sure if this is a viable strategy....
845
851
  var IterableSequentialPromise =
846
852
  module.IterableSequentialPromise =
847
853
  object.Constructor('IterableSequentialPromise', IterablePromise, {
848
- __new__: function(_, list, handler=undefined, onerror=undefined){
849
- var [_, list, ...rest] = arguments
850
- var res = list
851
- // format the list...
852
- if(list instanceof Array
853
- || list instanceof Promise){
854
-
855
- var pre_process = function(list, start=0){
856
- if(list instanceof Promise){
857
- return list.then(pre_process) }
858
- res = []
859
- for(let [i, e] of list.entries().slice(start)){
860
- if(e instanceof Promise){
861
- res.push(e.then(function(e){
862
- return [e,
863
- // XXX need to flatten this...
864
- ...pre_process(list, i+1)] }))
865
- break }
866
- res.push(e) }
867
- return res }
868
-
869
- res = pre_process(list)
870
-
871
- var obj = IterablePromise.prototype.__new__.call(this, _, res, 'raw')
872
-
873
- return obj
874
- }
875
- // XXX use .parentCall(..)...
876
- return IterablePromise.prototype.__new__.call(this, _, res, ...rest) },
854
+ // XXX needs more work...
855
+ __pack: function(list, handler=undefined, onerror=undefined){
856
+ var seqiter = this.constructor
857
+
858
+ var repack = function(list){
859
+ var res = []
860
+ for(var [i, e] of list.entries()){
861
+ // XXX check for .then(..) instead???
862
+ if(e instanceof Promise
863
+ // skip last promise -- nothing to wrap...
864
+ && i < list.length-1){
865
+ res.push(e
866
+ .then(function(e){
867
+ return seqiter([...e, ...list.slice(i+1)])
868
+ .flat() }))
869
+ break }
870
+ res.push(e) }
871
+ return res }
872
+
873
+ // NOTE: we are not handling the list here...
874
+ list = object.parentCall(IterableSequentialPromise.prototype.__pack, this, list)
875
+ list = list instanceof SyncPromise ?
876
+ list.sync()
877
+ : list
878
+ list = list instanceof Array ?
879
+ repack(list)
880
+ // XXX check for .then(..) instead???
881
+ : list instanceof Promise ?
882
+ list.then(repack)
883
+ : list
884
+
885
+ return handler ?
886
+ // XXX this seems to be wrong...
887
+ this.__handle(list, handler, onerror)
888
+ : list },
877
889
  })
878
890
 
879
891
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ig-types",
3
- "version": "6.24.13",
3
+ "version": "6.24.15",
4
4
  "description": "Generic JavaScript types and type extensions...",
5
5
  "main": "main.js",
6
6
  "scripts": {
package/test.js CHANGED
@@ -267,13 +267,14 @@ var cases = test.Cases({
267
267
  'promises as elements')
268
268
 
269
269
  // XXX need a recursive assert...
270
- var should_be = [ [1], [2], [3], [4], [5] ]
270
+ var should_be = [ [1], [2], [3], [4], [5], [6] ]
271
271
  var got = await Promise.iter([
272
272
  [1,1,1],
273
273
  Promise.sync.resolve([2,2,2]),
274
274
  Promise.resolve([3,3,3]),
275
275
  Promise.iter([4,4,4]),
276
- Promise.all([5,5,5]),
276
+ Promise.iter.resolve([5,5,5]),
277
+ Promise.all([6,6,6]),
277
278
  ],
278
279
  function(e){
279
280
  return e instanceof Array ?
@@ -290,7 +291,7 @@ var cases = test.Cases({
290
291
  && got[i] instanceof Array
291
292
  && e.length == got[i].length
292
293
  && e[0] == got[i][0] }, true),
293
- 'pack/unpack')
294
+ 'pack/unpack:', got)
294
295
  },
295
296
 
296
297
  // Date.js