// run-pass pub trait Iter { type Item<'a> where Self: 'a; fn next<'a>(&'a mut self) -> Option>; fn for_each(mut self, mut f: F) where Self: Sized, F: for<'a> FnMut(Self::Item<'a>) { while let Some(item) = self.next() { f(item); } } } pub struct Windows { items: Vec, start: usize, len: usize, } impl Windows { pub fn new(items: Vec, len: usize) -> Self { Self { items, start: 0, len } } } impl Iter for Windows { type Item<'a> = &'a mut [T] where T: 'a; fn next<'a>(&'a mut self) -> Option> { let slice = self.items.get_mut(self.start..self.start + self.len)?; self.start += 1; Some(slice) } } fn main() { Windows::new(vec![1, 2, 3, 4, 5], 3) .for_each(|slice| println!("{:?}", slice)); }