linq 0.0.1-release

Language Integrated Query in Rust.
Documentation
#[derive(Clone)]
pub struct SelectManyIterator<I: Iterator, T, FC, FR> {
    iter: I,
    ci: Option<I::Item>,
    citer: Option<T>,
    fc: FC,
    fr: FR,
}

impl<I: Iterator, T: Iterator, FC, FR, R> Iterator for SelectManyIterator<I, T, FC, FR>
where
    I::Item: Clone,
    FC: FnMut(I::Item) -> T,
    FR: FnMut(I::Item, T::Item) -> R,
{
    type Item = R;

    fn next(&mut self) -> Option<Self::Item> {
        if let Some(cit) = &mut self.citer {
            for x in cit {
                return Some((self.fr)(self.ci.as_ref().unwrap().clone(), x));
            }
        }
        loop {
            let ci = self.iter.next();
            if ci.is_none() {
                break;
            }
            self.ci = Some(ci.as_ref().unwrap().clone());
            self.citer = Some((self.fc)(ci.unwrap()));
            if let Some(cit) = &mut self.citer {
                for x in cit {
                    return Some((self.fr)(self.ci.as_ref().unwrap().clone(), x));
                }
            }
        }
        None
    }
}

pub fn select_many<I: Iterator, T: Iterator, FC, FR, R>(
    iter: I,
    fc: FC,
    fr: FR,
) -> SelectManyIterator<I, T, FC, FR>
where
    I::Item: Clone,
    FC: FnMut(I::Item) -> T,
    FR: FnMut(I::Item, T::Item) -> R,
{
    SelectManyIterator {
        iter,
        ci: None,
        citer: None,
        fc,
        fr,
    }
}

pub struct SelectManySingleIterator<I, T, F> {
    iter: I,
    citer: Option<T>,
    func: F,
}

impl<I: Iterator, T: Iterator, F> Iterator for SelectManySingleIterator<I, T, F>
where
    F: FnMut(I::Item) -> T,
{
    type Item = T::Item;

    fn next(&mut self) -> Option<Self::Item> {
        if let Some(cit) = &mut self.citer {
            for x in cit {
                return Some(x);
            }
        }
        for tit in &mut self.iter {
            self.citer = Some((self.func)(tit));
            if let Some(cit) = &mut self.citer {
                for x in cit {
                    return Some(x);
                }
            }
        }
        None
    }
}

pub fn select_many_single<I: Iterator, T: Iterator, F>(
    iter: I,
    func: F,
) -> SelectManySingleIterator<I, T, F>
where
    F: FnMut(I::Item) -> T,
{
    SelectManySingleIterator {
        iter,
        citer: None,
        func,
    }
}