From 600b90159a90ed9246103cb4e850bcb4cc218760 Mon Sep 17 00:00:00 2001 From: Mike Dilger Date: Fri, 23 Dec 2022 14:31:16 +1300 Subject: [PATCH] Feed computation now threaded (will respect setting soon) --- src/globals.rs | 68 +++++++++++++++++++++++++++++--------------------- src/ui/feed.rs | 2 +- 2 files changed, 41 insertions(+), 29 deletions(-) diff --git a/src/globals.rs b/src/globals.rs index 2dd9bc01..2c07f218 100644 --- a/src/globals.rs +++ b/src/globals.rs @@ -65,56 +65,68 @@ lazy_static! { } #[allow(dead_code)] -pub async fn get_feed() -> Vec { +pub async fn get_feed(threaded: bool) -> Vec { let feed: Vec = GLOBALS .feed_events .lock() .await .iter() .map(|(_, e)| e) - .filter(|e| e.feed_related) // feed related - //.filter(|e| e.in_reply_to.is_none()) // only root events + .filter(|e| e.event.is_some() && e.event.as_ref().unwrap().kind == EventKind::TextNote) + .filter(|e| { + if threaded { + e.in_reply_to.is_none() + } else { + true + } + }) // only root events .cloned() .collect(); - sort_feed(feed) + sort_feed(feed, threaded) } #[allow(dead_code)] -pub fn blocking_get_feed() -> Vec { +pub fn blocking_get_feed(threaded: bool) -> Vec { let feed: Vec = GLOBALS .feed_events .blocking_lock() .iter() .map(|(_, e)| e) - .filter(|e| e.feed_related) // feed related - //.filter(|e| e.in_reply_to.is_none()) // only root events + .filter(|e| e.event.is_some() && e.event.as_ref().unwrap().kind == EventKind::TextNote) + .filter(|e| { + if threaded { + e.in_reply_to.is_none() + } else { + true + } + }) // only root events .cloned() .collect(); - sort_feed(feed) + sort_feed(feed, threaded) } -fn sort_feed(mut feed: Vec) -> Vec { - // Threaded, TBD: - // feed.sort_unstable_by(|a, b| a.last_reply_at.cmp(&b.last_reply_at)); - - // Linear sort neweset first: - feed.sort_unstable_by(|a, b| { - if a.event.is_some() && b.event.is_some() { - b.event - .as_ref() - .unwrap() - .created_at - .cmp(&a.event.as_ref().unwrap().created_at) - } else if a.event.is_some() { - std::cmp::Ordering::Greater - } else if b.event.is_some() { - std::cmp::Ordering::Less - } else { - std::cmp::Ordering::Equal - } - }); +fn sort_feed(mut feed: Vec, threaded: bool) -> Vec { + if threaded { + feed.sort_unstable_by(|a, b| b.last_reply_at.cmp(&a.last_reply_at)); + } else { + feed.sort_unstable_by(|a, b| { + if a.event.is_some() && b.event.is_some() { + b.event + .as_ref() + .unwrap() + .created_at + .cmp(&a.event.as_ref().unwrap().created_at) + } else if a.event.is_some() { + std::cmp::Ordering::Greater + } else if b.event.is_some() { + std::cmp::Ordering::Less + } else { + std::cmp::Ordering::Equal + } + }); + } feed.iter().map(|e| e.id).collect() } diff --git a/src/ui/feed.rs b/src/ui/feed.rs index 27b615b0..88f238ea 100644 --- a/src/ui/feed.rs +++ b/src/ui/feed.rs @@ -5,7 +5,7 @@ use nostr_proto::PublicKey; use tracing::info; pub(super) fn update(app: &mut GossipUi, _ctx: &Context, _frame: &mut eframe::Frame, ui: &mut Ui) { - let feed = crate::globals::blocking_get_feed(); + let feed = crate::globals::blocking_get_feed(true); //let screen_rect = ctx.input().screen_rect; // Rect