| 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);
|
| - }
|
| -}
|
|
|