Index: lib/src/util/stream_channel.dart |
diff --git a/lib/src/util/stream_channel.dart b/lib/src/util/stream_channel.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7858fae9aa5e296bcfc2a7bd38f5e1702b2d7927 |
--- /dev/null |
+++ b/lib/src/util/stream_channel.dart |
@@ -0,0 +1,48 @@ |
+// Copyright (c) 2015, 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. |
+ |
+library unittest.stream_channel; |
+ |
+import 'dart:async'; |
+ |
+/// An abstract class representing a two-way communication channel. |
+/// |
+/// Subclasses can mix in [StreamChannelMixin] to get default implementations of |
+/// the various instance methods. |
+abstract class StreamChannel<T> { |
+ /// The stream that emits values from the other endpoint. |
+ Stream<T> get stream; |
+ |
+ /// The sink for sending values to the other endpoint. |
+ StreamSink<T> get sink; |
+ |
+ /// Creates a new [StreamChannel] that communicates over [stream] and [sink]. |
+ factory StreamChannel(Stream<T> stream, StreamSink<T> sink) => |
+ new _StreamChannel<T>(stream, sink); |
+ |
+ /// Connects [this] to [other], so that any values emitted by either are sent |
+ /// directly to the other. |
+ void pipe(StreamChannel<T> other); |
+} |
+ |
+/// An implementation of [StreamChannel] that simply takes a stream and a sink |
+/// as parameters. |
+/// |
+/// This is distinct from [StreamChannel] so that it can use |
+/// [StreamChannelMixin]. |
+class _StreamChannel<T> extends StreamChannelMixin<T> { |
+ final Stream<T> stream; |
+ final StreamSink<T> sink; |
+ |
+ _StreamChannel(this.stream, this.sink); |
+} |
+ |
+/// A mixin that implements the instance methods of [StreamChannel] in terms of |
+/// [stream] and [sink]. |
+abstract class StreamChannelMixin<T> implements StreamChannel<T> { |
+ void pipe(StreamChannel<T> other) { |
+ stream.pipe(other.sink); |
+ other.stream.pipe(sink); |
+ } |
+} |