Skip to content

Commit 882d401

Browse files
committed
unreads [nfc]: Enhance performance in _removeAllInStreams
1 parent 8b15e2b commit 882d401

File tree

1 file changed

+11
-22
lines changed

1 file changed

+11
-22
lines changed

lib/model/unreads.dart

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ class Unreads extends ChangeNotifier {
353353
} else {
354354
final messageIdsSet = Set.of(event.messages);
355355
mentions.removeAll(messageIdsSet);
356-
_slowRemoveAllInStreams(messageIdsSet);
356+
_removeAllInStreams(messageIdsSet);
357357
_slowRemoveAllInDms(messageIdsSet);
358358
}
359359
case UpdateMessageFlagsRemoveEvent():
@@ -456,29 +456,18 @@ class Unreads extends ChangeNotifier {
456456
messageIds.map((messageId) => MapEntry(messageId, messageInfo)));
457457
}
458458

459-
// TODO use efficient model lookups
460-
void _slowRemoveAllInStreams(Set<int> idsToRemove) {
461-
final newlyEmptyStreams = <int>[];
462-
for (final MapEntry(key: streamId, value: topics) in streams.entries) {
463-
final newlyEmptyTopics = <String>[];
464-
for (final MapEntry(key: topic, value: messageIds) in topics.entries) {
465-
messageIds.removeWhere((id) => idsToRemove.contains(id));
466-
if (messageIds.isEmpty) {
467-
newlyEmptyTopics.add(topic);
459+
void _removeAllInStreams(Set<int> idsToRemove) {
460+
for (var messageId in idsToRemove) {
461+
final info = _reverseStreamsLookup.remove(messageId);
462+
if (info != null && streams[info.streamId]?[info.topic] != null) {
463+
streams[info.streamId]![info.topic]!.remove(messageId);
464+
if (streams[info.streamId]![info.topic]!.isEmpty) {
465+
streams[info.streamId]!.remove(info.topic);
466+
}
467+
if (streams[info.streamId]!.isEmpty) {
468+
streams.remove(info.streamId);
468469
}
469470
}
470-
for (final topic in newlyEmptyTopics) {
471-
topics.remove(topic);
472-
}
473-
if (topics.isEmpty) {
474-
newlyEmptyStreams.add(streamId);
475-
}
476-
}
477-
for (final streamId in newlyEmptyStreams) {
478-
streams.remove(streamId);
479-
}
480-
for (var messageId in idsToRemove) {
481-
_reverseStreamsLookup.remove(messageId);
482471
}
483472
}
484473

0 commit comments

Comments
 (0)