// 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.

/// Support for asynchronous programming,
/// with classes such as Future and Stream.
///
/// [Future]s and [Stream]s are the fundamental building blocks
/// of asynchronous programming in Dart. They are supported
/// directly in the language through `async` and `async*`
/// functions, and are available to all libraries through
/// the `dart:core` library.
///
/// This library provides further tools for creating, consuming
/// and transforming futures and streams, as well as direct access to
/// other asynchronous primitives like [timers][Timer],
/// [microtasks][scheduleMicrotask] and [zones][Zone].
///
/// To use this library in your code:
/// ```dart
/// 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 APIs that are implemented using a
/// different thread or isolate (e.g., the asynchronous I/O
/// operations of `dart:io` or HTTP requests of `dart:html`).
///
/// Many methods in the Dart libraries return `Future`s when
/// performing tasks. For example, when binding an `HttpServer`
/// to a host and port, the `bind()` method returns a Future.
/// ```dart import:io
///  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 callback functions that run
/// each time more data is available, an error has occurred, or
/// the stream has finished.
/// Further functionality is provided on [Stream], implemented by calling
/// [Stream.listen] to get the actual data.
/// ```dart import:io import:convert
/// Stream<List<int>> stream = File('quotes.txt').openRead();
/// stream.transform(utf8.decoder).forEach(print);
/// ```
/// This stream emits a sequence of lists of bytes.
/// The program must then handle those lists of bytes in some way.
/// 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.
/// ```dart import:html
/// querySelector('#myButton')!.onClick.forEach((_) => 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://dart.dev/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://dart.dev/guides/libraries/library-tour#dartasync---asynchronous-programming
/// [futures-tutorial]: https://dart.dev/codelabs/async-await
/// [futures-error-handling]: https://dart.dev/guides/libraries/futures-error-handling
/// [test-readme]: https://pub.dev/packages/test
///
/// {@category Core}
library dart.async;

import "dart:collection" show HashMap;
import 'dart:developer' show Timeline;
import "dart:_internal"
    show
        CastStream,
        CastStreamTransformer,
        checkNotNullable,
        IterableElementError,
        nullFuture,
        printToZone,
        printToConsole,
        Since,
        typeAcceptsNull,
        unsafeCast,
        vmIsolateUnsendable;

part 'async_error.dart';
part 'broadcast_stream_controller.dart';
part 'deferred_load.dart';
part 'future.dart';
part 'future_extensions.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';
part 'zone_api.dart';
part 'zone_delegate.dart';
part 'zone_root.dart';
part 'zone_specification.dart';
