ig-types 6.24.24 → 6.25.1

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 +94 -81
  2. package/package.json +1 -1
  3. package/test.js +59 -0
package/Promise.js CHANGED
@@ -163,8 +163,8 @@ module.packed =
163
163
  return that.handle(packed, ...handlers) }) }
164
164
 
165
165
  var handleSTOP = function(err){
166
+ stop = true
166
167
  if(err && err === Array.STOP){
167
- stop = true
168
168
  return []
169
169
  } else if(err && err instanceof Array.STOP){
170
170
  return err.value }
@@ -174,66 +174,78 @@ module.packed =
174
174
  var map = Array.STOP ?
175
175
  'smap'
176
176
  : 'map'
177
- return packed
178
- // NOTE: we do not need to rapack after this because the handlers
179
- // will get the correct (unpacked) values and it's their
180
- // responsibility to pack them if needed...
181
- // NOTE: this removes the need to handle sub-arrays unless they are
182
- // in a promise...
183
- .flat()
184
- [map](
185
- function(elem){
186
- return elem instanceof Promise ?
187
- elem.then(function(elem){
188
- if(stop){
189
- return [] }
190
- try{
191
- var has_promise = false
192
- // NOTE: do the same thing handle(..) does
193
- // but on a single level, without expanding
194
- // arrays...
195
- if(elem instanceof Array){
196
- var res = elem.map(function(elem){
197
- var res = elem instanceof Promise ?
198
- elem.then(function(elem){
199
- try{
200
- return !stop ?
201
- handler(elem)
202
- : []
203
- } catch(err){
204
- return handleSTOP(err) } })
205
- : handler(elem)
206
- has_promise = has_promise
207
- || res instanceof Promise
208
- return res })
209
- // non-arrays...
210
- } else {
211
- // NOTE: we are wrapping the result in an array to
212
- // normalize it with the above...
213
- res = [handler(elem)]
214
- has_promise = has_promise
215
- || res[0] instanceof Promise }
216
-
217
- // compensate for the outer .flat()...
218
- // NOTE: at this point res is always an array...
219
- return has_promise ?
220
- // NOTE: since we are already in a promise
221
- // grouping things here is not a big
222
- // deal, however this is needed to link
223
- // nested promises with the containing
224
- // promise...
225
- Promise.all(res)
226
- .then(function(res){
227
- return res.flat() })
228
- : res.flat()
229
- } catch(err){
230
- return handleSTOP(err) } })
231
- : handler(elem) },
232
- // onerror...
233
- function(err){
234
- stop = true
235
- typeof(onerror) == 'function'
236
- && onerror(err) }) },
177
+ try{
178
+ return packed
179
+ // NOTE: we do not need to rapack after this because the handlers
180
+ // will get the correct (unpacked) values and it's their
181
+ // responsibility to pack them if needed...
182
+ // NOTE: this removes the need to handle sub-arrays unless they are
183
+ // in a promise...
184
+ .flat()
185
+ [map](
186
+ function(elem){
187
+ return elem instanceof Promise ?
188
+ elem
189
+ .then(function(elem){
190
+ if(stop){
191
+ return [] }
192
+ try{
193
+ var has_promise = false
194
+ // NOTE: do the same thing handle(..) does
195
+ // but on a single level, without expanding
196
+ // arrays...
197
+ if(elem instanceof Array){
198
+ var res = elem
199
+ .map(function(elem){
200
+ var res = elem instanceof Promise ?
201
+ elem.then(function(elem){
202
+ try{
203
+ return !stop ?
204
+ handler(elem)
205
+ : []
206
+ }catch(err){
207
+ return handleSTOP(err) } })
208
+ : handler(elem)
209
+ has_promise = has_promise
210
+ || res instanceof Promise
211
+ return res })
212
+ // non-arrays...
213
+ } else {
214
+ // NOTE: we are wrapping the result in an array to
215
+ // normalize it with the above...
216
+ res = [handler(elem)]
217
+ has_promise = has_promise
218
+ || res[0] instanceof Promise }
219
+
220
+ // compensate for the outer .flat()...
221
+ // NOTE: at this point res is always an array...
222
+ return has_promise ?
223
+ // NOTE: since we are already in a promise
224
+ // grouping things here is not a big
225
+ // deal, however this is needed to link
226
+ // nested promises with the containing
227
+ // promise...
228
+ Promise.all(res)
229
+ .then(function(res){
230
+ return res.flat() })
231
+ : res.flat()
232
+ } catch(err){
233
+ return handleSTOP(err) } })
234
+ // err...
235
+ .catch(function(err){
236
+ stop = true
237
+ typeof(onerror) == 'function'
238
+ && onerror(err)
239
+ return [] })
240
+ : handler(elem) })
241
+ }catch(err){
242
+ // err
243
+ if(err !== Array.STOP
244
+ && !(err instanceof Array.STOP)
245
+ && typeof(onerror) == 'function'){
246
+ onerror(err)
247
+ return [] }
248
+ throw err } },
237
249
  //
238
250
  // unpack(<packed>)
239
251
  // -> <array>
@@ -822,45 +834,46 @@ object.Constructor('IterablePromise', Promise, {
822
834
 
823
835
  // populate new instance...
824
836
  if(promise){
837
+ // handle onerror(..)
838
+ var handleError = function(err){
839
+ onerror ?
840
+ promise.resolve(onerror(err))
841
+ : promise.reject(err) }
825
842
  // handle/pack input data...
826
843
  if(handler != 'raw'){
827
844
  //list = list instanceof IterablePromise ?
828
845
  list = list instanceof this.constructor ?
829
- obj.__handle(list.__packed, handler, onerror)
830
- : obj.__pack(list, handler, onerror) }
846
+ obj.__handle(list.__packed, handler, handleError)
847
+ : obj.__pack(list, handler, handleError) }
831
848
  Object.defineProperty(obj, '__packed', {
832
849
  value: list,
833
850
  enumerable: false,
834
851
  // NOTE: this is needed for self-resolve...
835
852
  writable: true,
836
853
  })
854
+
837
855
  // handle promise state...
838
856
  try{
839
857
  var res = obj.__unpack(list)
840
858
  }catch(err){
841
859
  promise.reject(err) }
842
- res instanceof Promise ?
843
- res
844
- .then(function(list){
845
- promise.resolve(list) })
846
- .catch(promise.reject)
847
- : promise.resolve(res)
848
- // XXX EXPEREMENTAL
849
- // XXX do we handle errors here???
850
- // self-resolve state...
851
- list instanceof Promise ?
852
- list.then(function(list){
853
- obj.__packed = list })
854
- /*/ XXX use selfResolve(..)
855
- : selfResolve(list) }
856
- /*/
857
- : list.forEach(function(elem, i){
860
+
861
+ if(res instanceof Promise){
862
+ res.then(
863
+ function(list){
864
+ promise.resolve(list)
865
+ // self-resolve...
866
+ obj.__packed = list },
867
+ handleError)
868
+ } else {
869
+ promise.resolve(res)
870
+ // self-resolve...
871
+ res.forEach(function(elem, i){
858
872
  elem instanceof Promise
859
873
  && elem.then(function(elem){
860
874
  lst = obj.__packed.slice()
861
875
  lst[i] = elem
862
- obj.__packed = lst }) }) }
863
- //*/
876
+ obj.__packed = lst }) }) } }
864
877
  return obj },
865
878
  })
866
879
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ig-types",
3
- "version": "6.24.24",
3
+ "version": "6.25.1",
4
4
  "description": "Generic JavaScript types and type extensions...",
5
5
  "main": "main.js",
6
6
  "scripts": {
package/test.js CHANGED
@@ -451,6 +451,65 @@ var cases = test.Cases({
451
451
  '.seqiter(..): STOP(..): delayed')
452
452
 
453
453
  // XXX test .seqstartiter(..)
454
+
455
+
456
+
457
+ // error...
458
+ for(var iter of ['iter', 'seqiter', 'seqstartiter']){
459
+ assert(
460
+ await Promise[iter]([1,2,Promise.resolve(3),4,5],
461
+ function(e){
462
+ if(e == 2){
463
+ throw 'ERROR' }
464
+ return e })
465
+ .catch(function(err){
466
+ return 'done' })
467
+ == 'done',
468
+ `.${iter}(..): .catch(..)`)
469
+ assert(
470
+ await Promise[iter]([1,2,Promise.resolve(3),4,5],
471
+ function(e){
472
+ if(e == 2){
473
+ throw 'ERROR' }
474
+ return e },
475
+ function(err){
476
+ return 'done' })
477
+ == 'done',
478
+ `.${iter}(..): onerror(..)`)
479
+ assert(
480
+ await Promise[iter]([1,2,Promise.resolve(3),4,5],
481
+ function(e){
482
+ if(e == 3){
483
+ throw 'ERROR' }
484
+ return e },
485
+ function(err){
486
+ return 'done' })
487
+ == 'done',
488
+ `.${iter}(..): edge onerror(..)`)
489
+ assert(
490
+ await Promise[iter]([1,2,Promise.resolve(3),4,5],
491
+ function(e){
492
+ if(e == 4){
493
+ throw 'ERROR' }
494
+ return e },
495
+ function(err){
496
+ return 'done' })
497
+ == 'done',
498
+ `.${iter}(..): late onerror(..)`)
499
+ assert(
500
+ await Promise[iter](
501
+ (function*(){
502
+ yield* [1,2,3]
503
+ throw 'ERROR' })(),
504
+ function(e){
505
+ if(e == 4){
506
+ throw 'ERROR' }
507
+ return e },
508
+ function(err){
509
+ return 'done' })
510
+ == 'done',
511
+ `.${iter}(..): late onerror(..)`)
512
+ }
454
513
  },
455
514
 
456
515
  // Date.js