-
Notifications
You must be signed in to change notification settings - Fork 1.9k
[RFC] Improve core types for (Async) Iterable/Iterator/Generator #3990
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -61,8 +61,9 @@ declare class Object { | |
|
||
// Well known Symbols. | ||
declare class $SymbolHasInstance mixins Symbol {} | ||
declare class $SymboIsConcatSpreadable mixins Symbol {} | ||
declare class $SymbolIsConcatSpreadable mixins Symbol {} | ||
declare class $SymbolIterator mixins Symbol {} | ||
declare class $SymbolAsyncIterator mixins Symbol {} | ||
declare class $SymbolMatch mixins Symbol {} | ||
declare class $SymbolReplace mixins Symbol {} | ||
declare class $SymbolSearch mixins Symbol {} | ||
|
@@ -76,8 +77,9 @@ declare class Symbol { | |
static (value?:any): Symbol; | ||
static for(key: string): Symbol; | ||
static hasInstance: $SymbolHasInstance; | ||
static isConcatSpreadable: $SymboIsConcatSpreadable; | ||
static isConcatSpreadable: $SymbolIsConcatSpreadable; | ||
static iterator: string; // polyfill '@@iterator' | ||
static asyncIterator: $SymbolAsyncIterator; | ||
static keyFor(sym: Symbol): ?string; | ||
static length: 0; | ||
static match: $SymbolMatch; | ||
|
@@ -547,20 +549,22 @@ type IteratorResult<Yield,Return> = | |
| { done: true, value?: Return } | ||
| { done: false, value: Yield }; | ||
|
||
interface $Iterator<+Yield,+Return,-Next> { | ||
@@iterator(): $Iterator<Yield,Return,Next>; | ||
next(value?: Next): IteratorResult<Yield,Return>; | ||
} | ||
type Iterator<+T> = $Iterator<T,void,void>; | ||
|
||
interface $Iterable<+Yield,+Return,-Next> { | ||
@@iterator(): $Iterator<Yield,Return,Next>; | ||
} | ||
type Iterable<+T> = $Iterable<T,void,void>; | ||
|
||
interface Generator<+Yield,+Return,-Next> { | ||
interface $Iterator<+Yield,+Return,-Next> extends $Iterable<Yield,Return,Next> { | ||
@@iterator(): $Iterator<Yield,Return,Next>; | ||
next(value?: Next): IteratorResult<Yield,Return>; | ||
+return?: <R>(value: R) => IteratorResult<Yield,R|Return>; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. A I'd think it should just be If you're hand-writing a |
||
+throw?: (error?: any) => IteratorResult<Yield,Return>; | ||
} | ||
type Iterator<+T> = $Iterator<T,void,void>; | ||
|
||
interface Generator<+Yield,+Return,-Next> extends $Iterator<Yield,Return,Next> { | ||
@@iterator(): Generator<Yield,Return,Next>; | ||
next(value?: Next): IteratorResult<Yield,Return>; | ||
return<R>(value: R): IteratorResult<Yield,R|Return>; | ||
throw(error?: any): IteratorResult<Yield,Return>; | ||
} | ||
|
@@ -569,25 +573,27 @@ declare function $iterate<T>(p: Iterable<T>): T; | |
|
||
/* Async Iterable/Iterator/Generator */ | ||
|
||
interface $AsyncIterator<+Yield,+Return,-Next> { | ||
@@asyncIterator(): $AsyncIterator<Yield,Return,Next>; | ||
next(value?: Next): Promise<IteratorResult<Yield,Return>>; | ||
} | ||
type AsyncIterator<+T> = $AsyncIterator<T,void,void>; | ||
|
||
interface $AsyncIterable<+Yield,+Return,-Next> { | ||
@@asyncIterator(): $AsyncIterator<Yield,Return,Next>; | ||
} | ||
type AsyncIterable<+T> = $AsyncIterable<T,void,void>; | ||
|
||
interface AsyncGenerator<+Yield,+Return,-Next> { | ||
interface $AsyncIterator<+Yield,+Return,-Next> extends $AsyncIterable<Yield,Return,Next> { | ||
@@asyncIterator(): $AsyncIterator<Yield,Return,Next>; | ||
next(value?: Next): Promise<IteratorResult<Yield,Return>>; | ||
+return?: <R>(value: R) => Promise<IteratorResult<Yield,R|Return>>; | ||
+throw?: (error?: any) => Promise<IteratorResult<Yield,Return>>; | ||
} | ||
type AsyncIterator<+T> = $AsyncIterator<T,void,void>; | ||
|
||
interface AsyncGenerator<+Yield,+Return,-Next> extends $AsyncIterator<Yield,Return,Next> { | ||
@@asyncIterator(): AsyncGenerator<Yield,Return,Next>; | ||
next(value?: Next): Promise<IteratorResult<Yield,Return>>; | ||
return<R>(value: R): Promise<IteratorResult<Yield,R|Return>>; | ||
throw(error?: any): Promise<IteratorResult<Yield,Return>>; | ||
} | ||
|
||
declare function $asyncIterator<T>(p: AsyncIterable<T>): T; | ||
declare function $asyncIterate<T>(p: AsyncIterable<T>): T; | ||
|
||
/* Maps and Sets */ | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wish Flow didn't require an
@@iterator
method on Iterators, even though they typically have one that returnsthis
by convention. (But I'm not sure how to use this without hacks in any case: #1163.)There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
#6075 has some relevant discussion