use std::{iter, rc::Rc};
use super::{calendar_collection::CalendarCollection, event::Event};
type AgendaPageId = isize;
type EventSlice<'a> = Vec<Rc<Event>>;
pub type AgendaSlice<'a> = &'a [Option<(&'a AgendaPageId, &'a EventSlice<'a>)>];
pub(crate) struct Agenda {
events: Vec<(Vec<Rc<Event>>, isize)>,
}
impl Agenda {
pub(crate) fn new(calendar_collection: &CalendarCollection) -> Self {
let (mut past_events, mut future_events): (Vec<_>, Vec<_>) = calendar_collection
.events()
.cloned()
.partition(|e| e.start().date_naive() < calendar_collection.today_date());
past_events.sort_by_key(|e| e.start());
let mut past_events: Vec<_> = past_events
.rchunks(calendar_collection.config.agenda_events_per_page)
.map(|e| e.to_owned())
.zip((1_isize..).map(|i| -i))
.collect();
past_events.reverse();
future_events.sort_by_key(|e| e.start());
let future_events_iter = future_events
.chunks(calendar_collection.config.agenda_events_per_page)
.map(|e| e.to_owned())
.zip(0..);
past_events.extend(future_events_iter);
let events = past_events
.into_iter()
.collect::<Vec<(Vec<Rc<Event>>, AgendaPageId)>>();
Agenda { events }
}
pub(crate) fn pages(&self) -> Vec<Option<(&isize, &EventSlice)>> {
let chained_iter = iter::once(None)
.chain(
self.events
.iter()
.map(|(events, page)| Some((page, events))),
)
.chain(iter::once(None));
chained_iter.collect()
}
}