UNPKG

9.03 kBTypeScriptView Raw
1
2
3//------------------------- Async -------------------------
4/**
5 * Creates a suspendable function. Suspendable functions may use the await() function
6 * internally to suspend execution at arbitrary points, pending the results of
7 * internal asynchronous operations.
8 * @param {Function} fn - Contains the body of the suspendable function. Calls to await()
9 * may appear inside this function.
10 * @returns {Function} A function of the form `(...args) --> Promise`. Any arguments
11 * passed to this function are passed through to fn. The returned
12 * promise is resolved when fn returns, or rejected if fn throws.
13 */
14export var async: Async;
15
16
17export interface Async extends AsyncReturnsPromise {
18 cps: AsyncAcceptsCallbackReturnsNothing;
19 thunk: AsyncReturnsThunk;
20 result: AsyncReturnsResult;
21 iterable: AsyncIterableReturnsPromise;
22}
23
24export interface AsyncFunction {
25 (fn: Function): Function;
26 mod(options: AsyncOptions): AsyncFunction;
27}
28
29export interface AsyncOptions {
30 /** Recognised values: 'none', 'promise', 'thunk', 'result' */
31 returnValue?: string;
32 acceptsCallback?: boolean;
33 isIterable?: boolean;
34 maxConcurrency?: number;
35}
36
37interface AsyncReturnsPromise extends AsyncFunction {
38 <TResult>(fn: () => TResult): () => Promise<TResult>;
39 <T, TResult>(fn: (arg: T) => TResult): (arg: T) => Promise<TResult>;
40 <T1, T2, TResult>(fn: (arg1: T1, arg2: T2) => TResult): (arg1: T1, arg2: T2) => Promise<TResult>;
41 <T1, T2, T3, TResult>(fn: (arg1: T1, arg2: T2, arg3: T3) => TResult): (arg1: T1, arg2: T2, arg3: T3) => Promise<TResult>;
42 <T1, T2, T3, T4, TResult>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => TResult): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Promise<TResult>;
43}
44
45interface AsyncReturnsThunk extends AsyncFunction {
46 <TResult>(fn: () => TResult): () => Thunk<TResult>;
47 <T, TResult>(fn: (arg: T) => TResult): (arg: T) => Thunk<TResult>;
48 <T1, T2, TResult>(fn: (arg1: T1, arg2: T2) => TResult): (arg1: T1, arg2: T2) => Thunk<TResult>;
49 <T1, T2, T3, TResult>(fn: (arg1: T1, arg2: T2, arg3: T3) => TResult): (arg1: T1, arg2: T2, arg3: T3) => Thunk<TResult>;
50 <T1, T2, T3, T4, TResult>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => TResult): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Thunk<TResult>;
51}
52
53interface AsyncReturnsResult extends AsyncFunction {
54 <TResult>(fn: () => TResult): () => TResult;
55 <T, TResult>(fn: (arg: T) => TResult): (arg: T) => TResult;
56 <T1, T2, TResult>(fn: (arg1: T1, arg2: T2) => TResult): (arg1: T1, arg2: T2) => TResult;
57 <T1, T2, T3, TResult>(fn: (arg1: T1, arg2: T2, arg3: T3) => TResult): (arg1: T1, arg2: T2, arg3: T3) => TResult;
58 <T1, T2, T3, T4, TResult>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => TResult): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => TResult;
59}
60
61interface AsyncAcceptsCallbackReturnsPromise extends AsyncFunction {
62 <TResult>(fn: () => TResult): (callback?: Callback<TResult>) => Promise<TResult>;
63 <T, TResult>(fn: (arg: T) => TResult): (arg: T, callback?: Callback<TResult>) => Promise<TResult>;
64 <T1, T2, TResult>(fn: (arg1: T1, arg2: T2) => TResult): (arg1: T1, arg2: T2, callback?: Callback<TResult>) => Promise<TResult>;
65 <T1, T2, T3, TResult>(fn: (arg1: T1, arg2: T2, arg3: T3) => TResult): (arg1: T1, arg2: T2, arg3: T3, callback?: Callback<TResult>) => Promise<TResult>;
66 <T1, T2, T3, T4, TResult>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => TResult): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback?: Callback<TResult>) => Promise<TResult>;
67}
68
69interface AsyncAcceptsCallbackReturnsThunk extends AsyncFunction {
70 <TResult>(fn: () => TResult): (callback?: Callback<TResult>) => Thunk<TResult>;
71 <T, TResult>(fn: (arg: T) => TResult): (arg: T, callback?: Callback<TResult>) => Thunk<TResult>;
72 <T1, T2, TResult>(fn: (arg1: T1, arg2: T2) => TResult): (arg1: T1, arg2: T2, callback?: Callback<TResult>) => Thunk<TResult>;
73 <T1, T2, T3, TResult>(fn: (arg1: T1, arg2: T2, arg3: T3) => TResult): (arg1: T1, arg2: T2, arg3: T3, callback?: Callback<TResult>) => Thunk<TResult>;
74 <T1, T2, T3, T4, TResult>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => TResult): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback?: Callback<TResult>) => Thunk<TResult>;
75}
76
77interface AsyncAcceptsCallbackReturnsResult extends AsyncFunction {
78 <TResult>(fn: () => TResult): (callback?: Callback<TResult>) => TResult;
79 <T, TResult>(fn: (arg: T) => TResult): (arg: T, callback?: Callback<TResult>) => TResult;
80 <T1, T2, TResult>(fn: (arg1: T1, arg2: T2) => TResult): (arg1: T1, arg2: T2, callback?: Callback<TResult>) => TResult;
81 <T1, T2, T3, TResult>(fn: (arg1: T1, arg2: T2, arg3: T3) => TResult): (arg1: T1, arg2: T2, arg3: T3, callback?: Callback<TResult>) => TResult;
82 <T1, T2, T3, T4, TResult>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => TResult): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback?: Callback<TResult>) => TResult;
83}
84
85interface AsyncAcceptsCallbackReturnsNothing extends AsyncFunction {
86 <TResult>(fn: () => TResult): (callback?: Callback<TResult>) => void;
87 <T, TResult>(fn: (arg: T) => TResult): (arg: T, callback?: Callback<TResult>) => void;
88 <T1, T2, TResult>(fn: (arg1: T1, arg2: T2) => TResult): (arg1: T1, arg2: T2, callback?: Callback<TResult>) => void;
89 <T1, T2, T3, TResult>(fn: (arg1: T1, arg2: T2, arg3: T3) => TResult): (arg1: T1, arg2: T2, arg3: T3, callback?: Callback<TResult>) => void;
90 <T1, T2, T3, T4, TResult>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => TResult): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback?: Callback<TResult>) => void;
91}
92
93interface AsyncIterableReturnsPromise extends AsyncFunction {
94 (fn: Function): (...args: any[]) => {
95 next(): Promise<{ done: boolean; value?: any; }>;
96 forEach(callback: (value: any) => void): Promise<void>;
97 };
98}
99
100interface AsyncIterableReturnsThunk extends AsyncFunction {
101 (fn: Function): () => {
102 next(): Thunk<{ done: boolean; value?: any; }>;
103 forEach(callback: (value: any) => void): Thunk<void>;
104 };
105}
106
107interface AsyncIterableReturnsResult extends AsyncFunction {
108 (fn: Function): () => {
109 next(): { done: boolean; value?: any; };
110 forEach(callback: (value: any) => void): void;
111 };
112}
113
114interface AsyncIterableAcceptsCallbackReturnsPromise extends AsyncFunction {
115 (fn: Function): () => {
116 next(callback?: Callback<any>): Promise<{ done: boolean; value?: any; }>;
117 forEach(callback: (value: any) => void, doneCallback?: Callback<void>): Promise<void>;
118 };
119}
120
121interface AsyncIterableAcceptsCallbackReturnsThunk extends AsyncFunction {
122 (fn: Function): () => {
123 next(callback?: Callback<any>): Thunk<{ done: boolean; value?: any; }>;
124 forEach(callback: (value: any) => void, doneCallback?: Callback<void>): Thunk<void>;
125 };
126}
127
128interface AsyncIterableAcceptsCallbackReturnsResult extends AsyncFunction {
129 (fn: Function): () => {
130 next(callback?: Callback<any>): { done: boolean; value?: any; };
131 forEach(callback: (value: any) => void, doneCallback?: Callback<void>): void;
132 };
133}
134
135interface AsyncIterableAcceptsCallbackReturnsNothing extends AsyncFunction {
136 (fn: Function): () => {
137 next(callback?: Callback<any>): void;
138 forEach(callback: (value: any) => void, doneCallback?: Callback<void>): void;
139 };
140}
141
142
143//------------------------- Await -------------------------
144/**
145 * Suspends a suspendable function until the given awaitable expression produces
146 * a result. If the given expression produces an error, then an exception is raised
147 * in the suspendable function.
148 * @param {any} expr - The awaitable expression whose results are to be awaited.
149 * @returns {any} The final result of the given awaitable expression.
150 */
151export var await: Await;
152
153export interface Await extends AwaitFunction {
154 in: AwaitFunction;
155 top(n: number): AwaitFunction;
156}
157
158interface AwaitFunction {
159 <T>(expr: Thenable<T>): T;
160 <T>(expr: Thenable<T>[]): T[];
161 <T>(expr: Thunk<T>): T;
162 <T>(expr: Thunk<T>[]): T[];
163 (expr: Object): Object;
164}
165
166
167//------------------------- Common -------------------------
168interface Callback<TResult> {
169 (err: any, result: TResult): void;
170}
171
172export interface Thunk<TResult> {
173 (callback?: (err: any, result?: TResult) => void): void;
174}
175
176interface Thenable<R> {
177 then<U>(onFulfilled?: (value: R) => U | Thenable<U>, onRejected?: (error: any) => U | Thenable<U>): Thenable<U>;
178 then<U>(onFulfilled?: (value: R) => U | Thenable<U>, onRejected?: (error: any) => void): Thenable<U>;
179}
180
181interface Promise<R> extends Thenable<R> {
182 then<U>(onFulfilled?: (value: R) => U | Thenable<U>, onRejected?: (error: any) => U | Thenable<U>): Promise<U>;
183 then<U>(onFulfilled?: (value: R) => U | Thenable<U>, onRejected?: (error: any) => void): Promise<U>;
184 catch<U>(onRejected?: (error: any) => U | Thenable<U>): Promise<U>;
185}
186
\No newline at end of file