use std::collections::{BTreeSet, HashMap};
use crate::database::iter::Iter;
use crate::model::{Series, SeriesId};
#[derive(Default)]
pub(crate) struct Database {
data: HashMap<SeriesId, Series>,
by_name: BTreeSet<(String, SeriesId)>,
}
impl Database {
pub(crate) fn get(&self, id: &SeriesId) -> Option<&Series> {
self.data.get(id)
}
pub(crate) fn get_mut(&mut self, id: &SeriesId) -> Option<&mut Series> {
self.data.get_mut(id)
}
pub(crate) fn remove(&mut self, id: &SeriesId) -> Option<Series> {
let series = self.data.remove(id)?;
let _ = self.by_name.remove(&(series.title.clone(), series.id));
Some(series)
}
pub(crate) fn insert(&mut self, series: Series) {
self.by_name.insert((series.title.clone(), series.id));
self.data.insert(series.id, series);
}
pub(crate) fn iter(&self) -> impl ExactSizeIterator<Item = &Series> {
self.data.iter().map(|(_, series)| series)
}
pub(crate) fn iter_by_name(&self) -> impl DoubleEndedIterator<Item = &Series> {
Iter::new(self.by_name.iter().map(|(_, key)| key), &self.data)
}
pub(crate) fn iter_mut(&mut self) -> impl ExactSizeIterator<Item = &mut Series> {
self.data.iter_mut().map(|data| data.1)
}
pub(crate) fn export(&self) -> impl IntoIterator<Item = Series> + 'static {
let mut out = Vec::with_capacity(self.by_name.len());
for (_, id) in &self.by_name {
if let Some(series) = self.data.get(id) {
out.push(series.clone());
}
}
out
}
}