extra-iterator 0.8.0 → 0.9.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.
package/dist/index.d.ts CHANGED
@@ -187,6 +187,23 @@ export declare class ExtraIterator<T> extends Iterator<T, any, any> {
187
187
  * // returns [[1, 2, 3], [4, 5, 6], [7]]
188
188
  */
189
189
  chunk(size: number): ExtraIterator<T[]>;
190
+ /**
191
+ * Groups the elements in this iterator into groups of variable size.
192
+ *
193
+ * This method calls the provided predicate function for each pair of adjacent elements in this iterator. It should
194
+ * return `true` if the elements should belong to the same group, or `false` if they should belong to different
195
+ * groups.
196
+ *
197
+ * The resulting iterator yields arrays of elements that belong to the same group.
198
+ *
199
+ * @example
200
+ *
201
+ * ExtraIterator.from([1, 1, 2, 3, 3, 3, 2, 2])
202
+ * .chunkWith((lhs, rhs) => lhs === rhs)
203
+ * .toArray()
204
+ * // returns [[1, 1], [2], [3, 3, 3], [2, 2]]
205
+ */
206
+ chunkWith(predicate: (lhs: T, rhs: T, index: number, chunk: [T, ...T[]]) => boolean): ExtraIterator<T[]>;
190
207
  /**
191
208
  * Creates a new iterator that iterates on this iterator and the proviuded other iterator, yielding arrays of pairs
192
209
  * of elements from this iterator and the other.
@@ -343,7 +360,7 @@ export declare class ExtraIterator<T> extends Iterator<T, any, any> {
343
360
  * ExtraIterator.from([1, 2, 3]).uniqueness() // returns true
344
361
  * ExtraIterator.from([1, 2, 3, 1]).uniqueness() // returns false
345
362
  */
346
- uniqueness(mapper?: (value: T) => unknown): boolean;
363
+ testUnique(mapper?: (value: T) => unknown): boolean;
347
364
  /**
348
365
  * Lazily executes a function over each element of this iterator as the values are iterated.
349
366
  *
package/dist/index.js CHANGED
@@ -137,7 +137,7 @@ export class ExtraIterator extends Iterator {
137
137
  * @example ExtraIterator.from([[1, 2], [3, 4]]).flatten().toArray() // returns [1, 2, 3, 4]
138
138
  */
139
139
  flatten() {
140
- return this.flatMap(value => value);
140
+ return this.flatMap(value => Array.isArray(value) ? new ExtraIterator(value).flatten() : [value]);
141
141
  }
142
142
  /**
143
143
  * Creates a new iterator that yields the values of this iterator, but won't yield any duplicates.
@@ -311,6 +311,41 @@ export class ExtraIterator extends Iterator {
311
311
  }
312
312
  }.call(this));
313
313
  }
314
+ /**
315
+ * Groups the elements in this iterator into groups of variable size.
316
+ *
317
+ * This method calls the provided predicate function for each pair of adjacent elements in this iterator. It should
318
+ * return `true` if the elements should belong to the same group, or `false` if they should belong to different
319
+ * groups.
320
+ *
321
+ * The resulting iterator yields arrays of elements that belong to the same group.
322
+ *
323
+ * @example
324
+ *
325
+ * ExtraIterator.from([1, 1, 2, 3, 3, 3, 2, 2])
326
+ * .chunkWith((lhs, rhs) => lhs === rhs)
327
+ * .toArray()
328
+ * // returns [[1, 1], [2], [3, 3, 3], [2, 2]]
329
+ */
330
+ chunkWith(predicate) {
331
+ return ExtraIterator.from(function* () {
332
+ const first = this.next();
333
+ if (first.done) {
334
+ return;
335
+ }
336
+ let chunk = [first.value];
337
+ for (let left = first, right, index = 0; right = this.next(), !right.done; left = right, index++) {
338
+ if (predicate(left.value, right.value, index, chunk)) {
339
+ chunk.push(left.value);
340
+ }
341
+ else {
342
+ yield chunk;
343
+ chunk = [right.value];
344
+ }
345
+ }
346
+ yield chunk;
347
+ }.call(this));
348
+ }
314
349
  /**
315
350
  * Creates a new iterator that iterates on this iterator and the proviuded other iterator, yielding arrays of pairs
316
351
  * of elements from this iterator and the other.
@@ -615,7 +650,7 @@ export class ExtraIterator extends Iterator {
615
650
  * ExtraIterator.from([1, 2, 3]).uniqueness() // returns true
616
651
  * ExtraIterator.from([1, 2, 3, 1]).uniqueness() // returns false
617
652
  */
618
- uniqueness(mapper) {
653
+ testUnique(mapper) {
619
654
  const seen = new Set();
620
655
  for (let next; next = this.next(), !next.done;) {
621
656
  const value = mapper ? mapper(next.value) : next.value;
@@ -47,8 +47,8 @@ describe('ExtraIterator', () => {
47
47
  expect(iterator.toArray()).toEqual([3, 4]);
48
48
  });
49
49
  it('should flatten nested iterables', () => {
50
- const iterator = ExtraIterator.from([[1, 2], [3, 4]]).flatten();
51
- expect(iterator.toArray()).toEqual([1, 2, 3, 4]);
50
+ const iterator = ExtraIterator.from([0, [1, [2, [3, 4]]], [5, [6]], 7]).flatten();
51
+ expect(iterator.toArray()).toEqual([0, 1, 2, 3, 4, 5, 6, 7]);
52
52
  });
53
53
  it('should return the first value', () => {
54
54
  const iterator = ExtraIterator.from([1, 2, 3]);
@@ -164,6 +164,14 @@ describe('ExtraIterator', () => {
164
164
  expect(iter.sum()).toBe(26);
165
165
  });
166
166
  });
167
+ describe('chunkWith', () => {
168
+ it('should chunk using a comparer function', () => {
169
+ const result = ExtraIterator.from([1, 1, 2, 3, 3, 3, 2, 2])
170
+ .chunkWith((lhs, rhs) => lhs === rhs)
171
+ .toArray();
172
+ expect(result).toEqual([[1, 1], [2], [3, 3, 3], [2, 2]]);
173
+ });
174
+ });
167
175
  it('should create a chain of responsibility function', () => {
168
176
  const humanizeDuration = ExtraIterator.from([
169
177
  (next, miliseconds) => miliseconds < 1000 ? `${miliseconds} miliseconds` : next(miliseconds / 1000),
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "An extension of the Iterator class with additional utility helper functions.",
4
4
  "author": "Leonardo Raele <leonardoraele@gmail.com>",
5
5
  "license": "MIT",
6
- "version": "0.8.0",
6
+ "version": "0.9.1",
7
7
  "type": "module",
8
8
  "exports": {
9
9
  ".": "./dist/index.js",