Index: runtime/observatory/lib/src/repositories/notification.dart |
diff --git a/runtime/observatory/lib/src/repositories/notification.dart b/runtime/observatory/lib/src/repositories/notification.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..348dbca5513d6b408f7e8839a8c3a04e6bc3b8a8 |
--- /dev/null |
+++ b/runtime/observatory/lib/src/repositories/notification.dart |
@@ -0,0 +1,72 @@ |
+// Copyright (c) 2016, 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 |
+ |
+part of repositories; |
+ |
+class NotificationChangeEvent implements M.NotificationChangeEvent { |
+ final NotificationRepository repository; |
+ NotificationChangeEvent(this.repository); |
+} |
+ |
+class NotificationRepository implements M.NotificationRepository { |
+ final List<M.Notification> _list = new List<M.Notification>(); |
+ |
+ final StreamController<M.NotificationChangeEvent> _onChange = |
+ new StreamController<M.NotificationChangeEvent>.broadcast(); |
+ Stream<M.NotificationChangeEvent> get onChange => _onChange.stream; |
+ |
+ void add(M.Notification notification) { |
+ assert(notification != null); |
+ _list.add(notification); |
+ _notify(); |
+ } |
+ |
+ Iterable<M.Notification> list() => _list; |
+ |
+ void delete(M.Notification notification) { |
+ if (_list.remove(notification)) |
+ _notify(); |
+ } |
+ |
+ void deleteAll() { |
+ if (_list.isNotEmpty) { |
+ _list.clear(); |
+ _notify(); |
+ } |
+ } |
+ |
+ NotificationRepository(); |
+ |
+ void _notify() { |
+ _onChange.add(new NotificationChangeEvent(this)); |
+ } |
+ |
+ void deleteWhere(bool test(M.Notification element)) { |
+ int length = _list.length; |
+ _list.removeWhere(test); |
+ if (_list.length != length) _notify(); |
+ } |
+ |
+ void deletePauseEvents({M.Isolate isolate}) { |
+ if (isolate == null) { |
+ deleteWhere((notification) { |
+ return notification is M.EventNotification && |
+ M.Event.isPauseEvent(notification.event); |
+ }); |
+ } else { |
+ deleteWhere((notification) { |
+ return notification is M.EventNotification && |
+ M.Event.isPauseEvent(notification.event) && |
+ notification.event.isolate == isolate; |
+ }); |
+ } |
+ } |
+ |
+ void deleteDisconnectEvents() { |
+ deleteWhere((notification) { |
+ return notification is M.EventNotification && |
+ notification.event is M.ConnectionClosedEvent; |
+ }); |
+ } |
+} |