| // 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 && |
| notification.event is M.PauseEvent; |
| }); |
| } else { |
| deleteWhere((notification) { |
| if (notification is M.EventNotification) { |
| var event = notification.event; |
| if (event is M.PauseEvent) { |
| return event.isolate == isolate; |
| } |
| } |
| return false; |
| }); |
| } |
| } |
| |
| void deleteDisconnectEvents() { |
| deleteWhere((notification) { |
| return notification is M.EventNotification && |
| notification.event is M.ConnectionClosedEvent; |
| }); |
| } |
| } |