Chromium Code Reviews| 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..68c53696a0fef3e2ae699324c9a80bdb7c47d4b4 |
| --- /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 extend [StreamChannelMixin] to get default implementations of |
|
Bob Nystrom
2015/03/02 20:31:31
"extend" -> "mix in".
nweiz
2015/03/02 22:39:42
Done.
|
| +/// 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); |
| + } |
| +} |