1 /*
2  * Hunt - A refined core library for D programming language.
3  *
4  * Copyright (C) 2018-2019 HuntLabs
5  *
6  * Website: https://www.huntlabs.net/
7  *
8  * Licensed under the Apache-2.0 License.
9  *
10  */
11 
12 module hunt.concurrency.CompletionStage;
13 
14 // import hunt.Object;
15 // import hunt.Functions;
16 // import hunt.util.Common;
17 // import hunt.util.Runnable;
18 
19 
20 // /**
21 //  * A stage of a possibly asynchronous computation, that performs an
22 //  * action or computes a value when another CompletionStage completes.
23 //  * A stage completes upon termination of its computation, but this may
24 //  * in turn trigger other dependent stages.  The functionality defined
25 //  * in this interface takes only a few basic forms, which expand out to
26 //  * a larger set of methods to capture a range of usage styles:
27 //  *
28 //  * <ul>
29 //  *
30 //  * <li>The computation performed by a stage may be expressed as a
31 //  * Function, Consumer, or Runnable (using methods with names including
32 //  * <em>apply</em>, <em>accept</em>, or <em>run</em>, respectively)
33 //  * depending on whether it requires arguments and/or produces results.
34 //  * For example:
35 //  * <pre> {@code
36 //  * stage.thenApply(x -> square(x))
37 //  *      .thenAccept(x -> System.out.print(x))
38 //  *      .thenRun(() -> System.out.println());}</pre>
39 //  *
40 //  * An additional form (<em>compose</em>) allows the construction of
41 //  * computation pipelines from functions returning completion stages.
42 //  *
43 //  * <p>Any argument to a stage's computation is the outcome of a
44 //  * triggering stage's computation.
45 //  *
46 //  * <li>One stage's execution may be triggered by completion of a
47 //  * single stage, or both of two stages, or either of two stages.
48 //  * Dependencies on a single stage are arranged using methods with
49 //  * prefix <em>then</em>. Those triggered by completion of
50 //  * <em>both</em> of two stages may <em>combine</em> their results or
51 //  * effects, using correspondingly named methods. Those triggered by
52 //  * <em>either</em> of two stages make no guarantees about which of the
53 //  * results or effects are used for the dependent stage's computation.
54 //  *
55 //  * <li>Dependencies among stages control the triggering of
56 //  * computations, but do not otherwise guarantee any particular
57 //  * ordering. Additionally, execution of a new stage's computations may
58 //  * be arranged in any of three ways: default execution, default
59 //  * asynchronous execution (using methods with suffix <em>async</em>
60 //  * that employ the stage's default asynchronous execution facility),
61 //  * or custom (via a supplied {@link Executor}).  The execution
62 //  * properties of default and async modes are specified by
63 //  * CompletionStage implementations, not this interface. Methods with
64 //  * explicit Executor arguments may have arbitrary execution
65 //  * properties, and might not even support concurrent execution, but
66 //  * are arranged for processing in a way that accommodates asynchrony.
67 //  *
68 //  * <li>Two method forms ({@link #handle handle} and {@link
69 //  * #whenComplete whenComplete}) support unconditional computation
70 //  * whether the triggering stage completed normally or exceptionally.
71 //  * Method {@link #exceptionally exceptionally} supports computation
72 //  * only when the triggering stage completes exceptionally, computing a
73 //  * replacement result, similarly to the java {@code catch} keyword.
74 //  * In all other cases, if a stage's computation terminates abruptly
75 //  * with an (unchecked) exception or error, then all dependent stages
76 //  * requiring its completion complete exceptionally as well, with a
77 //  * {@link CompletionException} holding the exception as its cause.  If
78 //  * a stage is dependent on <em>both</em> of two stages, and both
79 //  * complete exceptionally, then the CompletionException may correspond
80 //  * to either one of these exceptions.  If a stage is dependent on
81 //  * <em>either</em> of two others, and only one of them completes
82 //  * exceptionally, no guarantees are made about whether the dependent
83 //  * stage completes normally or exceptionally. In the case of method
84 //  * {@code whenComplete}, when the supplied action itself encounters an
85 //  * exception, then the stage completes exceptionally with this
86 //  * exception unless the source stage also completed exceptionally, in
87 //  * which case the exceptional completion from the source stage is
88 //  * given preference and propagated to the dependent stage.
89 //  *
90 //  * </ul>
91 //  *
92 //  * <p>All methods adhere to the above triggering, execution, and
93 //  * exceptional completion specifications (which are not repeated in
94 //  * individual method specifications). Additionally, while arguments
95 //  * used to pass a completion result (that is, for parameters of type
96 //  * {@code T}) for methods accepting them may be null, passing a null
97 //  * value for any other parameter will result in a {@link
98 //  * NullPointerException} being thrown.
99 //  *
100 //  * <p>Method form {@link #handle handle} is the most general way of
101 //  * creating a continuation stage, unconditionally performing a
102 //  * computation that is given both the result and exception (if any) of
103 //  * the triggering CompletionStage, and computing an arbitrary result.
104 //  * Method {@link #whenComplete whenComplete} is similar, but preserves
105 //  * the result of the triggering stage instead of computing a new one.
106 //  * Because a stage's normal result may be {@code null}, both methods
107 //  * should have a computation structured thus:
108 //  *
109 //  * <pre>{@code (result, exception) -> {
110 //  *   if (exception is null) {
111 //  *     // triggering stage completed normally
112 //  *   } else {
113 //  *     // triggering stage completed exceptionally
114 //  *   }
115 //  * }}</pre>
116 //  *
117 //  * <p>This interface does not define methods for initially creating,
118 //  * forcibly completing normally or exceptionally, probing completion
119 //  * status or results, or awaiting completion of a stage.
120 //  * Implementations of CompletionStage may provide means of achieving
121 //  * such effects, as appropriate.  Method {@link #toCompletableFuture}
122 //  * enables interoperability among different implementations of this
123 //  * interface by providing a common conversion type.
124 //  *
125 //  * @author Doug Lea
126 //  */
127 // interface CompletionStage(T) {
128 
129 //     /**
130 //      * Returns a new CompletionStage that, when this stage completes
131 //      * normally, is executed with this stage's result as the argument
132 //      * to the supplied function.
133 //      *
134 //      * <p>This method is analogous to
135 //      * {@link java.util.Optional#map Optional.map} and
136 //      * {@link java.util.stream.Stream#map Stream.map}.
137 //      *
138 //      * <p>See the {@link CompletionStage} documentation for rules
139 //      * covering exceptional completion.
140 //      *
141 //      * @param fn the function to use to compute the value of the
142 //      * returned CompletionStage
143 //      * @param (U) the function's return type
144 //      * @return the new CompletionStage
145 //      */
146 //     CompletionStage!(U) thenApply(U)(Function!(T, U) fn);
147 
148 //     /**
149 //      * Returns a new CompletionStage that, when this stage completes
150 //      * normally, is executed using this stage's default asynchronous
151 //      * execution facility, with this stage's result as the argument to
152 //      * the supplied function.
153 //      *
154 //      * See the {@link CompletionStage} documentation for rules
155 //      * covering exceptional completion.
156 //      *
157 //      * @param fn the function to use to compute the value of the
158 //      * returned CompletionStage
159 //      * @param (U) the function's return type
160 //      * @return the new CompletionStage
161 //      */
162 //     CompletionStage!(U) thenApplyAsync(U)(Function!(T, U) fn);
163 
164 //     /**
165 //      * Returns a new CompletionStage that, when this stage completes
166 //      * normally, is executed using the supplied Executor, with this
167 //      * stage's result as the argument to the supplied function.
168 //      *
169 //      * See the {@link CompletionStage} documentation for rules
170 //      * covering exceptional completion.
171 //      *
172 //      * @param fn the function to use to compute the value of the
173 //      * returned CompletionStage
174 //      * @param executor the executor to use for asynchronous execution
175 //      * @param (U) the function's return type
176 //      * @return the new CompletionStage
177 //      */
178 // //     CompletionStage!(U) thenApplyAsync(U)(Function!(T, U) fn,
179 // //          Executor executor);
180 
181 // static if(is(T == void)) {
182 
183 //     CompletionStage!(void) thenAccept(Action action);
184 //     CompletionStage!(void) thenAcceptAsync(Action action);
185 //     CompletionStage!(void) thenAcceptAsync(Action action,
186 //                                                  Executor executor);
187 // } else {
188 //     /**
189 //      * Returns a new CompletionStage that, when this stage completes
190 //      * normally, is executed with this stage's result as the argument
191 //      * to the supplied action.
192 //      *
193 //      * See the {@link CompletionStage} documentation for rules
194 //      * covering exceptional completion.
195 //      *
196 //      * @param action the action to perform before completing the
197 //      * returned CompletionStage
198 //      * @return the new CompletionStage
199 //      */
200 //     CompletionStage!(void) thenAccept(Consumer!(T) action);
201 
202 //     /**
203 //      * Returns a new CompletionStage that, when this stage completes
204 //      * normally, is executed using this stage's default asynchronous
205 //      * execution facility, with this stage's result as the argument to
206 //      * the supplied action.
207 //      *
208 //      * See the {@link CompletionStage} documentation for rules
209 //      * covering exceptional completion.
210 //      *
211 //      * @param action the action to perform before completing the
212 //      * returned CompletionStage
213 //      * @return the new CompletionStage
214 //      */
215 //     CompletionStage!(void) thenAcceptAsync(Consumer!(T) action);
216 
217 //     /**
218 //      * Returns a new CompletionStage that, when this stage completes
219 //      * normally, is executed using the supplied Executor, with this
220 //      * stage's result as the argument to the supplied action.
221 //      *
222 //      * See the {@link CompletionStage} documentation for rules
223 //      * covering exceptional completion.
224 //      *
225 //      * @param action the action to perform before completing the
226 //      * returned CompletionStage
227 //      * @param executor the executor to use for asynchronous execution
228 //      * @return the new CompletionStage
229 //      */
230 //     CompletionStage!(void) thenAcceptAsync(Consumer!(T) action,
231 //                                                  Executor executor);
232 
233      
234 // }                                                 
235 //     /**
236 //      * Returns a new CompletionStage that, when this stage completes
237 //      * normally, executes the given action.
238 //      *
239 //      * See the {@link CompletionStage} documentation for rules
240 //      * covering exceptional completion.
241 //      *
242 //      * @param action the action to perform before completing the
243 //      * returned CompletionStage
244 //      * @return the new CompletionStage
245 //      */
246 //     CompletionStage!(void) thenRun(Runnable action);
247 
248 //     /**
249 //      * Returns a new CompletionStage that, when this stage completes
250 //      * normally, executes the given action using this stage's default
251 //      * asynchronous execution facility.
252 //      *
253 //      * See the {@link CompletionStage} documentation for rules
254 //      * covering exceptional completion.
255 //      *
256 //      * @param action the action to perform before completing the
257 //      * returned CompletionStage
258 //      * @return the new CompletionStage
259 //      */
260 //     CompletionStage!(void) thenRunAsync(Runnable action);
261 
262 //     /**
263 //      * Returns a new CompletionStage that, when this stage completes
264 //      * normally, executes the given action using the supplied Executor.
265 //      *
266 //      * See the {@link CompletionStage} documentation for rules
267 //      * covering exceptional completion.
268 //      *
269 //      * @param action the action to perform before completing the
270 //      * returned CompletionStage
271 //      * @param executor the executor to use for asynchronous execution
272 //      * @return the new CompletionStage
273 //      */
274 //     CompletionStage!(void) thenRunAsync(Runnable action,
275 //                                               Executor executor);
276 
277 //     /**
278 //      * Returns a new CompletionStage that, when this and the other
279 //      * given stage both complete normally, is executed with the two
280 //      * results as arguments to the supplied function.
281 //      *
282 //      * See the {@link CompletionStage} documentation for rules
283 //      * covering exceptional completion.
284 //      *
285 //      * @param other the other CompletionStage
286 //      * @param fn the function to use to compute the value of the
287 //      * returned CompletionStage
288 //      * @param (U) the type of the other CompletionStage's result
289 //      * @param (V) the function's return type
290 //      * @return the new CompletionStage
291 //      */
292 // //     CompletionStage!(V) thenCombine(U,V)(CompletionStage!(U) other,
293 // //          BiFunction!(T, U, V) fn);
294 
295 //     /**
296 //      * Returns a new CompletionStage that, when this and the other
297 //      * given stage both complete normally, is executed using this
298 //      * stage's default asynchronous execution facility, with the two
299 //      * results as arguments to the supplied function.
300 //      *
301 //      * See the {@link CompletionStage} documentation for rules
302 //      * covering exceptional completion.
303 //      *
304 //      * @param other the other CompletionStage
305 //      * @param fn the function to use to compute the value of the
306 //      * returned CompletionStage
307 //      * @param (U) the type of the other CompletionStage's result
308 //      * @param (V) the function's return type
309 //      * @return the new CompletionStage
310 //      */
311 // //     CompletionStage!(V) thenCombineAsync(U,V)(CompletionStage!(U) other,
312 // //          BiFunction!(T, U, V) fn);
313 
314 //     /**
315 //      * Returns a new CompletionStage that, when this and the other
316 //      * given stage both complete normally, is executed using the
317 //      * supplied executor, with the two results as arguments to the
318 //      * supplied function.
319 //      *
320 //      * See the {@link CompletionStage} documentation for rules
321 //      * covering exceptional completion.
322 //      *
323 //      * @param other the other CompletionStage
324 //      * @param fn the function to use to compute the value of the
325 //      * returned CompletionStage
326 //      * @param executor the executor to use for asynchronous execution
327 //      * @param (U) the type of the other CompletionStage's result
328 //      * @param (V) the function's return type
329 //      * @return the new CompletionStage
330 //      */
331 // //     CompletionStage!(V) thenCombineAsync(U,V)(CompletionStage!(U) other,
332 // //          BiFunction!(T, U, V) fn, Executor executor);
333 
334 //     /**
335 //      * Returns a new CompletionStage that, when this and the other
336 //      * given stage both complete normally, is executed with the two
337 //      * results as arguments to the supplied action.
338 //      *
339 //      * See the {@link CompletionStage} documentation for rules
340 //      * covering exceptional completion.
341 //      *
342 //      * @param other the other CompletionStage
343 //      * @param action the action to perform before completing the
344 //      * returned CompletionStage
345 //      * @param (U) the type of the other CompletionStage's result
346 //      * @return the new CompletionStage
347 //      */
348 // //     CompletionStage!(void) thenAcceptBoth(U)(CompletionStage!(U) other,
349 // //          BiConsumer!(T, U) action);
350 
351 //     /**
352 //      * Returns a new CompletionStage that, when this and the other
353 //      * given stage both complete normally, is executed using this
354 //      * stage's default asynchronous execution facility, with the two
355 //      * results as arguments to the supplied action.
356 //      *
357 //      * See the {@link CompletionStage} documentation for rules
358 //      * covering exceptional completion.
359 //      *
360 //      * @param other the other CompletionStage
361 //      * @param action the action to perform before completing the
362 //      * returned CompletionStage
363 //      * @param (U) the type of the other CompletionStage's result
364 //      * @return the new CompletionStage
365 //      */
366 // //     CompletionStage!(void) thenAcceptBothAsync(U)(CompletionStage!(U) other,
367 // //          BiConsumer!(T, U) action);
368 
369 //     /**
370 //      * Returns a new CompletionStage that, when this and the other
371 //      * given stage both complete normally, is executed using the
372 //      * supplied executor, with the two results as arguments to the
373 //      * supplied action.
374 //      *
375 //      * See the {@link CompletionStage} documentation for rules
376 //      * covering exceptional completion.
377 //      *
378 //      * @param other the other CompletionStage
379 //      * @param action the action to perform before completing the
380 //      * returned CompletionStage
381 //      * @param executor the executor to use for asynchronous execution
382 //      * @param (U) the type of the other CompletionStage's result
383 //      * @return the new CompletionStage
384 //      */
385 // //     CompletionStage!(void) thenAcceptBothAsync(U)(CompletionStage!(U) other,
386 // //          BiConsumer!(T, U) action, Executor executor);
387 
388 //     /**
389 //      * Returns a new CompletionStage that, when this and the other
390 //      * given stage both complete normally, executes the given action.
391 //      *
392 //      * See the {@link CompletionStage} documentation for rules
393 //      * covering exceptional completion.
394 //      *
395 //      * @param other the other CompletionStage
396 //      * @param action the action to perform before completing the
397 //      * returned CompletionStage
398 //      * @return the new CompletionStage
399 //      */
400 // //     CompletionStage!(void) runAfterBoth(U)(CompletionStage!(U) other,
401 // //                                               Runnable action);
402 //     /**
403 //      * Returns a new CompletionStage that, when this and the other
404 //      * given stage both complete normally, executes the given action
405 //      * using this stage's default asynchronous execution facility.
406 //      *
407 //      * See the {@link CompletionStage} documentation for rules
408 //      * covering exceptional completion.
409 //      *
410 //      * @param other the other CompletionStage
411 //      * @param action the action to perform before completing the
412 //      * returned CompletionStage
413 //      * @return the new CompletionStage
414 //      */
415 // //     CompletionStage!(void) runAfterBothAsync(U)(CompletionStage!(U) other,
416 // //                                                    Runnable action);
417 
418 //     /**
419 //      * Returns a new CompletionStage that, when this and the other
420 //      * given stage both complete normally, executes the given action
421 //      * using the supplied executor.
422 //      *
423 //      * See the {@link CompletionStage} documentation for rules
424 //      * covering exceptional completion.
425 //      *
426 //      * @param other the other CompletionStage
427 //      * @param action the action to perform before completing the
428 //      * returned CompletionStage
429 //      * @param executor the executor to use for asynchronous execution
430 //      * @return the new CompletionStage
431 //      */
432 // //     CompletionStage!(void) runAfterBothAsync(U)(CompletionStage!(U) other,
433 // //                                                    Runnable action,
434 // //                                                    Executor executor);
435 //     /**
436 //      * Returns a new CompletionStage that, when either this or the
437 //      * other given stage complete normally, is executed with the
438 //      * corresponding result as argument to the supplied function.
439 //      *
440 //      * See the {@link CompletionStage} documentation for rules
441 //      * covering exceptional completion.
442 //      *
443 //      * @param other the other CompletionStage
444 //      * @param fn the function to use to compute the value of the
445 //      * returned CompletionStage
446 //      * @param (U) the function's return type
447 //      * @return the new CompletionStage
448 //      */
449 // //     CompletionStage!(U) applyToEither(U)(CompletionStage!(T) other,
450 // //          Function!(T, U) fn);
451 
452 //     /**
453 //      * Returns a new CompletionStage that, when either this or the
454 //      * other given stage complete normally, is executed using this
455 //      * stage's default asynchronous execution facility, with the
456 //      * corresponding result as argument to the supplied function.
457 //      *
458 //      * See the {@link CompletionStage} documentation for rules
459 //      * covering exceptional completion.
460 //      *
461 //      * @param other the other CompletionStage
462 //      * @param fn the function to use to compute the value of the
463 //      * returned CompletionStage
464 //      * @param (U) the function's return type
465 //      * @return the new CompletionStage
466 //      */
467 // //     CompletionStage!(U) applyToEitherAsync(U)(CompletionStage!(T) other,
468 // //          Function!(T, U) fn);
469 
470 //     /**
471 //      * Returns a new CompletionStage that, when either this or the
472 //      * other given stage complete normally, is executed using the
473 //      * supplied executor, with the corresponding result as argument to
474 //      * the supplied function.
475 //      *
476 //      * See the {@link CompletionStage} documentation for rules
477 //      * covering exceptional completion.
478 //      *
479 //      * @param other the other CompletionStage
480 //      * @param fn the function to use to compute the value of the
481 //      * returned CompletionStage
482 //      * @param executor the executor to use for asynchronous execution
483 //      * @param (U) the function's return type
484 //      * @return the new CompletionStage
485 //      */
486 // //     CompletionStage!(U) applyToEitherAsync(U)(CompletionStage!(T) other,
487 // //          Function!(T, U) fn, Executor executor);
488 
489 // static if(is(T == void)) {
490 //     CompletionStage!(void) acceptEither(CompletionStage!(T) other,
491 //          Action action);
492 //     CompletionStage!(void) acceptEitherAsync(CompletionStage!(T) other,
493 //          Action action);
494 //     CompletionStage!(void) acceptEitherAsync(CompletionStage!(T) other,
495 //          Action action, Executor executor);
496 // } else {
497 //     /**
498 //      * Returns a new CompletionStage that, when either this or the
499 //      * other given stage complete normally, is executed with the
500 //      * corresponding result as argument to the supplied action.
501 //      *
502 //      * See the {@link CompletionStage} documentation for rules
503 //      * covering exceptional completion.
504 //      *
505 //      * @param other the other CompletionStage
506 //      * @param action the action to perform before completing the
507 //      * returned CompletionStage
508 //      * @return the new CompletionStage
509 //      */
510 //     CompletionStage!(void) acceptEither(CompletionStage!(T) other,
511 //          Consumer!(T) action);
512 
513 //     /**
514 //      * Returns a new CompletionStage that, when either this or the
515 //      * other given stage complete normally, is executed using this
516 //      * stage's default asynchronous execution facility, with the
517 //      * corresponding result as argument to the supplied action.
518 //      *
519 //      * See the {@link CompletionStage} documentation for rules
520 //      * covering exceptional completion.
521 //      *
522 //      * @param other the other CompletionStage
523 //      * @param action the action to perform before completing the
524 //      * returned CompletionStage
525 //      * @return the new CompletionStage
526 //      */
527 //     CompletionStage!(void) acceptEitherAsync(CompletionStage!(T) other,
528 //          Consumer!(T) action);
529 
530 //     /**
531 //      * Returns a new CompletionStage that, when either this or the
532 //      * other given stage complete normally, is executed using the
533 //      * supplied executor, with the corresponding result as argument to
534 //      * the supplied action.
535 //      *
536 //      * See the {@link CompletionStage} documentation for rules
537 //      * covering exceptional completion.
538 //      *
539 //      * @param other the other CompletionStage
540 //      * @param action the action to perform before completing the
541 //      * returned CompletionStage
542 //      * @param executor the executor to use for asynchronous execution
543 //      * @return the new CompletionStage
544 //      */
545 //     CompletionStage!(void) acceptEitherAsync(CompletionStage!(T) other,
546 //          Consumer!(T) action, Executor executor);
547      
548 // }
549 //     /**
550 //      * Returns a new CompletionStage that, when either this or the
551 //      * other given stage complete normally, executes the given action.
552 //      *
553 //      * See the {@link CompletionStage} documentation for rules
554 //      * covering exceptional completion.
555 //      *
556 //      * @param other the other CompletionStage
557 //      * @param action the action to perform before completing the
558 //      * returned CompletionStage
559 //      * @return the new CompletionStage
560 //      */
561 // //     CompletionStage!(void) runAfterEither(U)(CompletionStage!(U) other,
562 // //                                                 Runnable action);
563 
564 //     /**
565 //      * Returns a new CompletionStage that, when either this or the
566 //      * other given stage complete normally, executes the given action
567 //      * using this stage's default asynchronous execution facility.
568 //      *
569 //      * See the {@link CompletionStage} documentation for rules
570 //      * covering exceptional completion.
571 //      *
572 //      * @param other the other CompletionStage
573 //      * @param action the action to perform before completing the
574 //      * returned CompletionStage
575 //      * @return the new CompletionStage
576 //      */
577 // //     CompletionStage!(void) runAfterEitherAsync(U)(CompletionStage!(U) other,
578 // //          Runnable action);
579 
580 //     /**
581 //      * Returns a new CompletionStage that, when either this or the
582 //      * other given stage complete normally, executes the given action
583 //      * using the supplied executor.
584 //      *
585 //      * See the {@link CompletionStage} documentation for rules
586 //      * covering exceptional completion.
587 //      *
588 //      * @param other the other CompletionStage
589 //      * @param action the action to perform before completing the
590 //      * returned CompletionStage
591 //      * @param executor the executor to use for asynchronous execution
592 //      * @return the new CompletionStage
593 //      */
594 // //     CompletionStage!(void) runAfterEitherAsync(U)(CompletionStage!(U) other,
595 // //          Runnable action, Executor executor);
596 
597 //     /**
598 //      * Returns a new CompletionStage that is completed with the same
599 //      * value as the CompletionStage returned by the given function.
600 //      *
601 //      * <p>When this stage completes normally, the given function is
602 //      * invoked with this stage's result as the argument, returning
603 //      * another CompletionStage.  When that stage completes normally,
604 //      * the CompletionStage returned by this method is completed with
605 //      * the same value.
606 //      *
607 //      * <p>To ensure progress, the supplied function must arrange
608 //      * eventual completion of its result.
609 //      *
610 //      * <p>This method is analogous to
611 //      * {@link java.util.Optional#flatMap Optional.flatMap} and
612 //      * {@link java.util.stream.Stream#flatMap Stream.flatMap}.
613 //      *
614 //      * <p>See the {@link CompletionStage} documentation for rules
615 //      * covering exceptional completion.
616 //      *
617 //      * @param fn the function to use to compute another CompletionStage
618 //      * @param (U) the type of the returned CompletionStage's result
619 //      * @return the new CompletionStage
620 //      */
621 // //     CompletionStage!(U) thenCompose(U)(Function!(T, CompletionStage!(U)) fn);
622 
623 //     /**
624 //      * Returns a new CompletionStage that is completed with the same
625 //      * value as the CompletionStage returned by the given function,
626 //      * executed using this stage's default asynchronous execution
627 //      * facility.
628 //      *
629 //      * <p>When this stage completes normally, the given function is
630 //      * invoked with this stage's result as the argument, returning
631 //      * another CompletionStage.  When that stage completes normally,
632 //      * the CompletionStage returned by this method is completed with
633 //      * the same value.
634 //      *
635 //      * <p>To ensure progress, the supplied function must arrange
636 //      * eventual completion of its result.
637 //      *
638 //      * <p>See the {@link CompletionStage} documentation for rules
639 //      * covering exceptional completion.
640 //      *
641 //      * @param fn the function to use to compute another CompletionStage
642 //      * @param (U) the type of the returned CompletionStage's result
643 //      * @return the new CompletionStage
644 //      */
645 // //     CompletionStage!(U) thenComposeAsync(U)(Function!(T, CompletionStage!(U)) fn);
646 
647 //     /**
648 //      * Returns a new CompletionStage that is completed with the same
649 //      * value as the CompletionStage returned by the given function,
650 //      * executed using the supplied Executor.
651 //      *
652 //      * <p>When this stage completes normally, the given function is
653 //      * invoked with this stage's result as the argument, returning
654 //      * another CompletionStage.  When that stage completes normally,
655 //      * the CompletionStage returned by this method is completed with
656 //      * the same value.
657 //      *
658 //      * <p>To ensure progress, the supplied function must arrange
659 //      * eventual completion of its result.
660 //      *
661 //      * <p>See the {@link CompletionStage} documentation for rules
662 //      * covering exceptional completion.
663 //      *
664 //      * @param fn the function to use to compute another CompletionStage
665 //      * @param executor the executor to use for asynchronous execution
666 //      * @param (U) the type of the returned CompletionStage's result
667 //      * @return the new CompletionStage
668 //      */
669 // //     CompletionStage!(U) thenComposeAsync(U)
670 // //         (Function!(T, CompletionStage!(U)) fn, Executor executor);
671 
672 //     /**
673 //      * Returns a new CompletionStage that, when this stage completes
674 //      * either normally or exceptionally, is executed with this stage's
675 //      * result and exception as arguments to the supplied function.
676 //      *
677 //      * <p>When this stage is complete, the given function is invoked
678 //      * with the result (or {@code null} if none) and the exception (or
679 //      * {@code null} if none) of this stage as arguments, and the
680 //      * function's result is used to complete the returned stage.
681 //      *
682 //      * @param fn the function to use to compute the value of the
683 //      * returned CompletionStage
684 //      * @param (U) the function's return type
685 //      * @return the new CompletionStage
686 //      */
687 // //     CompletionStage!(U) handle(U)(BiFunction!(T, Throwable, U) fn);
688 
689 //     /**
690 //      * Returns a new CompletionStage that, when this stage completes
691 //      * either normally or exceptionally, is executed using this stage's
692 //      * default asynchronous execution facility, with this stage's
693 //      * result and exception as arguments to the supplied function.
694 //      *
695 //      * <p>When this stage is complete, the given function is invoked
696 //      * with the result (or {@code null} if none) and the exception (or
697 //      * {@code null} if none) of this stage as arguments, and the
698 //      * function's result is used to complete the returned stage.
699 //      *
700 //      * @param fn the function to use to compute the value of the
701 //      * returned CompletionStage
702 //      * @param (U) the function's return type
703 //      * @return the new CompletionStage
704 //      */
705 // //     CompletionStage!(U) handleAsync(U)(BiFunction!(T, Throwable, U) fn);
706 
707 //     /**
708 //      * Returns a new CompletionStage that, when this stage completes
709 //      * either normally or exceptionally, is executed using the
710 //      * supplied executor, with this stage's result and exception as
711 //      * arguments to the supplied function.
712 //      *
713 //      * <p>When this stage is complete, the given function is invoked
714 //      * with the result (or {@code null} if none) and the exception (or
715 //      * {@code null} if none) of this stage as arguments, and the
716 //      * function's result is used to complete the returned stage.
717 //      *
718 //      * @param fn the function to use to compute the value of the
719 //      * returned CompletionStage
720 //      * @param executor the executor to use for asynchronous execution
721 //      * @param (U) the function's return type
722 //      * @return the new CompletionStage
723 //      */
724 // //     CompletionStage!(U) handleAsync(U)(BiFunction!(T, Throwable, U) fn,
725 // //          Executor executor);
726 
727 // static if(is(T == void)) {
728 //     CompletionStage!(T) whenCompleteAsync(Action1!(Throwable) action);
729 //     CompletionStage!(T) whenComplete(Action1!(Throwable) action);
730 //     CompletionStage!(T) whenCompleteAsync(Action1!(Throwable) action, Executor executor);
731 // } else {
732 
733 //     /**
734 //      * Returns a new CompletionStage with the same result or exception as
735 //      * this stage, that executes the given action when this stage completes.
736 //      *
737 //      * <p>When this stage is complete, the given action is invoked
738 //      * with the result (or {@code null} if none) and the exception (or
739 //      * {@code null} if none) of this stage as arguments.  The returned
740 //      * stage is completed when the action returns.
741 //      *
742 //      * <p>Unlike method {@link #handle handle},
743 //      * this method is not designed to translate completion outcomes,
744 //      * so the supplied action should not throw an exception. However,
745 //      * if it does, the following rules apply: if this stage completed
746 //      * normally but the supplied action throws an exception, then the
747 //      * returned stage completes exceptionally with the supplied
748 //      * action's exception. Or, if this stage completed exceptionally
749 //      * and the supplied action throws an exception, then the returned
750 //      * stage completes exceptionally with this stage's exception.
751 //      *
752 //      * @param action the action to perform
753 //      * @return the new CompletionStage
754 //      */
755 //     CompletionStage!(T) whenComplete(BiConsumer!(T, Throwable) action);
756 
757 //     /**
758 //      * Returns a new CompletionStage with the same result or exception as
759 //      * this stage, that executes the given action using this stage's
760 //      * default asynchronous execution facility when this stage completes.
761 //      *
762 //      * <p>When this stage is complete, the given action is invoked with the
763 //      * result (or {@code null} if none) and the exception (or {@code null}
764 //      * if none) of this stage as arguments.  The returned stage is completed
765 //      * when the action returns.
766 //      *
767 //      * <p>Unlike method {@link #handleAsync(BiFunction) handleAsync},
768 //      * this method is not designed to translate completion outcomes,
769 //      * so the supplied action should not throw an exception. However,
770 //      * if it does, the following rules apply: If this stage completed
771 //      * normally but the supplied action throws an exception, then the
772 //      * returned stage completes exceptionally with the supplied
773 //      * action's exception. Or, if this stage completed exceptionally
774 //      * and the supplied action throws an exception, then the returned
775 //      * stage completes exceptionally with this stage's exception.
776 //      *
777 //      * @param action the action to perform
778 //      * @return the new CompletionStage
779 //      */
780 //     CompletionStage!(T) whenCompleteAsync(BiConsumer!(T, Throwable) action);
781 
782 //     /**
783 //      * Returns a new CompletionStage with the same result or exception as
784 //      * this stage, that executes the given action using the supplied
785 //      * Executor when this stage completes.
786 //      *
787 //      * <p>When this stage is complete, the given action is invoked with the
788 //      * result (or {@code null} if none) and the exception (or {@code null}
789 //      * if none) of this stage as arguments.  The returned stage is completed
790 //      * when the action returns.
791 //      *
792 //      * <p>Unlike method {@link #handleAsync(BiFunction,Executor) handleAsync},
793 //      * this method is not designed to translate completion outcomes,
794 //      * so the supplied action should not throw an exception. However,
795 //      * if it does, the following rules apply: If this stage completed
796 //      * normally but the supplied action throws an exception, then the
797 //      * returned stage completes exceptionally with the supplied
798 //      * action's exception. Or, if this stage completed exceptionally
799 //      * and the supplied action throws an exception, then the returned
800 //      * stage completes exceptionally with this stage's exception.
801 //      *
802 //      * @param action the action to perform
803 //      * @param executor the executor to use for asynchronous execution
804 //      * @return the new CompletionStage
805 //      */
806 //     CompletionStage!(T) whenCompleteAsync(BiConsumer!(T, Throwable) action, Executor executor);
807      
808 // }
809 //     /**
810 //      * Returns a new CompletionStage that, when this stage completes
811 //      * exceptionally, is executed with this stage's exception as the
812 //      * argument to the supplied function.  Otherwise, if this stage
813 //      * completes normally, then the returned stage also completes
814 //      * normally with the same value.
815 //      *
816 //      * @param fn the function to use to compute the value of the
817 //      * returned CompletionStage if this CompletionStage completed
818 //      * exceptionally
819 //      * @return the new CompletionStage
820 //      */
821 //     CompletionStage!(T) exceptionally(Function!(Throwable, T) fn);
822 
823 //     /**
824 //      * Returns a {@link CompletableFuture} maintaining the same
825 //      * completion properties as this stage. If this stage is already a
826 //      * CompletableFuture, this method may return this stage itself.
827 //      * Otherwise, invocation of this method may be equivalent in
828 //      * effect to {@code thenApply(x -> x)}, but returning an instance
829 //      * of type {@code CompletableFuture}.
830 //      *
831 //      * @return the CompletableFuture
832 //      */
833 //     CompletionStage!(T) toCompletableFuture();
834     
835 
836 // }