extra-iterator 0.10.2 → 0.11.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/dist/index.d.ts CHANGED
@@ -46,12 +46,21 @@ export declare class ExtraIterator<T> extends Iterator<T, any, any> {
46
46
  *
47
47
  * @example
48
48
  * ExtraIterator.range(5, 10).toArray() // returns [5, 6, 7, 8, 9]
49
- * ExtraIterator.range(5, 10).append(10).toArray() // returns [5, 6, 7, 8, 9, 10]
50
- * ExtraIterator.range(1, 10, 2).toArray() // returns [1, 3, 5, 7, 9]
51
- * ExtraIterator.range(0, 1, 0.25).toArray() // returns [0, 0.25, 0.5, 0.75]
52
- * ExtraIterator.range(10, 0, -2).toArray() // returns [10, 8, 6, 4, 2]
49
+ * ExtraIterator.range(5, 10, { inclusive: true }).toArray() // returns [5, 6, 7, 8, 9, 10]
50
+ *
51
+ * // Counting down:
52
+ * ExtraIterator.range(10, 0).toArray() // return [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
53
+ * ExtraIterator.range(10, 0, { inclusive: true }).toArray() // return [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
54
+ *
55
+ * // Custom stepping value:
56
+ * ExtraIterator.range(1, 10, { step: 2 }).toArray() // returns [1, 3, 5, 7, 9]
57
+ * ExtraIterator.range(0, 1, { step: 0.25 }).toArray() // returns [0, 0.25, 0.5, 0.75]
58
+ * ExtraIterator.range(10, 0, { step: 2 }).toArray() // returns [10, 8, 6, 4, 2]
53
59
  */
54
- static range(start: number, end: number, step?: number): ExtraIterator<number>;
60
+ static range(start: number, end: number, { inclusive, step }?: {
61
+ inclusive?: boolean | undefined;
62
+ step?: number | undefined;
63
+ }): ExtraIterator<number>;
55
64
  /**
56
65
  * Creates an iterator that repeatedly yields the provided value.
57
66
  *
@@ -324,7 +333,7 @@ export declare class ExtraIterator<T> extends Iterator<T, any, any> {
324
333
  * .toArray()
325
334
  * // returns { even: [2, 4], odd: [1, 3, 5] }
326
335
  */
327
- groupBy<K extends string | symbol>(callbackfn: (value: T, index: number) => K): Record<K, T[]>;
336
+ groupBy<K extends string | symbol>(callbackfn: (value: T, index: number) => K): Partial<Record<K, T[]>>;
328
337
  /**
329
338
  * Groups elements into separate arrays and returns a Map containing each group.
330
339
  *
package/dist/index.js CHANGED
@@ -54,23 +54,30 @@ export class ExtraIterator extends Iterator {
54
54
  *
55
55
  * @example
56
56
  * ExtraIterator.range(5, 10).toArray() // returns [5, 6, 7, 8, 9]
57
- * ExtraIterator.range(5, 10).append(10).toArray() // returns [5, 6, 7, 8, 9, 10]
58
- * ExtraIterator.range(1, 10, 2).toArray() // returns [1, 3, 5, 7, 9]
59
- * ExtraIterator.range(0, 1, 0.25).toArray() // returns [0, 0.25, 0.5, 0.75]
60
- * ExtraIterator.range(10, 0, -2).toArray() // returns [10, 8, 6, 4, 2]
57
+ * ExtraIterator.range(5, 10, { inclusive: true }).toArray() // returns [5, 6, 7, 8, 9, 10]
58
+ *
59
+ * // Counting down:
60
+ * ExtraIterator.range(10, 0).toArray() // return [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
61
+ * ExtraIterator.range(10, 0, { inclusive: true }).toArray() // return [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
62
+ *
63
+ * // Custom stepping value:
64
+ * ExtraIterator.range(1, 10, { step: 2 }).toArray() // returns [1, 3, 5, 7, 9]
65
+ * ExtraIterator.range(0, 1, { step: 0.25 }).toArray() // returns [0, 0.25, 0.5, 0.75]
66
+ * ExtraIterator.range(10, 0, { step: 2 }).toArray() // returns [10, 8, 6, 4, 2]
61
67
  */
62
- static range(start, end, step = 1) {
68
+ static range(start, end, { inclusive = false, step = 1 } = {}) {
63
69
  return ExtraIterator.from(function* () {
64
- if (Math.abs(step) < Number.EPSILON) {
70
+ step = Math.abs(step);
71
+ if (step < Number.EPSILON) {
65
72
  throw new Error('Failed to create range. Cause: Range step cannot be 0.');
66
73
  }
67
- else if (step > 0) {
68
- for (let i = start; i < end; i += step) {
74
+ else if (end > start) {
75
+ for (let i = start; inclusive ? i <= end : i < end; i += step) {
69
76
  yield i;
70
77
  }
71
78
  }
72
79
  else {
73
- for (let i = start; i > end; i += step) {
80
+ for (let i = start; inclusive ? i >= end : i > end; i -= step) {
74
81
  yield i;
75
82
  }
76
83
  }
@@ -580,15 +587,7 @@ export class ExtraIterator extends Iterator {
580
587
  * // returns { even: [2, 4], odd: [1, 3, 5] }
581
588
  */
582
589
  groupBy(callbackfn) {
583
- const result = Object.create(null);
584
- for (let index = 0, next; next = this.next(), !next.done; index++) {
585
- const key = callbackfn(next.value, index);
586
- if (!result[key]) {
587
- result[key] = [];
588
- }
589
- result[key].push(next.value);
590
- }
591
- return result;
590
+ return this.collect(items => Object.groupBy(items, callbackfn));
592
591
  }
593
592
  /**
594
593
  * Groups elements into separate arrays and returns a Map containing each group.
@@ -600,26 +599,13 @@ export class ExtraIterator extends Iterator {
600
599
  * This method is similart to {@link groupBy}, but the returned object is a Map instead of a plain object.
601
600
  */
602
601
  toMap(callbackfn) {
603
- const result = new Map();
604
- for (let index = 0, next; next = this.next(), !next.done; index++) {
605
- const key = callbackfn(next.value, index);
606
- const array = result.get(key);
607
- if (!array) {
608
- result.set(key, [next.value]);
609
- }
610
- else {
611
- array.push(next.value);
612
- }
613
- }
614
- return result;
602
+ return this.collect(items => Map.groupBy(items, callbackfn));
615
603
  }
616
604
  /**
617
605
  * Creates a set containing all the values yielded by this iterator.
618
606
  */
619
607
  toSet() {
620
- const result = new Set();
621
- this.forEach(value => result.add(value));
622
- return result;
608
+ return new Set(this);
623
609
  }
624
610
  toChainOfResponsibilityFunction(invokeHandler) {
625
611
  const handlers = this.toArray();
@@ -1,7 +1,7 @@
1
1
  import { ExtraIterator } from './index';
2
2
  import { describe, it } from 'node:test';
3
3
  import { expect } from 'expect';
4
- describe('ExtraIterator', () => {
4
+ describe(ExtraIterator.name, () => {
5
5
  it('should create an ExtraIterator from an array', () => {
6
6
  const array = [1, 2, 3];
7
7
  const iterator = ExtraIterator.from(array);
@@ -195,11 +195,25 @@ describe('ExtraIterator', () => {
195
195
  const iterator = ExtraIterator.from([1, 2, 3]).loop(3);
196
196
  expect(iterator.toArray()).toEqual([1, 2, 3, 1, 2, 3, 1, 2, 3]);
197
197
  });
198
- it('should iterate over ranges', () => {
199
- expect(ExtraIterator.range(5, 10).toArray()).toEqual([5, 6, 7, 8, 9]);
200
- expect(ExtraIterator.range(5, 10).append(10).toArray()).toEqual([5, 6, 7, 8, 9, 10]);
201
- expect(ExtraIterator.range(1, 10, 2).toArray()).toEqual([1, 3, 5, 7, 9]);
202
- expect(ExtraIterator.range(0, 1, 0.25).toArray()).toEqual([0, 0.25, 0.5, 0.75]);
203
- expect(ExtraIterator.range(10, 0, -2).toArray()).toEqual([10, 8, 6, 4, 2]);
198
+ describe(ExtraIterator.range.name, () => {
199
+ it('should iterate over ranges', () => {
200
+ expect(ExtraIterator.range(5, 10).toArray()).toEqual([5, 6, 7, 8, 9]);
201
+ expect(ExtraIterator.range(5, 10).append(10).toArray()).toEqual([5, 6, 7, 8, 9, 10]);
202
+ });
203
+ it('should iterate over ranges with steps', () => {
204
+ expect(ExtraIterator.range(1, 10, { step: 2 }).toArray()).toEqual([1, 3, 5, 7, 9]);
205
+ expect(ExtraIterator.range(0, 1, { step: 0.25 }).toArray()).toEqual([0, 0.25, 0.5, 0.75]);
206
+ expect(ExtraIterator.range(10, 0, { step: 2 }).toArray()).toEqual([10, 8, 6, 4, 2]);
207
+ expect(ExtraIterator.range(10, 0, { step: -2 }).toArray()).toEqual([10, 8, 6, 4, 2]);
208
+ });
209
+ it('should iterate over inclusive ranges', () => {
210
+ expect(ExtraIterator.range(1, 10, { inclusive: true }).toArray()).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
211
+ expect(ExtraIterator.range(1, 10, { inclusive: true, step: 2 }).toArray()).toEqual([1, 3, 5, 7, 9]);
212
+ expect(ExtraIterator.range(0, 1, { inclusive: true, step: 0.25 }).toArray()).toEqual([0, 0.25, 0.5, 0.75, 1]);
213
+ expect(ExtraIterator.range(10, 0, { inclusive: true, step: -2 }).toArray()).toEqual([10, 8, 6, 4, 2, 0]);
214
+ });
215
+ it('should throw an error if the step is 0', () => {
216
+ expect(() => ExtraIterator.range(0, 10, { step: 0 }).toArray()).toThrow();
217
+ });
204
218
  });
205
219
  });
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.10.2",
6
+ "version": "0.11.0",
7
7
  "type": "module",
8
8
  "exports": {
9
9
  ".": "./dist/index.js",