use crate::model::{ContextItem, ScoredItem};
use crate::placer::Placer;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub struct ChronologicalPlacer;
impl Placer for ChronologicalPlacer {
fn place(&self, items: &[ScoredItem]) -> Vec<ContextItem> {
if items.is_empty() {
return Vec::new();
}
if items.len() == 1 {
return vec![items[0].item.clone()];
}
let mut sortable: Vec<usize> = (0..items.len()).collect();
sortable.sort_by(|&a, &b| {
let a_ts = items[a].item.timestamp();
let b_ts = items[b].item.timestamp();
match (a_ts, b_ts) {
(Some(at), Some(bt)) => at.cmp(&bt).then_with(|| a.cmp(&b)),
(Some(_), None) => std::cmp::Ordering::Less,
(None, Some(_)) => std::cmp::Ordering::Greater,
(None, None) => a.cmp(&b),
}
});
sortable.iter().map(|&i| items[i].item.clone()).collect()
}
}