Skip to content

Commit d3f4ca6

Browse files
committed
[RFC] Improve core types for (Async) Iterable/Iterator/Generator
* Changes `@@iterator` method to return more specific type in Generators. * An `$Iterator` is an `$Iterable` * Add optional `return` and `throw` methods to `$Iterator` (http://www.ecma-international.org/ecma-262/7.0/#table-54) * A `$Generator` is an `$Iterator` * Fix mistaken function name to `$asyncIterate` to match style of `$iterate`.
1 parent f35d3a9 commit d3f4ca6

File tree

1 file changed

+19
-15
lines changed

1 file changed

+19
-15
lines changed

lib/core.js

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -547,20 +547,22 @@ type IteratorResult<Yield,Return> =
547547
| { done: true, value?: Return }
548548
| { done: false, value: Yield };
549549

550-
interface $Iterator<+Yield,+Return,-Next> {
551-
@@iterator(): $Iterator<Yield,Return,Next>;
552-
next(value?: Next): IteratorResult<Yield,Return>;
553-
}
554-
type Iterator<+T> = $Iterator<T,void,void>;
555-
556550
interface $Iterable<+Yield,+Return,-Next> {
557551
@@iterator(): $Iterator<Yield,Return,Next>;
558552
}
559553
type Iterable<+T> = $Iterable<T,void,void>;
560554

561-
interface Generator<+Yield,+Return,-Next> {
555+
interface $Iterator<+Yield,+Return,-Next> extends $Iterable<Yield,Return,Next> {
562556
@@iterator(): $Iterator<Yield,Return,Next>;
563557
next(value?: Next): IteratorResult<Yield,Return>;
558+
+return?: <R>(value: R) => IteratorResult<Yield,R|Return>;
559+
+throw?: (error?: any) => IteratorResult<Yield,Return>;
560+
}
561+
type Iterator<+T> = $Iterator<T,void,void>;
562+
563+
interface Generator<+Yield,+Return,-Next> extends $Iterator<Yield,Return,Next> {
564+
@@iterator(): Generator<Yield,Return,Next>;
565+
next(value?: Next): IteratorResult<Yield,Return>;
564566
return<R>(value: R): IteratorResult<Yield,R|Return>;
565567
throw(error?: any): IteratorResult<Yield,Return>;
566568
}
@@ -569,25 +571,27 @@ declare function $iterate<T>(p: Iterable<T>): T;
569571

570572
/* Async Iterable/Iterator/Generator */
571573

572-
interface $AsyncIterator<+Yield,+Return,-Next> {
573-
@@asyncIterator(): $AsyncIterator<Yield,Return,Next>;
574-
next(value?: Next): Promise<IteratorResult<Yield,Return>>;
575-
}
576-
type AsyncIterator<+T> = $AsyncIterator<T,void,void>;
577-
578574
interface $AsyncIterable<+Yield,+Return,-Next> {
579575
@@asyncIterator(): $AsyncIterator<Yield,Return,Next>;
580576
}
581577
type AsyncIterable<+T> = $AsyncIterable<T,void,void>;
582578

583-
interface AsyncGenerator<+Yield,+Return,-Next> {
579+
interface $AsyncIterator<+Yield,+Return,-Next> extends $AsyncIterable<Yield,Return,Next> {
584580
@@asyncIterator(): $AsyncIterator<Yield,Return,Next>;
585581
next(value?: Next): Promise<IteratorResult<Yield,Return>>;
582+
+return?: <R>(value: R) => Promise<IteratorResult<Yield,R|Return>>;
583+
+throw?: (error?: any) => Promise<IteratorResult<Yield,Return>>;
584+
}
585+
type AsyncIterator<+T> = $AsyncIterator<T,void,void>;
586+
587+
interface AsyncGenerator<+Yield,+Return,-Next> extends $AsyncIterator {
588+
@@asyncIterator(): AsyncGenerator<Yield,Return,Next>;
589+
next(value?: Next): Promise<IteratorResult<Yield,Return>>;
586590
return<R>(value: R): Promise<IteratorResult<Yield,R|Return>>;
587591
throw(error?: any): Promise<IteratorResult<Yield,Return>>;
588592
}
589593

590-
declare function $asyncIterator<T>(p: AsyncIterable<T>): T;
594+
declare function $asyncIterate<T>(p: AsyncIterable<T>): T;
591595

592596
/* Maps and Sets */
593597

0 commit comments

Comments
 (0)