Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(629)

Unified Diff: sdk/lib/core/future.dart

Issue 11783009: Big merge from experimental to bleeding edge. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sdk/lib/core/expect.dart ('k') | sdk/lib/core/future_impl.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/core/future.dart
diff --git a/sdk/lib/core/future.dart b/sdk/lib/core/future.dart
deleted file mode 100644
index 93bc6c842e996a962678bdb4545e64d5987decab..0000000000000000000000000000000000000000
--- a/sdk/lib/core/future.dart
+++ /dev/null
@@ -1,281 +0,0 @@
-// 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.
-
-part of dart.core;
-
-/**
- * A [Future] is used to obtain a value sometime in the future. Receivers of a
- * [Future] can obtain the value by passing a callback to [then]. For example:
- *
- * Future<int> future = getFutureFromSomewhere();
- * future.then((value) {
- * print("I received the number $value");
- * });
- *
- * A future may complete by *succeeding* (producing a value) or *failing*
- * (producing an exception, which may be handled with [handleException]).
- * Callbacks passed to [onComplete] will be invoked in either case.
- *
- * When a future completes, the following actions happen in order:
- *
- * 1. if the future suceeded, handlers registered with [then] are called.
- * 2. if the future failed, handlers registered with [handleException] are
- * called in sequence, until one returns true.
- * 3. handlers registered with [onComplete] are called
- * 4. if the future failed, and at least one handler was registered with
- * [then], and no handler registered with [handleException] returned
- * [:true:], then the exception is thrown.
- *
- * Use a [Completer] to create and change the state of a [Future].
- */
-abstract class Future<T> {
- /** A future whose value is immediately available. */
- factory Future.immediate(T value) => new _FutureImpl<T>.immediate(value);
-
- /** The value provided. Throws an exception if [hasValue] is false. */
- T get value;
-
- /**
- * Exception that occurred ([:null:] if no exception occured). This property
- * throws a [FutureNotCompleteException] if it is used before this future is
- * completes.
- */
- Object get exception;
-
- /**
- * The stack trace object associated with the exception that occurred. This
- * throws a [FutureNotCompleteException] if it is used before the future
- * completes. Returns [:null:] if the future completed successfully or a
- * stack trace wasn't provided with the exception when it occurred.
- */
- Object get stackTrace;
-
- /**
- * Whether the future is complete (either the value is available or there was
- * an exception).
- */
- bool get isComplete;
-
- /**
- * Whether the value is available (meaning [isComplete] is true, and there was
- * no exception).
- */
- bool get hasValue;
-
- /**
- * When this future is complete (either with a value or with an exception),
- * then [complete] is called with the future.
- * If [complete] throws an exception, it is ignored.
- */
- void onComplete(void complete(Future<T> future));
-
- /**
- * If this future is complete and has a value, then [onSuccess] is called
- * with the value.
- */
- void then(void onSuccess(T value));
-
- /**
- * If this future is complete and has an exception, then call [onException].
- *
- * If [onException] returns true, then the exception is considered handled.
- *
- * If [onException] does not return true (or [handleException] was never
- * called), then the exception is not considered handled. In that case, if
- * there were any calls to [then], then the exception will be thrown when the
- * value is set.
- *
- * In most cases it should not be necessary to call [handleException],
- * because the exception associated with this [Future] will propagate
- * naturally if the future's value is being consumed. Only call
- * [handleException] if you need to do some special local exception handling
- * related to this particular Future's value.
- */
- void handleException(bool onException(Object exception));
-
- /**
- * A future representing [transformation] applied to this future's value.
- *
- * When this future gets a value, [transformation] will be called on the
- * value, and the returned future will receive the result.
- *
- * If an exception occurs (received by this future, or thrown by
- * [transformation]) then the returned future will receive the exception.
- *
- * You must not add exception handlers to [this] future prior to calling
- * transform, and any you add afterwards will not be invoked.
- */
- Future transform(transformation(T value));
-
- /**
- * A future representing an asynchronous transformation applied to this
- * future's value. [transformation] must return a Future.
- *
- * When this future gets a value, [transformation] will be called on the
- * value. When the resulting future gets a value, the returned future
- * will receive it.
- *
- * If an exception occurs (received by this future, thrown by
- * [transformation], or received by the future returned by [transformation])
- * then the returned future will receive the exception.
- *
- * You must not add exception handlers to [this] future prior to calling
- * chain, and any you add afterwards will not be invoked.
- */
- Future chain(Future transformation(T value));
-
- /**
- * A future representing [transformation] applied to this future's exception.
- * This can be used to "catch" an exception coming from `this` and translate
- * it to a more appropriate result.
- *
- * If this future gets a value, it simply completes to that same value. If an
- * exception occurs, then [transformation] will be called with the exception
- * value. If [transformation] itself throws an exception, then the returned
- * future completes with that exception. Otherwise, the future will complete
- * with the value returned by [transformation]. If the returned value is
- * itself a future, then the future returned by [transformException] will
- * complete with the value that that future completes to.
- */
- Future transformException(transformation(Object exception));
-}
-
-/**
- * A [Completer] is used to produce [Future]s and supply their value when it
- * becomes available.
- *
- * A service that provides values to callers, and wants to return [Future]s can
- * use a [Completer] as follows:
- *
- * Completer completer = new Completer();
- * // send future object back to client...
- * return completer.future;
- * ...
- *
- * // later when value is available, call:
- * completer.complete(value);
- *
- * // alternatively, if the service cannot produce the value, it
- * // can provide an exception:
- * completer.completeException(exception);
- *
- */
-abstract class Completer<T> {
-
- factory Completer() => new _CompleterImpl<T>();
-
- /** The future that will contain the value produced by this completer. */
- Future get future;
-
- /** Supply a value for [future]. */
- void complete(T value);
-
- /**
- * Indicate in [future] that an exception occured while trying to produce its
- * value. The argument [exception] should not be [:null:]. A [stackTrace]
- * object can be provided as well to give the user information about where
- * the error occurred. If omitted, it will be [:null:].
- */
- void completeException(Object exception, [Object stackTrace]);
-}
-
-/** Thrown when reading a future's properties before it is complete. */
-class FutureNotCompleteException implements Exception {
- FutureNotCompleteException() {}
- String toString() => "Exception: future has not been completed";
-}
-
-/**
- * Thrown if a completer tries to set the value on a future that is already
- * complete.
- */
-class FutureAlreadyCompleteException implements Exception {
- FutureAlreadyCompleteException() {}
- String toString() => "Exception: future already completed";
-}
-
-/**
- * Wraps unhandled exceptions provided to [Completer.completeException]. It is
- * used to show both the error message and the stack trace for unhandled
- * exceptions.
- */
-class FutureUnhandledException implements Exception {
- /** Wrapped exception. */
- var source;
-
- /** Trace for the wrapped exception. */
- Object stackTrace;
-
- FutureUnhandledException(this.source, this.stackTrace);
-
- String toString() {
- return 'FutureUnhandledException: exception while executing Future\n '
- '${source.toString().replaceAll("\n", "\n ")}\n'
- 'original stack trace:\n '
- '${stackTrace.toString().replaceAll("\n","\n ")}';
- }
-}
-
-
-/**
- * [Futures] holds additional utility functions that operate on [Future]s (for
- * example, waiting for a collection of Futures to complete).
- */
-class Futures {
- /**
- * Returns a future which will complete once all the futures in a list are
- * complete. If any of the futures in the list completes with an exception,
- * the resulting future also completes with an exception. (The value of the
- * returned future will be a list of all the values that were produced.)
- */
- static Future<List> wait(List<Future> futures) {
- if (futures.isEmpty) {
- return new Future<List>.immediate(const []);
- }
-
- Completer completer = new Completer<List>();
- Future<List> result = completer.future;
- int remaining = futures.length;
- List values = new List(futures.length);
-
- // As each future completes, put its value into the corresponding
- // position in the list of values.
- for (int i = 0; i < futures.length; i++) {
- // TODO(mattsh) - remove this after bug
- // http://code.google.com/p/dart/issues/detail?id=333 is fixed.
- int pos = i;
- Future future = futures[pos];
- future.then((Object value) {
- values[pos] = value;
- if (--remaining == 0 && !result.isComplete) {
- completer.complete(values);
- }
- });
- future.handleException((exception) {
- if (!result.isComplete) {
- completer.completeException(exception, future.stackTrace);
- }
- return true;
- });
- }
- return result;
- }
-
- /**
- * Runs [f] for each element in [input] in order, moving to the next element
- * only when the [Future] returned by [f] completes. Returns a [Future] that
- * completes when all elements have been processed.
- *
- * The return values of all [Future]s are discarded. Any errors will cause the
- * iteration to stop and will be piped through the returned [Future].
- */
- static Future forEach(Iterable input, Future f(element)) {
- var iterator = input.iterator();
- Future nextElement(_) {
- if (!iterator.hasNext) return new Future.immediate(null);
- return f(iterator.next()).chain(nextElement);
- }
- return nextElement(null);
- }
-}
« no previous file with comments | « sdk/lib/core/expect.dart ('k') | sdk/lib/core/future_impl.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698