Index: sdk/lib/async/future.dart |
diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart |
index 7d892c687ef1cd0197b149b65a173d56dcc6f3a5..9d28ee6e4c054611273d24592fd56768435e79eb 100644 |
--- a/sdk/lib/async/future.dart |
+++ b/sdk/lib/async/future.dart |
@@ -4,6 +4,46 @@ |
part of dart.async; |
+/// A type representing values that are either `Future<T>` or `T`. |
+/// |
+/// This class declaration is a public stand-in for an internal |
+/// future-or-value generic type. References to this class are resolved to the |
+/// internal type. |
+/// |
+/// It is a compile-time error for any class to extend, mix in or implement |
+/// `FutureOr`. |
+/// |
+/// Note: the `FutureOr<T>` type is interpreted as `dynamic` in non strong-mode. |
+/// |
+/// # Examples |
+/// ``` dart |
+/// // The `Future<T>.then` function takes a callback [f] that returns either |
+/// // an `S` or a `Future<S>`. |
+/// Future<S> then<S>(FutureOr<S> f(T x), ...); |
+/// |
+/// // `Completer<T>.complete` takes either a `T` or `Future<T>`. |
+/// void complete(FutureOr<T> value); |
+/// ``` |
+/// |
+/// # Advanced |
+/// The `FutureOr<int>` type is actually the "type union" of the types `int` and |
+/// `Future<int>`. This type union is defined in such a way that |
+/// `FutureOr<Object>` is both a super- and sub-type of `Object` (sub-type |
+/// because `Object` is one of the types of the union, super-type because |
+/// `Object` is a super-type of both of the types of the union). Together it |
+/// means that `FutureOr<Object>` is equivalent to `Object`. |
+/// |
+/// As a corollary, `FutureOr<Object>` is equivalent to |
+/// `FutureOr<FutureOr<Object>>`, `FutureOr<Future<Object>> is equivalent to |
+/// `Future<Object>`. |
+abstract class FutureOr<T> { |
+ // Private constructor, so that it is not subclassable, mixable, or |
+ // instantiable. |
+ FutureOr._() { |
+ throw new UnsupportedError("FutureOr can't be instantiated"); |
+ } |
+} |
+ |
/** |
* An object representing a delayed computation. |
* |