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 }