Index: sdk/lib/core/future_impl.dart |
diff --git a/sdk/lib/core/future_impl.dart b/sdk/lib/core/future_impl.dart |
deleted file mode 100644 |
index 693d14781317319396cee010ca0be4e188e7387d..0000000000000000000000000000000000000000 |
--- a/sdk/lib/core/future_impl.dart |
+++ /dev/null |
@@ -1,291 +0,0 @@ |
-// Copyright 2012 Google Inc. All Rights Reserved. |
-// Dart core library. |
- |
-part of dart.core; |
- |
-class _FutureImpl<T> implements Future<T> { |
- |
- bool _isComplete = false; |
- |
- /** |
- * Value that was provided to this Future by the Completer |
- */ |
- T _value; |
- |
- /** |
- * Exception that occured, if there was a problem providing |
- * Value. |
- */ |
- Object _exception; |
- |
- /** |
- * Stack trace associated with [_exception], if one was provided. |
- */ |
- Object _stackTrace; |
- |
- /** |
- * true, if any onException handler handled the exception. |
- */ |
- bool _exceptionHandled = false; |
- |
- /** |
- * true if an exception in this future should be thrown to the top level. |
- */ |
- bool _throwOnException = false; |
- |
- /** |
- * Listeners waiting to receive the value of this future. |
- */ |
- final List<Function> _successListeners; |
- |
- /** |
- * Exception handlers waiting for exceptions. |
- */ |
- final List<Function> _exceptionHandlers; |
- |
- /** |
- * Listeners waiting to be called when the future completes. |
- */ |
- final List<Function> _completionListeners; |
- |
- _FutureImpl() |
- : _successListeners = [], |
- _exceptionHandlers = [], |
- _completionListeners = []; |
- |
- factory _FutureImpl.immediate(T value) { |
- final res = new _FutureImpl(); |
- res._setValue(value); |
- return res; |
- } |
- |
- T get value { |
- if (!isComplete) { |
- throw new FutureNotCompleteException(); |
- } |
- if (_exception != null) { |
- throw new FutureUnhandledException(_exception, stackTrace); |
- } |
- return _value; |
- } |
- |
- Object get exception { |
- if (!isComplete) { |
- throw new FutureNotCompleteException(); |
- } |
- return _exception; |
- } |
- |
- Object get stackTrace { |
- if (!isComplete) { |
- throw new FutureNotCompleteException(); |
- } |
- return _stackTrace; |
- } |
- |
- bool get isComplete { |
- return _isComplete; |
- } |
- |
- bool get hasValue { |
- return isComplete && _exception == null; |
- } |
- |
- void then(void onSuccess(T value)) { |
- if (hasValue) { |
- onSuccess(value); |
- } else if (!isComplete) { |
- _throwOnException = true; |
- _successListeners.add(onSuccess); |
- } else if (!_exceptionHandled) { |
- throw new FutureUnhandledException(_exception, stackTrace); |
- } |
- } |
- |
- void _handleSuccess(void onSuccess(T value)) { |
- if (hasValue) { |
- onSuccess(value); |
- } else if (!isComplete) { |
- _successListeners.add(onSuccess); |
- } |
- } |
- |
- void handleException(bool onException(Object exception)) { |
- if (_exceptionHandled) return; |
- if (_isComplete) { |
- if (_exception != null) { |
- _exceptionHandled = onException(_exception); |
- } |
- } else { |
- _exceptionHandlers.add(onException); |
- } |
- } |
- |
- void onComplete(void complete(Future<T> future)) { |
- if (_isComplete) { |
- try { |
- complete(this); |
- } catch (e) {} |
- } else { |
- _completionListeners.add(complete); |
- } |
- } |
- |
- void _complete() { |
- _isComplete = true; |
- |
- try { |
- if (_exception != null) { |
- for (Function handler in _exceptionHandlers) { |
- // Explicitly check for true here so that if the handler returns null, |
- // we don't get an exception in checked mode. |
- if (handler(_exception) == true) { |
- _exceptionHandled = true; |
- break; |
- } |
- } |
- } |
- |
- if (hasValue) { |
- for (Function listener in _successListeners) { |
- listener(value); |
- } |
- } else { |
- if (!_exceptionHandled && _throwOnException) { |
- throw new FutureUnhandledException(_exception, stackTrace); |
- } |
- } |
- } finally { |
- for (Function listener in _completionListeners) { |
- try { |
- listener(this); |
- } catch (e) {} |
- } |
- } |
- } |
- |
- void _setValue(T value) { |
- if (_isComplete) { |
- throw new FutureAlreadyCompleteException(); |
- } |
- _value = value; |
- _complete(); |
- } |
- |
- void _setException(Object exception, Object stackTrace) { |
- if (exception == null) { |
- // null is not a legal value for the exception of a Future. |
- throw new ArgumentError(null); |
- } |
- if (_isComplete) { |
- throw new FutureAlreadyCompleteException(); |
- } |
- _exception = exception; |
- _stackTrace = stackTrace; |
- _complete(); |
- } |
- |
- Future transform(Function transformation) { |
- final completer = new Completer(); |
- |
- _forwardException(this, completer); |
- |
- _handleSuccess((v) { |
- var transformed = null; |
- try { |
- transformed = transformation(v); |
- } catch (e, stackTrace) { |
- completer.completeException(e, stackTrace); |
- return; |
- } |
- completer.complete(transformed); |
- }); |
- |
- return completer.future; |
- } |
- |
- Future chain(Function transformation) { |
- final completer = new Completer(); |
- |
- _forwardException(this, completer); |
- _handleSuccess((v) { |
- var future = null; |
- try { |
- future = transformation(v); |
- } catch (ex, stackTrace) { |
- completer.completeException(ex, stackTrace); |
- return; |
- } |
- |
- _forward(future, completer); |
- }); |
- return completer.future; |
- } |
- |
- Future transformException(transformation(Object exception)) { |
- final completer = new Completer(); |
- |
- handleException((ex) { |
- try { |
- final result = transformation(ex); |
- |
- // If the transformation itself returns a future, then we will |
- // complete to what that completes to. |
- if (result is Future) { |
- _forward(result, completer); |
- } else { |
- completer.complete(result); |
- } |
- } catch (innerException, stackTrace) { |
- if (identical(ex, innerException)) { |
- completer.completeException(innerException, this.stackTrace); |
- } else { |
- completer.completeException(innerException, stackTrace); |
- } |
- } |
- return false; |
- }); |
- |
- _handleSuccess(completer.complete); |
- |
- return completer.future; |
- } |
- |
- /** |
- * Forwards the success or error completion from [future] to [completer]. |
- */ |
- _forward(Future future, Completer completer) { |
- _forwardException(future, completer); |
- future._handleSuccess(completer.complete); |
- } |
- |
- /** |
- * Forwards the exception completion from [future] to [completer]. |
- */ |
- _forwardException(Future future, Completer completer) { |
- future.handleException((e) { |
- completer.completeException(e, future.stackTrace); |
- return false; |
- }); |
- } |
-} |
- |
-class _CompleterImpl<T> implements Completer<T> { |
- |
- final _FutureImpl<T> _futureImpl; |
- |
- _CompleterImpl() : _futureImpl = new _FutureImpl() {} |
- |
- Future<T> get future { |
- return _futureImpl; |
- } |
- |
- void complete(T value) { |
- _futureImpl._setValue(value); |
- } |
- |
- void completeException(Object exception, [Object stackTrace]) { |
- _futureImpl._setException(exception, stackTrace); |
- } |
-} |
- |