1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
pub trait PaginatableIterator: Sized { fn paginate(self, page: usize) -> Paginate<Self>; } impl<T, U : Iterator<Item = T>> PaginatableIterator for U { fn paginate(self, page: usize) -> Paginate<U> { Paginate { iter: self, page: page, } } } pub struct Paginate<I> { iter: I, page: usize, } impl<E, I : Iterator<Item = E>> Iterator for Paginate<I> { type Item = Vec<E>; fn next(&mut self) -> Option<Vec<E>> { let mut r = Vec::new(); for _ in 0..self.page { match self.iter.next() { Some(next) => r.push(next), None if r.is_empty() => return None, None => return Some(r), } } Some(r) } }