use crate::domain::DomainComponents;
use crate::error::RipGenError;
use fxhash::FxHashSet;
use std::slice::Iter as SliceIter;
use std::collections::hash_set::Iter as HashSetIter;
use crate::transform::RipGenTransform;
#[derive(Clone)]
pub struct RipGenManager<'domains> {
domain_components: Vec<DomainComponents<'domains>>,
elements: FxHashSet<&'domains str>,
}
impl<'domain> RipGenManager<'domain> {
pub fn new(
domains: impl Iterator<Item=&'domain str>,
words: impl Iterator<Item=&'domain str>,
word_filter: &impl Fn(&&str) -> bool
) -> Result<RipGenManager<'domain>, RipGenError>
{
let domain_components: Vec<DomainComponents> = domains
.filter(|line| !line.is_empty())
.map(DomainComponents::try_from)
.collect::<Result<_, _>>()?;
let elements: FxHashSet<&'domain str> = crate::words::extract_words(domain_components.iter(), word_filter)
.chain(words)
.collect();
let manager = RipGenManager {
domain_components,
elements
};
Ok(manager)
}
pub fn transform<'manager, F, O>(&'manager self, transform: F) -> RipGenTransform<'manager, 'domain, F, SliceIter<DomainComponents<'domain>>, HashSetIter<'manager, &'domain str>, O>
where
F: Fn(&'manager DomainComponents<'domain>, HashSetIter<'manager, &'domain str>) -> O,
O: Iterator<Item = String>,
'domain: 'manager
{
RipGenTransform::new(self.domain_components.iter(), self.elements.iter(), transform)
}
}