obrewin_utils/
wrapped_iterator.rs

1/// Iterator struct wrapper for general purposes.
2/// This struct is used when you want specific trait to be object safe,
3/// but want to return an iterator in that trait's method.
4pub struct WrappedIterator<'it, Item> {
5    prev_iterator: Box<dyn Iterator<Item = Item> + 'it>,
6}
7
8impl<'it, Item> WrappedIterator<'it, Item> {
9    /// Create new instance of wrapped iterator.
10    pub fn new<T>(prev_iterator: T) -> Self
11    where
12        T: Iterator<Item = Item> + 'it,
13    {
14        Self {
15            prev_iterator: Box::new(prev_iterator),
16        }
17    }
18}
19
20impl<'it, Item> Iterator for WrappedIterator<'it, Item> {
21    type Item = Item;
22
23    fn next(&mut self) -> Option<Self::Item> {
24        self.prev_iterator.next()
25    }
26}
27
28/// Convenient trait to wrap iterators.
29pub trait WrapIterator<'s, Item> {
30    /// Wrap current struct into wrapped iterator.
31    fn wrap_iter(self) -> WrappedIterator<'s, Item>;
32}
33
34impl<'s, Item, It> WrapIterator<'s, Item> for It
35where
36    It: IntoIterator<Item = Item> + 's,
37{
38    fn wrap_iter(self) -> WrappedIterator<'s, Item> {
39        WrappedIterator::new(self.into_iter())
40    }
41}