1use crate::domain::DomainComponents;
2use crate::error::RipGenError;
3use fxhash::FxHashSet;
4use std::slice::Iter as SliceIter;
5use std::collections::hash_set::Iter as HashSetIter;
6use crate::transform::RipGenTransform;
7
8#[derive(Clone)]
9pub struct RipGenManager<'domains> {
12 domain_components: Vec<DomainComponents<'domains>>,
13 elements: FxHashSet<&'domains str>,
14}
15
16impl<'domain> RipGenManager<'domain> {
17 pub fn new(
21 domains: impl Iterator<Item=&'domain str>,
22 words: impl Iterator<Item=&'domain str>,
23 word_filter: &impl Fn(&&str) -> bool
24 ) -> Result<RipGenManager<'domain>, RipGenError>
25 {
26 let domain_components: Vec<DomainComponents> = domains
27 .filter(|line| !line.is_empty())
28 .map(DomainComponents::try_from)
29 .collect::<Result<_, _>>()?;
30
31 let elements: FxHashSet<&'domain str> = crate::words::extract_words(domain_components.iter(), word_filter)
32 .chain(words)
33 .collect();
34
35 let manager = RipGenManager {
36 domain_components,
37 elements
38 };
39
40 Ok(manager)
41 }
42
43 pub fn transform<'manager, F, O>(&'manager self, transform: F) -> RipGenTransform<'manager, 'domain, F, SliceIter<DomainComponents<'domain>>, HashSetIter<'manager, &'domain str>, O>
48 where
49 F: Fn(&'manager DomainComponents<'domain>, HashSetIter<'manager, &'domain str>) -> O,
50 O: Iterator<Item = String>,
51 'domain: 'manager
52 {
53 RipGenTransform::new(self.domain_components.iter(), self.elements.iter(), transform)
54 }
55}