ig-types 6.16.3 → 6.18.0

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/Array.js CHANGED
@@ -482,6 +482,35 @@ object.Mixin('ArrayProtoMixin', 'soft', {
482
482
  this.constructor.zip(this, func, ...arrays)
483
483
  : this.constructor.zip(func, this, ...arrays) },
484
484
 
485
+ // Insert new values between elements of an array
486
+ //
487
+ // .between(value)
488
+ // -> array
489
+ //
490
+ // .between(func)
491
+ // -> array
492
+ //
493
+ // func([a, b], from_index, to_index, array)
494
+ // -> elem
495
+ //
496
+ between: function(func){
497
+ var res = []
498
+ // NOTE: we skip the last element...
499
+ for(var i=0; i < this.length; i+=1){
500
+ var pair = new Array(2)
501
+ i in this ?
502
+ res.push(pair[0] = this[i])
503
+ : (res.length += 1)
504
+ if(i+1 >= this.length){
505
+ break }
506
+ i+1 in this
507
+ && (pair[1] = this[i+1])
508
+ res.push(
509
+ typeof(func) == 'function' ?
510
+ func.call(this, pair, i, res.length, this)
511
+ : func) }
512
+ return res },
513
+
485
514
  // get iterator over array...
486
515
  //
487
516
  // Array.iter()
package/Promise.js CHANGED
@@ -249,6 +249,15 @@ object.Constructor('IterablePromise', Promise, {
249
249
  : (await Promise.all(list))
250
250
  .flat() },
251
251
 
252
+ [Symbol.asyncIterator]: async function*(){
253
+ var list = this.__packed
254
+ if(list instanceof Promise){
255
+ yield this.__unpack(await list)
256
+ return }
257
+ for await(var elem of list){
258
+ yield* elem instanceof Array ?
259
+ elem
260
+ : [elem] } },
252
261
 
253
262
  // iterator methods...
254
263
  //
@@ -294,6 +303,22 @@ object.Constructor('IterablePromise', Promise, {
294
303
  .then(function(){
295
304
  return res }) },
296
305
 
306
+ // XXX BETWEEN...
307
+ between: function(func){
308
+ var i = 0
309
+ var j = 0
310
+ var prev
311
+ return this.constructor(this,
312
+ function(e){
313
+ return i++ > 0 ?
314
+ [
315
+ typeof(func) == 'function' ?
316
+ func.call(this, [prev, e], i, i + j++)
317
+ : func,
318
+ e,
319
+ ]
320
+ : [e] }) },
321
+
297
322
  // XXX .chain(..) -- see generator.chain(..)
298
323
 
299
324
  flat: function(depth=1){
package/README.md CHANGED
@@ -30,6 +30,7 @@ Library of JavaScript type extensions, types and utilities.
30
30
  - [`<array>.toMap(..)`](#arraytomap)
31
31
  - [`Array.zip(..)` / `<array>.zip(..)`](#arrayzip--arrayzip)
32
32
  - [`Array.iter(..)` / `<array>.iter()`](#arrayiter--arrayiter)
33
+ - [`<array>.between(..)`](#arraybetween)
33
34
  - [Abortable `Array` iteration](#abortable-array-iteration)
34
35
  - [`array.STOP` / `array.STOP(..)`](#arraystop--arraystop)
35
36
  - [`<array>.smap(..)` / `<array>.sfilter(..)` / `<array>.sreduce(..)` / `<array>.sforEach(..)`](#arraysmap--arraysfilter--arraysreduce--arraysforeach)
@@ -75,6 +76,7 @@ Library of JavaScript type extensions, types and utilities.
75
76
  - [`<promise>.iter()`](#promiseiter)
76
77
  - [`<promise-iter>.iter()`](#promise-iteriter)
77
78
  - [`<promise-iter>.map(..)` / `<promise-iter>.filter(..)` / `<promise-iter>.reduce(..)`](#promise-itermap--promise-iterfilter--promise-iterreduce)
79
+ - [`<promise-iter>.between(..)`](#promise-iterbetween)
78
80
  - [`<promise-iter>.flat(..)`](#promise-iterflat)
79
81
  - [`<promise-iter>.reverse()`](#promise-iterreverse)
80
82
  - [`<promise-iter>.concat(..)`](#promise-iterconcat)
@@ -100,6 +102,8 @@ Library of JavaScript type extensions, types and utilities.
100
102
  - [`<generator>.iter(..)`](#generatoriter-1)
101
103
  - [`<generator>.map(..)` / `<generator>.filter(..)`](#generatormap--generatorfilter)
102
104
  - [`<generator>.reduce(..)` / `<generator>.greduce(..)`](#generatorreduce--generatorgreduce)
105
+ - [`<generator>.forEach(..)` (EXPERIMENTAL)](#generatorforeach-experimental)
106
+ - [`<generator>.between(..)`](#generatorbetween)
103
107
  - [`<generator>.slice(..)`](#generatorslice)
104
108
  - [`<generator>.at(..)` / `<generator>.gat(..)`](#generatorat--generatorgat)
105
109
  - [`<generator>.flat(..)`](#generatorflat)
@@ -116,6 +120,7 @@ Library of JavaScript type extensions, types and utilities.
116
120
  - [`<generator>.unshift(..)` / `<generator>.push(..)`](#generatorunshift--generatorpush-1)
117
121
  - [`<Generator>.slice(..)`](#generatorslice-1)
118
122
  - [`<Generator>.map(..)` / `<Generator>.filter(..)` / `<Generator>.reduce(..)` / `<Generator>.flat()`](#generatormap--generatorfilter--generatorreduce--generatorflat)
123
+ - [`<Generator>.between(..)`](#generatorbetween-1)
119
124
  - [`<Generator>.toArray()`](#generatortoarray-1)
120
125
  - [`<Generator>.join(..)`](#generatorjoin-1)
121
126
  - [`<Generator>.then(..)` / `<Generator>.catch(..)` / `<Generator>.finally(..)`](#generatorthen--generatorcatch--generatorfinally-1)
@@ -736,6 +741,19 @@ Return an iterator/generator from the current array.
736
741
  This is mostly useful in combination with the [Generator extensions and utilities](#generator-extensions-and-utilities)
737
742
 
738
743
 
744
+ ### `<array>.between(..)`
745
+
746
+ ```bnf
747
+ <array>.between(<value>)
748
+ -> <array>
749
+ <array>.between(<func>)
750
+ -> <array>
751
+
752
+ <func>([<pre>, <post>], <index-in>, <index-out>, <array>)
753
+ -> <value>
754
+ ```
755
+
756
+
739
757
  ### Abortable `Array` iteration
740
758
 
741
759
  A an alternative to `Array`'s `.map(..)` / `.filter(..)` / .. methods with ability to
@@ -1562,6 +1580,14 @@ in how they process values:
1562
1580
  appropriate method on the result.
1563
1581
  <!-- XXX list + mark definitions as "(proxy)" -->
1564
1582
 
1583
+ Promise iterators directly support _for-await-of_ iteration:
1584
+
1585
+ ```javascript
1586
+ for await (var elem of Promise.iter(/* ... */)){
1587
+ // ...
1588
+ }
1589
+ ```
1590
+
1565
1591
  <!--
1566
1592
  XXX should we support generators as input?
1567
1593
  ...not sure about the control flow direction here, on one hand the generator
@@ -1657,6 +1683,19 @@ Note that since `.reduce(..)` handler's execution order can not be known,
1657
1683
  there is no point in implementing `.reduceRigth(..)`.
1658
1684
 
1659
1685
 
1686
+ ### `<promise-iter>.between(..)`
1687
+
1688
+ ```bnf
1689
+ <promise-iter>.between(<value>)
1690
+ -> <promise-iter>
1691
+ <promise-iter>.between(<func>)
1692
+ -> <promise-iter>
1693
+
1694
+ <func>([<pre>, <post>], <index-in>, <index-out>, <promise-iter>)
1695
+ -> <value>
1696
+ ```
1697
+
1698
+
1660
1699
  #### `<promise-iter>.flat(..)`
1661
1700
 
1662
1701
  ```bnf
@@ -2135,6 +2174,31 @@ XXX .reduce(..) can return a non-iterable -- test and document this case...
2135
2174
  ...compare with Array.prototype.reduce(..)
2136
2175
  -->
2137
2176
 
2177
+ #### `<generator>.forEach(..)` (EXPERIMENTAL)
2178
+
2179
+ ```bnf
2180
+ <generator>.forEach(<func>)
2181
+ -> <array>
2182
+ ```
2183
+
2184
+ This is different from the above in that this will unwind the `<generator>`.
2185
+
2186
+ Note that this differs from `<array>.forEach(..)` in that his will return the
2187
+ resulting array, essentially behaving like `.map(..)`.
2188
+
2189
+
2190
+ #### `<generator>.between(..)`
2191
+
2192
+ ```bnf
2193
+ <generator>.between(<value>)
2194
+ -> <generator>
2195
+ <generator>.between(<func>)
2196
+ -> <generator>
2197
+
2198
+ <func>([<pre>, <post>], <index-in>, <index-out>, <generator>)
2199
+ -> <value>
2200
+ ```
2201
+
2138
2202
 
2139
2203
  #### `<generator>.slice(..)`
2140
2204
 
@@ -2416,6 +2480,19 @@ but return a `<Generator>`.
2416
2480
  <!-- XXX -->
2417
2481
 
2418
2482
 
2483
+ #### `<Generator>.between(..)`
2484
+
2485
+ ```bnf
2486
+ <Generator>.between(<value>)
2487
+ -> <Generator>
2488
+ <Generator>.between(<func>)
2489
+ -> <Generator>
2490
+
2491
+ <func>([<pre>, <post>], <index-in>, <index-out>, <Generator>)
2492
+ -> <value>
2493
+ ```
2494
+
2495
+
2419
2496
  #### `<Generator>.toArray()`
2420
2497
 
2421
2498
  Return a function that will return a `<generator>` output as an `Array`.
package/generator.js CHANGED
@@ -223,6 +223,15 @@ object.Mixin('GeneratorMixin', 'soft', {
223
223
  reduce: makeGenerator('reduce'),
224
224
  reduceRight: makeGenerator('reduceRight'),
225
225
 
226
+ between: makeGenerator('between'),
227
+
228
+ // XXX EXPERIMENTAL
229
+ // XXX add .toString(..) to this???
230
+ forEach: function(func){
231
+ var that = this
232
+ return function(){
233
+ return that(...arguments).forEach(func) } },
234
+
226
235
  // non-generators...
227
236
  //
228
237
  toArray: function(){
@@ -397,6 +406,26 @@ object.Mixin('GeneratorProtoMixin', 'soft', {
397
406
  greduce: function*(func, res){
398
407
  yield this.reduce(...arguments) },
399
408
 
409
+ between: stoppable(function*(func){
410
+ var i = 0
411
+ var j = 0
412
+ var prev
413
+ for(var e of this){
414
+ if(i > 0){
415
+ yield typeof(func) == 'function' ?
416
+ func.call(this, [prev, e], i-1, i + j++, this)
417
+ : func }
418
+ prev = e
419
+ yield e
420
+ i++ } }),
421
+
422
+ // NOTE: this is a special case in that it will unwind the generator...
423
+ // NOTE: this is different from <array>.forEach(..) in that this will
424
+ // return the resulting array.
425
+ // XXX EXPERIMENTAL
426
+ forEach: function(func){
427
+ return [...this].map(func) },
428
+
400
429
  pop: function(){
401
430
  return [...this].pop() },
402
431
  // XXX this needs the value to be iterable...
@@ -490,6 +519,9 @@ object.Mixin('AsyncGeneratorMixin', 'soft', {
490
519
  map: makeGenerator('async', 'map'),
491
520
  filter: makeGenerator('async', 'filter'),
492
521
  reduce: makeGenerator('async', 'reduce'),
522
+
523
+ // XXX TEST...
524
+ between: makeGenerator('async', 'between'),
493
525
  })
494
526
 
495
527
  var AsyncGeneratorProtoMixin =
@@ -547,6 +579,21 @@ object.Mixin('AsyncGeneratorProtoMixin', 'soft', {
547
579
  return [] })
548
580
  return state },
549
581
 
582
+ // XXX BETWEEN...
583
+ between: async function*(func){
584
+ var i = 0
585
+ var j = 0
586
+ var prev
587
+ yield* this.iter(function(e){
588
+ return i++ > 0 ?
589
+ [
590
+ typeof(func) == 'function' ?
591
+ func.call(this, [prev, e], i, i + j++, this)
592
+ : func,
593
+ e,
594
+ ]
595
+ : [e] }) },
596
+
550
597
  // XXX TEST...
551
598
  chain: async function*(...next){
552
599
  yield* next
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ig-types",
3
- "version": "6.16.3",
3
+ "version": "6.18.0",
4
4
  "description": "Generic JavaScript types and type extensions...",
5
5
  "main": "main.js",
6
6
  "scripts": {