|  | // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | // @dart = 2.5 | 
|  |  | 
|  | /** | 
|  | * Support for asynchronous programming, | 
|  | * with classes such as Future and Stream. | 
|  | * | 
|  | * Understanding [Future]s and [Stream]s is a prerequisite for | 
|  | * writing just about any Dart program. | 
|  | * | 
|  | * To use this library in your code: | 
|  | * | 
|  | *     import 'dart:async'; | 
|  | * | 
|  | * ## Future | 
|  | * | 
|  | * A Future object represents a computation whose return value | 
|  | * might not yet be available. | 
|  | * The Future returns the value of the computation | 
|  | * when it completes at some time in the future. | 
|  | * Futures are often used for potentially lengthy computations | 
|  | * such as I/O and interaction with users. | 
|  | * | 
|  | * Many methods in the Dart libraries return Futures when | 
|  | * performing tasks. For example, when binding an HttpServer | 
|  | * to a host and port, the `bind()` method returns a Future. | 
|  | * | 
|  | *      HttpServer.bind('127.0.0.1', 4444) | 
|  | *          .then((server) => print('${server.isBroadcast}')) | 
|  | *          .catchError(print); | 
|  | * | 
|  | * [Future.then] registers a callback function that runs | 
|  | * when the Future's operation, in this case the `bind()` method, | 
|  | * completes successfully. | 
|  | * The value returned by the operation | 
|  | * is passed into the callback function. | 
|  | * In this example, the `bind()` method returns the HttpServer | 
|  | * object. The callback function prints one of its properties. | 
|  | * [Future.catchError] registers a callback function that | 
|  | * runs if an error occurs within the Future. | 
|  | * | 
|  | * ## Stream | 
|  | * | 
|  | * A Stream provides an asynchronous sequence of data. | 
|  | * Examples of data sequences include individual events, like mouse clicks, | 
|  | * or sequential chunks of larger data, like multiple byte lists with the | 
|  | * contents of a file | 
|  | * such as mouse clicks, and a stream of byte lists read from a file. | 
|  | * The following example opens a file for reading. | 
|  | * [Stream.listen] registers a callback function that runs | 
|  | * each time more data is available. | 
|  | * | 
|  | *     Stream<List<int>> stream = new File('quotes.txt').openRead(); | 
|  | *     stream.transform(utf8.decoder).listen(print); | 
|  | * | 
|  | * The stream emits a sequence of a list of bytes. | 
|  | * The program must interpret the bytes or handle the raw byte data. | 
|  | * Here, the code uses a UTF-8 decoder (provided in the `dart:convert` library) | 
|  | * to convert the sequence of bytes into a sequence | 
|  | * of Dart strings. | 
|  | * | 
|  | * Another common use of streams is for user-generated events | 
|  | * in a web app: The following code listens for mouse clicks on a button. | 
|  | * | 
|  | *     querySelector('#myButton').onClick.listen((_) => print('Click.')); | 
|  | * | 
|  | * ## Other resources | 
|  | * | 
|  | * * The [dart:async section of the library tour][asynchronous-programming]: | 
|  | *   A brief overview of asynchronous programming. | 
|  | * | 
|  | * * [Use Future-Based APIs][futures-tutorial]: A closer look at Futures and | 
|  | *   how to use them to write asynchronous Dart code. | 
|  | * | 
|  | * * [Futures and Error Handling][futures-error-handling]: Everything you | 
|  | *   wanted to know about handling errors and exceptions when working with | 
|  | *   Futures (but were afraid to ask). | 
|  | * | 
|  | * * [The Event Loop and Dart](https://www.dartlang.org/articles/event-loop/): | 
|  | *   Learn how Dart handles the event queue and microtask queue, so you can | 
|  | *   write better asynchronous code with fewer surprises. | 
|  | * | 
|  | * * [test package: Asynchronous Tests][test-readme]: How to test asynchronous | 
|  | *   code. | 
|  | * | 
|  | * [asynchronous-programming]: https://www.dartlang.org/docs/dart-up-and-running/ch03.html#dartasync---asynchronous-programming | 
|  | * [futures-tutorial]: https://www.dartlang.org/docs/tutorials/futures/ | 
|  | * [futures-error-handling]: https://www.dartlang.org/articles/futures-and-error-handling/ | 
|  | * [test-readme]: https://pub.dartlang.org/packages/test | 
|  | * | 
|  | * {@category Core} | 
|  | */ | 
|  | library dart.async; | 
|  |  | 
|  | import "dart:collection" show HashMap, IterableBase; | 
|  | import "dart:_internal" | 
|  | show | 
|  | CastStream, | 
|  | CastStreamTransformer, | 
|  | EmptyIterator, | 
|  | IterableElementError, | 
|  | printToZone, | 
|  | printToConsole, | 
|  | Since; | 
|  |  | 
|  | part 'async_error.dart'; | 
|  | part 'broadcast_stream_controller.dart'; | 
|  | part 'deferred_load.dart'; | 
|  | part 'future.dart'; | 
|  | part 'future_impl.dart'; | 
|  | part 'schedule_microtask.dart'; | 
|  | part 'stream.dart'; | 
|  | part 'stream_controller.dart'; | 
|  | part 'stream_impl.dart'; | 
|  | part 'stream_pipe.dart'; | 
|  | part 'stream_transformers.dart'; | 
|  | part 'timer.dart'; | 
|  | part 'zone.dart'; |