ig-types 6.25.0 → 6.25.3

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.
package/Promise.js CHANGED
@@ -117,11 +117,6 @@ module.packed =
117
117
  && Symbol.asyncIterator in list)){
118
118
  return list
119
119
  .then(this.pack.bind(this)) }
120
- // list: generator...
121
- if(typeof(list) == 'object'
122
- && !list.map
123
- && Symbol.iterator in list){
124
- list = [...list] }
125
120
  /* XXX on one hand this should be here and on the other I'm not
126
121
  // sure how are we going to thread handler and onerror to
127
122
  // here...
@@ -380,6 +375,11 @@ function(name){
380
375
  return (await this)[name](...args) } }
381
376
 
382
377
 
378
+ // XXX if onerror(..) is triggered, does it write it's return value to
379
+ // .__packed and in what format???
380
+ // XXX should .__packed be undefined if something breaks???
381
+ // XXX revise how .__packed is handled by metods...
382
+ // XXX might be a good idea to use Symbols for .__value and .__packed...
383
383
  var IterablePromise =
384
384
  module.IterablePromise =
385
385
  object.Constructor('IterablePromise', Promise, {
@@ -419,6 +419,17 @@ object.Constructor('IterablePromise', Promise, {
419
419
  // handle iterable promise...
420
420
  if(list instanceof IterablePromise){
421
421
  return this.__handle(list.__packed, handler, onerror) }
422
+ // list: generator...
423
+ if(typeof(list) == 'object'
424
+ // XXX this will cause a break later on...
425
+ //&& !list.map
426
+ && Symbol.iterator in list){
427
+ try{
428
+ list = [...list]
429
+ } catch(err){
430
+ if(typeof(onerror) == 'function'){
431
+ return onerror(err) }
432
+ throw err } }
422
433
  // handle promise / async-iterator...
423
434
  if(typeof(list) == 'object'
424
435
  && Symbol.asyncIterator in list){
@@ -429,6 +440,7 @@ object.Constructor('IterablePromise', Promise, {
429
440
 
430
441
  // do the packing...
431
442
  var packed = module.packed.pack(list)
443
+
432
444
  // handle if needed...
433
445
  return handler ?
434
446
  this.__handle(packed, handler, onerror)
@@ -753,16 +765,28 @@ object.Constructor('IterablePromise', Promise, {
753
765
  : this.constructor(this.__packed, 'raw') },
754
766
 
755
767
  // XXX EXPEREMENTAL
768
+ // XXX handle rejected state...
756
769
  isSync: function(){
757
- return !(this.__packed instanceof Promise
758
- || this.__packed
759
- .filter(function(e){
760
- return e instanceof IterablePromise ?
761
- !e.isSync()
762
- : e instanceof Promise
763
- && !(e instanceof SyncPromise) })
764
- .length > 0) },
770
+ return '__value' in this
771
+ || (this.__packed instanceof Array
772
+ && !(this.__packed
773
+ .filter(function(e){
774
+ return e instanceof IterablePromise ?
775
+ !e.isSync()
776
+ : e instanceof Promise
777
+ && !(e instanceof SyncPromise) })
778
+ .length > 0)) },
779
+ // XXX BUG: if sync is called before .__handle(..) is done it will
780
+ // do things that we do not want yet like unwinding generators
781
+ // etc...
765
782
  sync: function(error=false){
783
+ if('__value' in this){
784
+ return this.__value }
785
+ if(!this.isSync()){
786
+ return error ?
787
+ this.catch(error)
788
+ : this }
789
+ // try and unpack...
766
790
  try{
767
791
  var res = this.__unpack()
768
792
  }catch(err){
@@ -834,11 +858,26 @@ object.Constructor('IterablePromise', Promise, {
834
858
 
835
859
  // populate new instance...
836
860
  if(promise){
861
+ // XXX EXPEREMENTAL...
862
+ obj.then(function(value){
863
+ Object.defineProperty(obj, '__value', {
864
+ value,
865
+ enumerable: false,
866
+ }) })
867
+
837
868
  // handle onerror(..)
869
+ var error = false
838
870
  var handleError = function(err){
839
- onerror ?
840
- promise.resolve(onerror(err))
841
- : promise.reject(err) }
871
+ error = true
872
+ if(onerror){
873
+ var res = onerror(err)
874
+ // XXX do we use .__pack(..) here???
875
+ //obj.__packed = undefined
876
+ // XXX this is wrong -- need to store the value as-is...
877
+ obj.__packed = [res]
878
+ promise.resolve(res)
879
+ } else {
880
+ promise.reject(err) } }
842
881
  // handle/pack input data...
843
882
  if(handler != 'raw'){
844
883
  //list = list instanceof IterablePromise ?
@@ -851,33 +890,33 @@ object.Constructor('IterablePromise', Promise, {
851
890
  // NOTE: this is needed for self-resolve...
852
891
  writable: true,
853
892
  })
893
+
894
+ // list generator broke...
895
+ if(error){
896
+ return obj }
897
+
854
898
  // handle promise state...
855
899
  try{
856
900
  var res = obj.__unpack(list)
857
901
  }catch(err){
858
902
  promise.reject(err) }
859
- res instanceof Promise ?
860
- res
861
- .then(function(list){
862
- promise.resolve(list) })
863
- .catch(promise.reject)
864
- : promise.resolve(res)
865
- // XXX EXPEREMENTAL
866
- // XXX do we handle errors here???
867
- // self-resolve state...
868
- list instanceof Promise ?
869
- list.then(function(list){
870
- obj.__packed = list })
871
- /*/ XXX use selfResolve(..)
872
- : selfResolve(list) }
873
- /*/
874
- : list.forEach(function(elem, i){
903
+
904
+ if(res instanceof Promise){
905
+ res.then(
906
+ function(list){
907
+ promise.resolve(list)
908
+ // self-resolve...
909
+ obj.__packed = list },
910
+ handleError)
911
+ } else {
912
+ promise.resolve(res)
913
+ // self-resolve...
914
+ res.forEach(function(elem, i){
875
915
  elem instanceof Promise
876
916
  && elem.then(function(elem){
877
917
  lst = obj.__packed.slice()
878
918
  lst[i] = elem
879
- obj.__packed = lst }) }) }
880
- //*/
919
+ obj.__packed = lst }) }) } }
881
920
  return obj },
882
921
  })
883
922
 
@@ -943,18 +982,20 @@ object.Constructor('IterableSequentialStartPromise', IterablePromise, {
943
982
  res.push(e) }
944
983
  return res }
945
984
 
946
- // NOTE: we are not handling the list here...
947
- list = object.parentCall(IterableSequentialStartPromise.prototype.__pack, this, list)
985
+ // NOTE: we are not handling the list here yet...
986
+ // NOTE: if packing breaks but the error is handled this will return undefined...
987
+ list = object.parentCall(IterableSequentialStartPromise.prototype.__pack, this,
988
+ list, undefined, onerror)
948
989
  list = list instanceof SyncPromise ?
949
990
  list.sync()
950
991
  : list
951
992
  // repack...
952
993
  list = list instanceof Array ?
953
994
  repack(list)
954
- : list.then ?
995
+ : list && list.then ?
955
996
  list.then(repack)
956
997
  : list
957
- return handler ?
998
+ return list && handler ?
958
999
  this.__handle(list, handler, onerror)
959
1000
  : list },
960
1001
  })
package/generator.js CHANGED
@@ -236,6 +236,14 @@ object.Mixin('GeneratorMixin', 'soft', {
236
236
  reduce: makeGenerator('reduce'),
237
237
  reduceRight: makeGenerator('reduceRight'),
238
238
 
239
+ // XXX
240
+ smap: makeGenerator('smap'),
241
+ sfilter: makeGenerator('sfilter'),
242
+ sreduce: makeGenerator('sreduce'),
243
+ sreduceRight: makeGenerator('sreduceRight'),
244
+ sforEach: makeGenerator('sforEach'),
245
+ //*/
246
+
239
247
  between: makeGenerator('between'),
240
248
 
241
249
  // XXX EXPERIMENTAL
@@ -413,6 +421,8 @@ object.Mixin('GeneratorProtoMixin', 'soft', {
413
421
  for(var e of this){
414
422
  yield func(e, i++, this) } } },
415
423
  __onstop),
424
+ smap: function*(func){
425
+ yield* this.map(...arguments) },
416
426
  filter: stoppable(
417
427
  function*(func){
418
428
  var i = 0
@@ -428,6 +438,8 @@ object.Mixin('GeneratorProtoMixin', 'soft', {
428
438
  err.value = e }
429
439
  throw err } },
430
440
  __onstop),
441
+ sfilter: function*(func){
442
+ yield* this.filter(...arguments) },
431
443
 
432
444
  reduce: stoppable(
433
445
  function(func, res){
@@ -439,6 +451,8 @@ object.Mixin('GeneratorProtoMixin', 'soft', {
439
451
  // was passed a function from ever being treated as onstop(..)...
440
452
  function(res, f, _, onstop){
441
453
  return __onstop.call(this, res, onstop) }),
454
+ sreduce: function*(func, res){
455
+ yield* this.reduce(...arguments) },
442
456
  greduce: function*(func, res){
443
457
  yield this.reduce(...arguments) },
444
458
 
@@ -463,6 +477,8 @@ object.Mixin('GeneratorProtoMixin', 'soft', {
463
477
  // XXX EXPERIMENTAL
464
478
  forEach: function(func){
465
479
  return [...this].map(func) },
480
+ sforEach: function(func){
481
+ return this.forEach(func) },
466
482
 
467
483
  pop: function(){
468
484
  return [...this].pop() },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ig-types",
3
- "version": "6.25.0",
3
+ "version": "6.25.3",
4
4
  "description": "Generic JavaScript types and type extensions...",
5
5
  "main": "main.js",
6
6
  "scripts": {
package/test.js CHANGED
@@ -304,7 +304,7 @@ var cases = test.Cases({
304
304
  'promises as elements')
305
305
 
306
306
  // XXX split this into separate cases...
307
- for(var meth of ['iter', 'seqiter']){
307
+ for(var meth of ['iter', 'seqiter', 'seqstartiter']){
308
308
  // XXX need a recursive assert...
309
309
  var should_be = [ [1], [2], [3], [4], [5], [6] ]
310
310
  var got = await Promise[meth]([
@@ -336,6 +336,12 @@ var cases = test.Cases({
336
336
  await Promise[meth]([1, Promise.resolve(2), Promise.resolve(3)]),
337
337
  [1,2,3],
338
338
  'flat unpack', meth)
339
+
340
+ assert.array(
341
+ await Promise[meth](
342
+ (function*(){ yield* [1, Promise.resolve(2), Promise.resolve(3)] })()),
343
+ [1,2,3],
344
+ 'generator input', meth)
339
345
  }
340
346
 
341
347
  var order = []
@@ -457,7 +463,8 @@ var cases = test.Cases({
457
463
  // error...
458
464
  for(var iter of ['iter', 'seqiter', 'seqstartiter']){
459
465
  assert(
460
- await Promise[iter]([1,2,Promise.resolve(3),4,5],
466
+ await Promise[iter](
467
+ [1,2,Promise.resolve(3),4,5],
461
468
  function(e){
462
469
  if(e == 2){
463
470
  throw 'ERROR' }
@@ -467,7 +474,8 @@ var cases = test.Cases({
467
474
  == 'done',
468
475
  `.${iter}(..): .catch(..)`)
469
476
  assert(
470
- await Promise[iter]([1,2,Promise.resolve(3),4,5],
477
+ await Promise[iter](
478
+ [1,2,Promise.resolve(3),4,5],
471
479
  function(e){
472
480
  if(e == 2){
473
481
  throw 'ERROR' }
@@ -477,7 +485,8 @@ var cases = test.Cases({
477
485
  == 'done',
478
486
  `.${iter}(..): onerror(..)`)
479
487
  assert(
480
- await Promise[iter]([1,2,Promise.resolve(3),4,5],
488
+ await Promise[iter](
489
+ [1,2,Promise.resolve(3),4,5],
481
490
  function(e){
482
491
  if(e == 3){
483
492
  throw 'ERROR' }
@@ -487,7 +496,8 @@ var cases = test.Cases({
487
496
  == 'done',
488
497
  `.${iter}(..): edge onerror(..)`)
489
498
  assert(
490
- await Promise[iter]([1,2,Promise.resolve(3),4,5],
499
+ await Promise[iter](
500
+ [1,2,Promise.resolve(3),4,5],
491
501
  function(e){
492
502
  if(e == 4){
493
503
  throw 'ERROR' }
@@ -495,7 +505,60 @@ var cases = test.Cases({
495
505
  function(err){
496
506
  return 'done' })
497
507
  == 'done',
498
- `.${iter}(..): late onerror(..)`) }
508
+ `.${iter}(..): late onerror(..)`)
509
+ assert(
510
+ await Promise[iter](
511
+ (function*(){
512
+ yield* [1,2,3] })(),
513
+ function(e){
514
+ if(e == 2){
515
+ throw 'ERROR' }
516
+ return e },
517
+ function(err){
518
+ return 'done' })
519
+ == 'done',
520
+ `.${iter}(..): input generator, onerror(..) in handler`)
521
+ assert(
522
+ (pr = await Promise[iter](
523
+ (function*(){
524
+ yield* [1,2,3]
525
+ throw 'ERROR' })(),
526
+ function(e){
527
+ return e },
528
+ function(err){
529
+ return 'done' }))
530
+ == 'done',
531
+ `.${iter}(..): onerror(..) in input generator`, pr)
532
+ assert(
533
+ await (pr = Promise[iter](
534
+ (function*(){
535
+ yield* [1,2,3]
536
+ throw 'ERROR' })(),
537
+ function(e){
538
+ if(e == 4){
539
+ throw 'ERROR' }
540
+ return e },
541
+ function(err){
542
+ return 'done' })
543
+ .sync())
544
+ === 'done',
545
+ `.${iter}(..): onerror(..) on input generator + .sync()`, pr)
546
+ assert(
547
+ await Promise.iter(
548
+ (function*(){
549
+ yield* [1,2,3]
550
+ throw 'ERROR' })(),
551
+ function(e){
552
+ return new Promise(function(ok, err){
553
+ if(e == 2){
554
+ err('moo!') }
555
+ ok(e) })},
556
+ function(err){
557
+ return 333 })
558
+ == 333,
559
+ `.${iter}(..): onerror(..) with promise handler`)
560
+ }
561
+
499
562
  },
500
563
 
501
564
  // Date.js