From b5250028283cf8dc3a52ff439aea99de77ef5b77 Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Mon, 1 Jul 2024 11:59:22 +0200 Subject: [PATCH] fix(ui): `merge_stream_and_receiver` gives priority to `raw_stream`. This patch rewrites `merge_stream_and_receiver` to switch the order of `roominfo_update_recv` and `raw_stream`. The idea is to give the priority to `raw_stream` since it will necessarily trigger the room items recomputation. This patch also remove the `for` loop with `Iterator::enumerate`, to simply use `Iterator::position`: it's more compact and it removes a `break` (it makes the code simpler to understand). Finally, this patch renames `merged_stream` into `merged_streams`. --- .../src/room_list_service/room_list.rs | 41 +++++++++---------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/crates/matrix-sdk-ui/src/room_list_service/room_list.rs b/crates/matrix-sdk-ui/src/room_list_service/room_list.rs index 0a193c592..eb0845bfa 100644 --- a/crates/matrix-sdk-ui/src/room_list_service/room_list.rs +++ b/crates/matrix-sdk-ui/src/room_list_service/room_list.rs @@ -161,9 +161,9 @@ impl RoomList { let (raw_values, raw_stream) = self.entries(); // Combine normal stream events with other updates from rooms - let merged_stream = merge_stream_and_receiver(raw_values.clone(), raw_stream, roominfo_update_recv.resubscribe()); + let merged_streams = merge_stream_and_receiver(raw_values.clone(), raw_stream, roominfo_update_recv.resubscribe()); - let (values, stream) = (raw_values, merged_stream) + let (values, stream) = (raw_values, merged_streams) .filter(filter_fn) .sort_by(new_sorter_lexicographic(vec![ Box::new(new_sorter_recency()), @@ -195,7 +195,21 @@ fn merge_stream_and_receiver( loop { select! { - biased; // Prefer manual updates for easier test code + // We want to give priority on updates from `raw_stream` as it will necessarily trigger a “refresh” of the rooms. + biased; + + diffs = raw_stream.next() => { + if let Some(diffs) = diffs { + for diff in &diffs { + diff.clone().apply(&mut raw_current_values); + } + + yield diffs; + } else { + // Restart immediately, don't keep on waiting for the receiver + break; + } + } Ok(update) = roominfo_update_recv.recv() => { if !update.trigger_room_list_update { @@ -203,24 +217,9 @@ fn merge_stream_and_receiver( } // Search list for the updated room - for (index, room) in raw_current_values.iter().enumerate() { - if room.room_id() == update.room_id { - let update = VectorDiff::Set { index, value: raw_current_values[index].clone() }; - yield vec![update]; - break; - } - } - } - - v = raw_stream.next() => { - if let Some(v) = v { - for change in &v { - change.clone().apply(&mut raw_current_values); - } - yield v; - } else { - // Restart immediately, don't keep on waiting for the receiver - break; + if let Some(index) = raw_current_values.iter().position(|room| room.room_id() == update.room_id) { + let update = VectorDiff::Set { index, value: raw_current_values[index].clone() }; + yield vec![update]; } } }