linq 0.0.1-release

Language Integrated Query in Rust.
Documentation
pub type ConcateIterator<I, IT> = std::iter::Chain<I, IT>;

pub fn concate<I: Iterator, U>(
    iter: I,
    other: U,
) -> ConcateIterator<I, <U as IntoIterator>::IntoIter>
where
    U: IntoIterator<Item = I::Item>,
{
    iter.chain(other)
}

pub type WhereIterator<I, P> = std::iter::Filter<I, P>;

pub fn where_by<I: Iterator, P>(iter: I, predicate: P) -> WhereIterator<I, P>
where
    I: Sized,
    P: FnMut(&I::Item) -> bool,
{
    iter.filter(predicate)
}

pub type SelectIterator<I, F> = std::iter::Map<I, F>;

pub fn select<I: Iterator, B, F>(iter: I, f: F) -> SelectIterator<I, F>
where
    F: FnMut(I::Item) -> B,
{
    iter.map(f)
}

pub fn first<I: Iterator>(mut iter: I) -> Option<I::Item> {
    iter.next()
}

pub fn element_at<I: Iterator>(mut iter: I, index: usize) -> Option<I::Item> {
    iter.nth(index)
}

pub type ReverseIterator<I> = std::iter::Rev<I>;

pub fn reverse<I: DoubleEndedIterator>(iter: I) -> ReverseIterator<I> {
    iter.rev()
}

pub fn aggregate<I: Iterator, B, F>(iter: I, init: B, f: F) -> B
where
    F: FnMut(B, I::Item) -> B,
{
    iter.fold(init, f)
}