use std::collections::HashSet;
use unicase::UniCase;
#[derive(Clone)]
pub enum TaskDescriptionFilter<'a> {
CaseSensitive(HashSet<&'a str>),
CaseInsensitive(HashSet<UniCase<&'a str>>),
}
impl<'a> TaskDescriptionFilter<'a> {
pub fn new(name: impl Iterator<Item = &'a str>, case_insensitive: bool) -> Self {
if case_insensitive {
TaskDescriptionFilter::CaseInsensitive(name.map(UniCase::new).collect())
} else {
TaskDescriptionFilter::CaseSensitive(name.collect())
}
}
pub fn is_empty(&self) -> bool {
match self {
TaskDescriptionFilter::CaseSensitive(set) => set.is_empty(),
TaskDescriptionFilter::CaseInsensitive(set) => set.is_empty(),
}
}
pub fn remove(&mut self, word: &'a str) -> bool {
match self {
TaskDescriptionFilter::CaseSensitive(set) => set.remove(word),
TaskDescriptionFilter::CaseInsensitive(set) => set.remove(&UniCase::new(word)),
}
}
pub fn terms(&'a self) -> Box<dyn 'a + Iterator<Item = &'a str>> {
match self {
TaskDescriptionFilter::CaseSensitive(set) => Box::new(set.iter().copied()),
TaskDescriptionFilter::CaseInsensitive(set) => Box::new(set.iter().map(AsRef::as_ref)),
}
}
}