Index: packages/async/lib/src/delegate/stream_subscription.dart |
diff --git a/packages/async/lib/src/delegate/stream_subscription.dart b/packages/async/lib/src/delegate/stream_subscription.dart |
index ff9b66584b119a2373792e19450360d3fc962f4d..e7575d8215cb0dcf6a582321f51e99447aec23d0 100644 |
--- a/packages/async/lib/src/delegate/stream_subscription.dart |
+++ b/packages/async/lib/src/delegate/stream_subscription.dart |
@@ -2,10 +2,10 @@ |
// 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. |
-library async.delegate.stream_subscription; |
- |
import 'dart:async'; |
+import '../typed/stream_subscription.dart'; |
+ |
/// Simple delegating wrapper around a [StreamSubscription]. |
/// |
/// Subclasses can override individual methods. |
@@ -13,9 +13,21 @@ class DelegatingStreamSubscription<T> implements StreamSubscription<T> { |
final StreamSubscription _source; |
/// Create delegating subscription forwarding calls to [sourceSubscription]. |
- DelegatingStreamSubscription(StreamSubscription sourceSubscription) |
+ DelegatingStreamSubscription(StreamSubscription<T> sourceSubscription) |
: _source = sourceSubscription; |
+ /// Creates a wrapper which throws if [subscription]'s events aren't instances |
+ /// of `T`. |
+ /// |
+ /// This soundly converts a [StreamSubscription] to a `StreamSubscription<T>`, |
+ /// regardless of its original generic type, by asserting that its events are |
+ /// instances of `T` whenever they're provided. If they're not, the |
+ /// subscription throws a [CastError]. |
+ static StreamSubscription<T> typed<T>(StreamSubscription subscription) => |
+ subscription is StreamSubscription<T> |
+ ? subscription |
+ : new TypeSafeStreamSubscription<T>(subscription); |
+ |
void onData(void handleData(T data)) { |
_source.onData(handleData); |
} |
@@ -38,7 +50,7 @@ class DelegatingStreamSubscription<T> implements StreamSubscription<T> { |
Future cancel() => _source.cancel(); |
- Future asFuture([futureValue]) => _source.asFuture(futureValue); |
+ Future<E> asFuture<E>([E futureValue]) => _source.asFuture(futureValue); |
bool get isPaused => _source.isPaused; |
} |