Support undated entries in EntryMap

This commit is contained in:
Joscha 2021-11-24 01:24:14 +01:00
parent 35184e21e9
commit 8034ec19cd
2 changed files with 18 additions and 7 deletions

View file

@ -55,10 +55,11 @@ impl Eval {
source: self.source, source: self.source,
date: EntryDate::Date { root: date }, date: EntryDate::Date { root: date },
}; };
self.map.insert(date, entry); self.map.insert(entry);
} else { } else {
assert_eq!(when.date.month(), 2); assert_eq!(when.date.month(), 2);
assert_eq!(when.date.day(), 29); assert_eq!(when.date.day(), 29);
let date = NaiveDate::from_ymd(year, 2, 28); let date = NaiveDate::from_ymd(year, 2, 28);
let entry = Entry { let entry = Entry {
kind: EntryKind::Birthday, kind: EntryKind::Birthday,
@ -67,7 +68,7 @@ impl Eval {
source: self.source, source: self.source,
date: EntryDate::Date { root: date }, date: EntryDate::Date { root: date },
}; };
self.map.insert(date, entry); self.map.insert(entry);
let date = NaiveDate::from_ymd(year, 3, 1); let date = NaiveDate::from_ymd(year, 3, 1);
let entry = Entry { let entry = Entry {
@ -77,7 +78,7 @@ impl Eval {
source: self.source, source: self.source,
date: EntryDate::Date { root: date }, date: EntryDate::Date { root: date },
}; };
self.map.insert(date, entry); self.map.insert(entry);
} }
} }
} }

View file

@ -62,6 +62,7 @@ pub struct Entry {
pub struct EntryMap { pub struct EntryMap {
range: DateRange, range: DateRange,
map: HashMap<NaiveDate, Option<Entry>>, map: HashMap<NaiveDate, Option<Entry>>,
undated: Vec<Entry>,
} }
impl EntryMap { impl EntryMap {
@ -69,6 +70,7 @@ impl EntryMap {
Self { Self {
range, range,
map: HashMap::new(), map: HashMap::new(),
undated: vec![],
} }
} }
@ -82,13 +84,21 @@ impl EntryMap {
} }
} }
pub fn insert(&mut self, date: NaiveDate, entry: Entry) { pub fn insert(&mut self, entry: Entry) {
if self.range.contains(date) { if let Some(date) = entry.date.root() {
self.map.entry(date).or_insert(Some(entry)); if self.range.contains(date) {
self.map.entry(date).or_insert(Some(entry));
}
} else {
self.undated.push(entry);
} }
} }
pub fn drain(&mut self) -> Vec<Entry> { pub fn drain(&mut self) -> Vec<Entry> {
self.map.drain().filter_map(|(_, entry)| entry).collect() self.map
.drain()
.filter_map(|(_, entry)| entry)
.chain(self.undated.drain(..))
.collect()
} }
} }