Index: watcher/lib/src/resubscribable.dart |
diff --git a/watcher/lib/src/resubscribable.dart b/watcher/lib/src/resubscribable.dart |
deleted file mode 100644 |
index 2844c1e2cc175809f5dab25555d198c1735f3310..0000000000000000000000000000000000000000 |
--- a/watcher/lib/src/resubscribable.dart |
+++ /dev/null |
@@ -1,77 +0,0 @@ |
-// Copyright (c) 2013, 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 watcher.resubscribable; |
- |
-import 'dart:async'; |
- |
-import '../watcher.dart'; |
-import 'watch_event.dart'; |
- |
-typedef ManuallyClosedWatcher WatcherFactory(); |
- |
-/// A wrapper for [ManuallyClosedWatcher] that encapsulates support for closing |
-/// the watcher when it has no subscribers and re-opening it when it's |
-/// re-subscribed. |
-/// |
-/// It's simpler to implement watchers without worrying about this behavior. |
-/// This class wraps a watcher class which can be written with the simplifying |
-/// assumption that it can continue emitting events until an explicit `close` |
-/// method is called, at which point it will cease emitting events entirely. The |
-/// [ManuallyClosedWatcher] interface is used for these watchers. |
-/// |
-/// This would be more cleanly implemented as a function that takes a class and |
-/// emits a new class, but Dart doesn't support that sort of thing. Instead it |
-/// takes a factory function that produces instances of the inner class. |
-abstract class ResubscribableWatcher implements Watcher { |
- /// The factory function that produces instances of the inner class. |
- final WatcherFactory _factory; |
- |
- final String path; |
- |
- Stream<WatchEvent> get events => _eventsController.stream; |
- StreamController<WatchEvent> _eventsController; |
- |
- bool get isReady => _readyCompleter.isCompleted; |
- |
- Future get ready => _readyCompleter.future; |
- var _readyCompleter = new Completer(); |
- |
- /// Creates a new [ResubscribableWatcher] wrapping the watchers |
- /// emitted by [_factory]. |
- ResubscribableWatcher(this.path, this._factory) { |
- var watcher; |
- var subscription; |
- |
- _eventsController = new StreamController<WatchEvent>.broadcast( |
- onListen: () { |
- watcher = _factory(); |
- subscription = watcher.events.listen(_eventsController.add, |
- onError: _eventsController.addError, |
- onDone: _eventsController.close); |
- |
- // It's important that we complete the value of [_readyCompleter] at the |
- // time [onListen] is called, as opposed to the value when [watcher.ready] |
- // fires. A new completer may be created by that time. |
- watcher.ready.then(_readyCompleter.complete); |
- }, onCancel: () { |
- // Cancel the subscription before closing the watcher so that the |
- // watcher's `onDone` event doesn't close [events]. |
- subscription.cancel(); |
- watcher.close(); |
- _readyCompleter = new Completer(); |
- }, sync: true); |
- } |
-} |
- |
-/// An interface for watchers with an explicit, manual [close] method. |
-/// |
-/// See [ResubscribableWatcher]. |
-abstract class ManuallyClosedWatcher implements Watcher { |
- /// Closes the watcher. |
- /// |
- /// Subclasses should close their [events] stream and release any internal |
- /// resources. |
- void close(); |
-} |