Feed computation now threaded (will respect setting soon)

This commit is contained in:
Mike Dilger 2022-12-23 14:31:16 +13:00
parent d8567da83a
commit 600b90159a
2 changed files with 41 additions and 29 deletions

View File

@ -65,56 +65,68 @@ lazy_static! {
} }
#[allow(dead_code)] #[allow(dead_code)]
pub async fn get_feed() -> Vec<Id> { pub async fn get_feed(threaded: bool) -> Vec<Id> {
let feed: Vec<FeedEvent> = GLOBALS let feed: Vec<FeedEvent> = GLOBALS
.feed_events .feed_events
.lock() .lock()
.await .await
.iter() .iter()
.map(|(_, e)| e) .map(|(_, e)| e)
.filter(|e| e.feed_related) // feed related .filter(|e| e.event.is_some() && e.event.as_ref().unwrap().kind == EventKind::TextNote)
//.filter(|e| e.in_reply_to.is_none()) // only root events .filter(|e| {
if threaded {
e.in_reply_to.is_none()
} else {
true
}
}) // only root events
.cloned() .cloned()
.collect(); .collect();
sort_feed(feed) sort_feed(feed, threaded)
} }
#[allow(dead_code)] #[allow(dead_code)]
pub fn blocking_get_feed() -> Vec<Id> { pub fn blocking_get_feed(threaded: bool) -> Vec<Id> {
let feed: Vec<FeedEvent> = GLOBALS let feed: Vec<FeedEvent> = GLOBALS
.feed_events .feed_events
.blocking_lock() .blocking_lock()
.iter() .iter()
.map(|(_, e)| e) .map(|(_, e)| e)
.filter(|e| e.feed_related) // feed related .filter(|e| e.event.is_some() && e.event.as_ref().unwrap().kind == EventKind::TextNote)
//.filter(|e| e.in_reply_to.is_none()) // only root events .filter(|e| {
if threaded {
e.in_reply_to.is_none()
} else {
true
}
}) // only root events
.cloned() .cloned()
.collect(); .collect();
sort_feed(feed) sort_feed(feed, threaded)
} }
fn sort_feed(mut feed: Vec<FeedEvent>) -> Vec<Id> { fn sort_feed(mut feed: Vec<FeedEvent>, threaded: bool) -> Vec<Id> {
// Threaded, TBD: if threaded {
// feed.sort_unstable_by(|a, b| a.last_reply_at.cmp(&b.last_reply_at)); feed.sort_unstable_by(|a, b| b.last_reply_at.cmp(&a.last_reply_at));
} else {
// Linear sort neweset first: feed.sort_unstable_by(|a, b| {
feed.sort_unstable_by(|a, b| { if a.event.is_some() && b.event.is_some() {
if a.event.is_some() && b.event.is_some() { b.event
b.event .as_ref()
.as_ref() .unwrap()
.unwrap() .created_at
.created_at .cmp(&a.event.as_ref().unwrap().created_at)
.cmp(&a.event.as_ref().unwrap().created_at) } else if a.event.is_some() {
} else if a.event.is_some() { std::cmp::Ordering::Greater
std::cmp::Ordering::Greater } else if b.event.is_some() {
} else if b.event.is_some() { std::cmp::Ordering::Less
std::cmp::Ordering::Less } else {
} else { std::cmp::Ordering::Equal
std::cmp::Ordering::Equal }
} });
}); }
feed.iter().map(|e| e.id).collect() feed.iter().map(|e| e.id).collect()
} }

View File

@ -5,7 +5,7 @@ use nostr_proto::PublicKey;
use tracing::info; use tracing::info;
pub(super) fn update(app: &mut GossipUi, _ctx: &Context, _frame: &mut eframe::Frame, ui: &mut Ui) { 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 //let screen_rect = ctx.input().screen_rect; // Rect