Skip to content

Commit 7c25ac2

Browse files
committed
Version 3.0.0
Improves typing & spec compliance fixes: [Bug] Typing issue causes AsyncIterator.from(...) to fail against plain ES iterator-like things #21 fixes: [Bug] counter/index argument is not provided to callback functions #22
1 parent f262d3d commit 7c25ac2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+1609
-1394
lines changed

README.md

+2-3
Original file line numberDiff line numberDiff line change
@@ -167,11 +167,11 @@ Example:
167167
// inclusive
168168
Iterator.range(1, 3, 1, true).toArray(); // [1, 2, 3]
169169
// exclusive
170-
Iterator.range(1, 3, 1, true).toArray(); // [1, 2]
170+
Iterator.range(1, 3, 1).toArray(); // [1, 2]
171171
// inclusive reverse
172172
Iterator.range(-1, -3, -1, true).toArray(); // [-1, -2, -3]
173173
// exclusive
174-
Iterator.range(-1, -3, -1, true).toArray(); // [-1, -2]
174+
Iterator.range(-1, -3, -1).toArray(); // [-1, -2]
175175
// edge cases
176176
Iterator.range(1, 1, 0, false).toArray(); // []
177177
Iterator.range(0, 1, 0, true).toArray(); // []
@@ -185,7 +185,6 @@ Iterator.range(0, 0, 0, true).take(2).toArray(); // [0, 0], .range() itetates in
185185
* It takes globalThis by a polyfill written by Mathias Bynens from [his awensome article](https://mathiasbynens.be/notes/globalthis) (Lingers on fact that `__0x_6642_5d0e_72c2_4e09` preperty is writable and extensible in Object.prototype and Object.defineProperty isn't changed before the script is run).
186186
* UMD bundle is exposed into global as `__IteratorHelpersPolyfill`.
187187
* All bundles are **minified**.
188-
* Typings mutate `AsyncIterator` interface so its `T` type variable is optional and defaults to `unknown` (just to be consistent with `Iterator` interface).
189188
* Additional helpers can be removed by the `config` variable from exports.
190189
* This polyfill's size is less than 5 kb (4.62 kb atm) when compressed by Brotli compression algorithm.
191190
* Typings are made to accurately reflect behaviour of methods as much as possible.

declarations/index.d.ts

+112-112
Large diffs are not rendered by default.

package-lock.json

+1,330-1,099
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"author": "MadProbe#7435",
33
"name": "iterator-helpers-polyfill",
44
"description": "A polyfill for Iterator helpers proposal",
5-
"version": "2.3.3",
5+
"version": "3.0.0",
66
"license": "MIT",
77
"type": "module",
88
"main": "./build/bundle.min.js",
@@ -60,9 +60,9 @@
6060
"@typescript-eslint/eslint-plugin": "^6.8.0",
6161
"eslint": "^8.51.0",
6262
"eslint-plugin-import": "^2.28.1",
63-
"rollup": "^4.1.4",
63+
"rollup": "^4.14.2",
6464
"rollup-plugin-copy": "^3.5.0",
6565
"rollup-plugin-typescript2": "^0.36.0",
66-
"typescript": "^5.2.2"
66+
"typescript": "^5.4.5"
6767
}
6868
}

src/index.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ import * as async_methods from "@async/all.js";
44
import * as sync_methods from "@sync/all.js";
55
import * as additional_async from "@async/additionals/all.js";
66
import * as additional_sync from "@sync/additionals/all.js";
7-
import * as additional_async_statics from "@async/statics/additionals/all.js";
87
import * as async_statics from "@async/statics/all.js";
9-
import * as additional_sync_statics from "@sync/statics/additionals/all.js";
108
import * as sync_statics from "@sync/statics/all.js";
9+
import * as additional_async_statics from "@async/statics/additionals/all.js";
10+
import * as additional_sync_statics from "@sync/statics/additionals/all.js";
1111

1212

1313
type Methods = Record<string, AnyFunction>;

src/methods/async/additionals/all.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export { default as symmetricDifference } from "./symmetricDifference.js";
2+
export { default as asIndexedPairs } from "../indexed.js";
23
export { default as uniqueJustseen } from "./uniqueJustseen.js";
34
export { default as groupByToMap } from "./groupByToMap.js";
45
export { default as intersection } from "./intersection.js";

src/methods/async/additionals/cycle.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ import { assertIterator, assertReplace, isPositiveInteger, mimic } from "@utils/
33

44
export default mimic(0, "cycle", assertReplace((x = 1 / 0) => isPositiveInteger(x), assertIterator(
55
async function* (this: AsyncIterator<unknown>, _next: AsyncIterator<unknown, unknown, unknown>["next"], times: number) {
6-
var results: unknown[] = [], length = 0, done: boolean | void, value: unknown, lastValue: unknown, index: number;
6+
var results: unknown[] = [], length = 0, done: boolean | void, value: unknown, index: number;
77

8-
while ({ done, value } = await _next(lastValue), !done) {
9-
lastValue = yield results[length++] = value;
8+
while ({ done, value } = await _next(), !done) {
9+
yield results[length++] = value;
1010
}
1111

1212
while (times--) {

src/methods/async/additionals/dropWhile.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@ import { assert, assertIterator, closeAsyncIterator, isFunction, mimic } from "@
33

44

55
export default mimic(undefined, "dropWhile", assert(isFunction, O => O + " is not a function", assertIterator(
6-
async function* (this: AsyncIterator<unknown>, _next: AsyncIterator<unknown, unknown, unknown>["next"], fn: (item: unknown) => Promise<boolean>) {
7-
var lastValue: unknown, done: boolean | undefined, value: unknown;
6+
async function* (this: AsyncIterator<unknown>, _next: AsyncIterator<unknown, unknown, unknown>["next"], fn: (item: unknown, index: number) => Promise<boolean>) {
7+
var done: boolean | undefined, value: unknown, index = 0;
88

99
while ({ done, value } = await _next(), !done) try {
10-
if (!await fn(value)) break;
10+
if (!await fn(value, index++)) break;
1111
} catch (error) {
1212
await closeAsyncIterator(this);
1313
throw error;
1414
}
1515

16-
while ({ done, value } = await _next(lastValue), !done) lastValue = yield value;
16+
while ({ done, value } = await _next(), !done) yield value;
1717
}
1818
)));

src/methods/async/additionals/each.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ import { assert, assertIterator, closeAsyncIterator, isFunction, mimic } from "@
33

44

55
export default mimic(undefined, "each", assert(isFunction, O => `${ O } is not a function`, assertIterator(
6-
async function* (this: AsyncIterator<unknown>, _next: AsyncIterator<unknown, unknown, unknown>["next"], fn: (item: unknown) => Promise<unknown>) {
7-
var done: boolean | undefined, value: unknown, lastValue: unknown;
6+
async function* (this: AsyncIterator<unknown>, _next: AsyncIterator<unknown, unknown, unknown>["next"], fn: (item: unknown, index: number) => Promise<unknown>) {
7+
var done: boolean | undefined, value: unknown, index = 0;
88

9-
while ({ done, value } = await _next(lastValue), !done) try {
10-
await fn(value);
11-
lastValue = yield value;
9+
while ({ done, value } = await _next(), !done) try {
10+
await fn(value, index++);
11+
yield value;
1212
} catch (error) {
1313
await closeAsyncIterator(this);
1414
throw error;

src/methods/async/additionals/filterMap.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ import { SameValueZero } from "tslib";
33

44

55
export default mimic(1, "filterMap", assert(isFunction, O => `${ O } is not a function`, assertIterator(
6-
async function* (this: AsyncIterator<unknown>, _next: AsyncIterator<Iterator, never, unknown>["next"], fn: (...args: readonly unknown[]) => Promise<unknown>, ignoreValue?: unknown) {
7-
var done: boolean | undefined, value: Iterator;
6+
async function* (this: AsyncIterator<unknown>, _next: AsyncIterator<unknown, never, unknown>["next"], fn: (...args: readonly unknown[]) => Promise<unknown>, ignoreValue?: unknown) {
7+
var done: boolean | undefined, value: unknown, index = 0;
88

99
while ({ done, value } = await _next(), !done) try {
10-
const val = await fn(...value);
10+
const val = await fn(value, index++);
1111

1212
if (SameValueZero(val, ignoreValue)) {
1313
yield val;

src/methods/async/additionals/flatten.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export default mimic(0, "flatten", assertReplace((x = 1) => isPositiveInteger(x)
99

1010
while ({ done, value } = await _next(), !done) {
1111
if (depth > 0 && (typeof value !== "string" || !keepStringsAsIs && value.length > 1)) {
12-
yield* call(recurse, iterator = from(value as AsyncIterator), (next = iterator.next, ((...args: readonly unknown[]) => apply<typeof _next>(next, iterator, args))), depth - 1);
12+
yield* call(recurse, iterator = from(value as AsyncIterator<unknown>), (next = iterator.next, ((...args: readonly unknown[]) => apply<typeof _next>(next, iterator, args))), depth - 1);
1313
} else yield value;
1414
}
1515
}

src/methods/async/additionals/groupBy.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ import { assert, assertIterator, closeAsyncIterator, isFunction, mimic, pushValu
44

55

66
export default mimic(undefined, "groupBy", assert(isFunction, O => `${ O } is not a function`, assertIterator(
7-
async function (this: AsyncIterator<unknown>, _next: AsyncIterator<unknown, unknown, unknown>["next"], fn: (item: unknown) => Promise<unknown>) {
8-
var done: boolean | undefined, value: unknown, map: Record<PropertyKey, unknown[]> = {};
7+
async function (this: AsyncIterator<unknown>, _next: AsyncIterator<unknown, unknown, unknown>["next"], fn: (item: unknown, index: number) => Promise<unknown>) {
8+
var done: boolean | undefined, value: unknown, index = 0, map: Record<PropertyKey, unknown[]> = {};
99

1010
while ({ done, value } = await _next(), !done) try {
11-
pushValue(map[toPropertyKey(await fn(value))] ??= [], value);
11+
pushValue(map[toPropertyKey(await fn(value, index++))] ??= [], value);
1212
} catch (error) {
1313
await closeAsyncIterator(this);
1414
throw error;

src/methods/async/additionals/groupByToMap.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ import { assert, assertIterator, closeAsyncIterator, isFunction, mimic, pushValu
33

44

55
export default mimic(undefined, "groupByToMap", assert(isFunction, O => `${ O } is not a function`, assertIterator(
6-
async function (this: AsyncIterator<unknown>, _next: AsyncIterator<unknown, unknown, unknown>["next"], fn: (item: unknown) => Promise<unknown>) {
7-
var done: boolean | undefined, value: unknown, map: SafeMap<unknown, unknown[]> = new SafeMap;
6+
async function (this: AsyncIterator<unknown>, _next: AsyncIterator<unknown, unknown, unknown>["next"], fn: (item: unknown, index: number) => Promise<unknown>) {
7+
var done: boolean | undefined, value: unknown, index = 0, map: SafeMap<unknown, unknown[]> = new SafeMap;
88

99
while ({ done, value } = await _next(), !done) try {
10-
pushValue(map.getSet(await fn(value), Array), value);
10+
pushValue(map.getSet(await fn(value, index++), Array), value);
1111
} catch (error) {
1212
await closeAsyncIterator(this);
1313
throw error;

src/methods/async/additionals/partition.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { assert, assertIterator, closeAsyncIterator, isFunction, mimic, pushValu
55
class PartitionateAsyncIterator {
66
private _done?: readonly [unknown];
77
private rejected?: readonly [unknown];
8-
private lastValue?: unknown;
8+
private index: number = 0;
99
public constructor(private readonly _next: AsyncIterator<unknown, unknown, unknown>["next"],
1010
private readonly fn: (...args: readonly unknown[]) => Promise<boolean>, private readonly _iterator: AsyncIterator<unknown>) { }
1111
private async *start(direction: boolean, items: unknown[], opposite: unknown[]) {
@@ -15,7 +15,7 @@ class PartitionateAsyncIterator {
1515
while (items.length > 0) yield shift(items);
1616
if (this._done) break;
1717
while (1) {
18-
var { value, done } = await this._next(this.lastValue), result: boolean;
18+
var { value, done } = await this._next(), result: boolean;
1919

2020
if (done) {
2121
this._done = [value];
@@ -24,14 +24,14 @@ class PartitionateAsyncIterator {
2424
return value;
2525
}
2626
try {
27-
result = await call(this.fn, undefined!, value); // fn would be otherwise called with `this` set with current `this` value (of PartitionateAsyncIterator class);
27+
result = await call(this.fn, undefined!, value, this.index++); // fn would be otherwise called with `this` set with current `this` value (of PartitionateAsyncIterator class);
2828
} catch (error) {
2929
await closeAsyncIterator(this._iterator);
3030
throw error;
3131
}
3232
if (!!result === direction) {
3333
while (items.length > 0) yield shift(items);
34-
this.lastValue = yield value;
34+
yield value;
3535
break;
3636
} else {
3737
pushValue(opposite, value);

src/methods/async/additionals/roundrobin.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { assertIterator, assertReplaceStar, mimic } from "@utils/utils.js";
2-
import { type AnyFunction, Array, bind, undefined, unshift } from "tslib";
2+
import { type AnyFunction, bind, undefined, unshift } from "tslib";
33
import from from "@async/statics/from.js";
44

55

@@ -9,15 +9,15 @@ export default mimic(undefined, "roundrobin", assertReplaceStar(args => {
99
}
1010
}, assertIterator(
1111
async function* (this: AsyncIterator<unknown>, next: AsyncIterator<unknown, unknown, unknown>["next"], ...nexts: AsyncIterator<unknown, unknown, unknown>["next"][]) {
12-
var index, length = unshift(nexts, next), doneCount = 0, lastValues: unknown[] = Array(length);
12+
var index, length = unshift(nexts, next), doneCount = 0;
1313

1414
while (doneCount < length) {
1515
for (index = 0; index < length; index++) {
1616
if (nexts[index]) {
17-
const { done, value } = await nexts[index]!(lastValues[index]);
17+
const { done, value } = await nexts[index]();
1818

1919
if (done && ++doneCount) { delete nexts[index]; continue; }
20-
lastValues[index] = yield value;
20+
yield value;
2121
}
2222
}
2323
}

src/methods/async/additionals/starMap.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ import { assert, assertIterator, closeAsyncIterator, isFunction, mimic } from "@
33

44

55
export default mimic(undefined, "starMap", assert(isFunction, O => `${ O } is not a function`, assertIterator(
6-
async function* (this: AsyncIterator<unknown>, _next: AsyncIterator<Iterator, never, unknown>["next"], fn: (...args: readonly unknown[]) => Promise<unknown>) {
7-
var lastValue: unknown, done: boolean | undefined, value: Iterator;
6+
async function* (this: AsyncIterator<unknown>, _next: AsyncIterator<Iterator<unknown>, never, unknown>["next"], fn: (...args: readonly unknown[]) => Promise<unknown>) {
7+
var done: boolean | undefined, value: Iterator<unknown>;
88

9-
while ({ done, value } = await _next(lastValue), !done) try {
10-
lastValue = yield await fn(...value);
9+
while ({ done, value } = await _next(), !done) try {
10+
yield await fn(...value);
1111
} catch (error) {
1212
await closeAsyncIterator(this);
1313
throw error;

src/methods/async/additionals/takeWhile.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@ import { assert, assertIterator, closeAsyncIterator, isFunction, mimic } from "@
33

44

55
export default mimic(undefined, "takeWhile", assert(isFunction, O => O + " is not a function", assertIterator(
6-
async function* (this: AsyncIterator<unknown>, _next: AsyncIterator<unknown, unknown, unknown>["next"], fn: (item: unknown) => Promise<boolean>) {
7-
var lastValue: unknown, done: boolean | undefined, value: unknown;
6+
async function* (this: AsyncIterator<unknown>, _next: AsyncIterator<unknown, unknown, unknown>["next"], fn: (item: unknown, index: number) => Promise<boolean>) {
7+
var done: boolean | undefined, value: unknown, index = 0;
88

99
while ({ done, value } = await _next(), !done) try {
10-
if (!await fn(value)) break;
10+
if (!await fn(value, index++)) break;
1111
} catch (error) {
1212
await closeAsyncIterator(this);
1313
throw error;
1414
}
1515

16-
while ({ done, value } = await _next(lastValue), !done) lastValue = yield value;
16+
while ({ done, value } = await _next(), !done) yield value;
1717
}
1818
)));

src/methods/async/additionals/tee.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import { assertIterator, assertReplace, isPositiveInteger, mimic } from "@utils/
55
/** A clever implementation of tee method which is garbage-collection friendly */
66
class ClonedAsyncIterator {
77
private _done?: readonly [number, unknown];
8-
private lastValue!: unknown;
98
public constructor(private readonly _next: AsyncIterator<unknown, unknown, unknown>["next"]) { }
109
public _create(count: number): readonly AsyncGenerator[] {
1110
const a = Array<AsyncGenerator>(count), results: unknown[] = [], positions = Array<number>(count);
@@ -23,14 +22,14 @@ class ClonedAsyncIterator {
2322

2423
while ((this._done && this._done[0]) !== position) {
2524
if (position >= results.length) {
26-
const { done, value } = await this._next(this.lastValue);
25+
const { done, value } = await this._next();
2726

2827
if (done) {
2928
this._done = [position, value];
3029

3130
return value;
3231
}
33-
this.lastValue = yield results[position++] = value;
32+
yield results[position++] = value;
3433
positions[index] = position;
3534
continue;
3635
}

src/methods/async/all.ts

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
export { default as asIndexedPairs } from "./indexed.js";
21
export { default as flatMap } from "./flatMap.js";
32
export { default as forEach } from "./forEach.js";
43
export { default as indexed } from "./indexed.js";

src/methods/async/drop.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ export default mimic(undefined, "drop", assertReplace(isPositiveInteger, assertI
88
if ((await _next()).done) return;
99
}
1010

11-
for (var lastValue: unknown, done: boolean | undefined, value: unknown; { done, value } = await _next(lastValue), !done;) {
12-
lastValue = yield value;
11+
for (var done: boolean | undefined, value: unknown; { done, value } = await _next(), !done;) {
12+
yield value;
1313
}
1414
}
1515
)));

src/methods/async/every.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ import { assert, assertIterator, closeAsyncIterator, isFunction, mimic } from "@
33

44

55
export default mimic(undefined, "every", assert(isFunction, O => `${ O } is not a function`, assertIterator(
6-
async function (this: AsyncIterator<unknown>, _next: AsyncIterator<unknown, unknown, unknown>["next"], fn: (item: unknown) => Promise<boolean>) {
7-
var done: boolean | undefined, value: unknown;
6+
async function (this: AsyncIterator<unknown>, _next: AsyncIterator<unknown, unknown, unknown>["next"], fn: (item: unknown, index: number) => Promise<boolean>) {
7+
var done: boolean | undefined, value: unknown, index = 0;
88

99
while ({ done, value } = await _next(), !done) try {
10-
if (!await fn(value)) return closeAsyncIterator(this, false);
10+
if (!await fn(value, index++)) return closeAsyncIterator(this, false);
1111
} catch (error) {
1212
await closeAsyncIterator(this);
1313
throw error;

src/methods/async/filter.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ import { assert, assertIterator, closeAsyncIterator, isFunction, mimic } from "@
33

44

55
export default mimic(undefined, "filter", assert(isFunction, O => `${ O } is not a function`, assertIterator(
6-
async function* (this: AsyncIterator<unknown>, _next: AsyncIterator<unknown, unknown, unknown>["next"], fn: (item: unknown) => Promise<boolean>) {
7-
for (var lastValue: unknown, done: boolean | undefined, value: unknown; { done, value } = await _next(lastValue), !done;) {
6+
async function* (this: AsyncIterator<unknown>, _next: AsyncIterator<unknown, unknown, unknown>["next"], fn: (item: unknown, index: number) => Promise<boolean>) {
7+
for (var done: boolean | undefined, value: unknown, index = 0; { done, value } = await _next(), !done;) {
88
try {
9-
if (await fn(value)) lastValue = yield value;
9+
if (await fn(value, index++)) yield value;
1010
} catch (error) {
1111
await closeAsyncIterator(this);
1212
throw error;

src/methods/async/find.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ import { assert, assertIterator, closeAsyncIterator, isFunction, mimic } from "@
33

44

55
export default mimic(undefined, "find", assert(isFunction, O => `${ O } is not a function`, assertIterator(
6-
async function (this: AsyncIterator<unknown>, _next: AsyncIterator<unknown, unknown, unknown>["next"], fn: (item: unknown) => Promise<boolean>) {
7-
var value: unknown, done: boolean | undefined;
6+
async function (this: AsyncIterator<unknown>, _next: AsyncIterator<unknown, unknown, unknown>["next"], fn: (item: unknown, index: number) => Promise<boolean>) {
7+
var value: unknown, done: boolean | undefined, index = 0;
88

99
while ({ value, done } = await _next(), !done) try {
10-
if (await fn(value)) return closeAsyncIterator(this, value);
10+
if (await fn(value, index++)) return closeAsyncIterator(this, value);
1111
} catch (error) {
1212
await closeAsyncIterator(this);
1313
throw error;

0 commit comments

Comments
 (0)