Updates for Dart 2.0 core library changes (wave 2.2) (#45)


diff --git a/CHANGELOG.md b/CHANGELOG.md
index 03fff02..2577503 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,13 @@
+## 2.0.4
+
+* Add support for Dart 2.0 library changes to Stream and StreamTransformer.
+  Changed classes that implement `StreamTransformer` to extend
+  `StreamTransformerBase`, and changed signatures of `firstWhere`, `lastWhere`,
+  and `singleWhere` on classes extending `Stream`.  See
+  also [issue 31847][sdk#31847].
+
+  [sdk#31847]: https://github.com/dart-lang/sdk/issues/31847
+
 ## 2.0.3
 
 * Fix a bug in `StreamQueue.startTransaction()` and related methods when
diff --git a/lib/src/result/capture_transformer.dart b/lib/src/result/capture_transformer.dart
index 71e8a00..5933f0c 100644
--- a/lib/src/result/capture_transformer.dart
+++ b/lib/src/result/capture_transformer.dart
@@ -11,7 +11,7 @@
 ///
 /// The result of the transformation is a stream of [Result] values and no
 /// error events. Exposed by [Result.captureStream].
-class CaptureStreamTransformer<T> implements StreamTransformer<T, Result<T>> {
+class CaptureStreamTransformer<T> extends StreamTransformerBase<T, Result<T>> {
   const CaptureStreamTransformer();
 
   Stream<Result<T>> bind(Stream<T> source) {
diff --git a/lib/src/result/release_transformer.dart b/lib/src/result/release_transformer.dart
index fc9278d..01865cc 100644
--- a/lib/src/result/release_transformer.dart
+++ b/lib/src/result/release_transformer.dart
@@ -8,7 +8,7 @@
 import 'release_sink.dart';
 
 /// A transformer that releases result events as data and error events.
-class ReleaseStreamTransformer<T> implements StreamTransformer<Result<T>, T> {
+class ReleaseStreamTransformer<T> extends StreamTransformerBase<Result<T>, T> {
   const ReleaseStreamTransformer();
 
   Stream<T> bind(Stream<Result<T>> source) {
diff --git a/lib/src/single_subscription_transformer.dart b/lib/src/single_subscription_transformer.dart
index fcd6b06..f590860 100644
--- a/lib/src/single_subscription_transformer.dart
+++ b/lib/src/single_subscription_transformer.dart
@@ -13,7 +13,7 @@
 /// This also casts the source stream's events to type `T`. If the cast fails,
 /// the result stream will emit a [CastError]. This behavior is deprecated, and
 /// should not be relied upon.
-class SingleSubscriptionTransformer<S, T> implements StreamTransformer<S, T> {
+class SingleSubscriptionTransformer<S, T> extends StreamTransformerBase<S, T> {
   const SingleSubscriptionTransformer();
 
   Stream<T> bind(Stream<S> stream) {
diff --git a/lib/src/typed/stream.dart b/lib/src/typed/stream.dart
index a467115..b3b0513 100644
--- a/lib/src/typed/stream.dart
+++ b/lib/src/typed/stream.dart
@@ -53,14 +53,18 @@
   Stream<S> expand<S>(Iterable<S> convert(T value)) =>
       _stream.expand(_validateType(convert));
 
-  Future firstWhere(bool test(T element), {Object defaultValue()}) =>
-      _stream.firstWhere(_validateType(test), defaultValue: defaultValue);
+  Future<T> firstWhere(bool test(T element),
+          {Object defaultValue(), T orElse()}) =>
+      _stream.firstWhere(_validateType(test),
+          defaultValue: defaultValue, orElse: orElse);
 
-  Future lastWhere(bool test(T element), {Object defaultValue()}) =>
-      _stream.lastWhere(_validateType(test), defaultValue: defaultValue);
+  Future<T> lastWhere(bool test(T element),
+          {Object defaultValue(), T orElse()}) =>
+      _stream.lastWhere(_validateType(test),
+          defaultValue: defaultValue, orElse: orElse);
 
-  Future<T> singleWhere(bool test(T element)) async =>
-      (await _stream.singleWhere(_validateType(test))) as T;
+  Future<T> singleWhere(bool test(T element), {T orElse()}) async =>
+      await _stream.singleWhere(_validateType(test), orElse: orElse);
 
   Future<S> fold<S>(S initialValue, S combine(S previous, T element)) =>
       _stream.fold(
diff --git a/lib/src/typed_stream_transformer.dart b/lib/src/typed_stream_transformer.dart
index 98d5e70..cb63311 100644
--- a/lib/src/typed_stream_transformer.dart
+++ b/lib/src/typed_stream_transformer.dart
@@ -20,7 +20,7 @@
 
 /// A wrapper that coerces the type of the stream returned by an inner
 /// transformer.
-class _TypeSafeStreamTransformer<S, T> implements StreamTransformer<S, T> {
+class _TypeSafeStreamTransformer<S, T> extends StreamTransformerBase<S, T> {
   final StreamTransformer _inner;
 
   _TypeSafeStreamTransformer(this._inner);
diff --git a/pubspec.yaml b/pubspec.yaml
index 3fd3bbb..3b9bac4 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,10 +1,10 @@
 name: async
-version: 2.0.3
+version: 2.0.4
 author: Dart Team <misc@dartlang.org>
 description: Utility functions and classes related to the 'dart:async' library.
 homepage: https://www.github.com/dart-lang/async
 environment:
-  sdk: ">=2.0.0-dev.15.0 <2.0.0"
+  sdk: ">=2.0.0-dev.23.0 <2.0.0"
 dependencies:
   collection: "^1.5.0"
 dev_dependencies: