mirror of https://github.com/rust-lang/rust
43 lines
885 B
Rust
43 lines
885 B
Rust
//@ run-pass
|
|
|
|
pub trait Iter {
|
|
type Item<'a> where Self: 'a;
|
|
|
|
fn next<'a>(&'a mut self) -> Option<Self::Item<'a>>;
|
|
|
|
fn for_each<F>(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<T> {
|
|
items: Vec<T>,
|
|
start: usize,
|
|
len: usize,
|
|
}
|
|
|
|
impl<T> Windows<T> {
|
|
pub fn new(items: Vec<T>, len: usize) -> Self {
|
|
Self { items, start: 0, len }
|
|
}
|
|
}
|
|
|
|
impl<T> Iter for Windows<T> {
|
|
type Item<'a> = &'a mut [T] where T: 'a;
|
|
|
|
fn next<'a>(&'a mut self) -> Option<Self::Item<'a>> {
|
|
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));
|
|
}
|