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
use std::cell::Ref;

pub struct RefIter<'a, T> {
    inner: Option<Ref<'a, [T]>>,
}

impl<'a, T> RefIter<'a, T> {
    pub fn new(inner: Ref<'a, [T]>) -> Self {
        Self { inner: Some(inner) }
    }
}

impl<'a, T> Iterator for RefIter<'a, T> {
    type Item = Ref<'a, T>;

    fn next(&mut self) -> Option<Self::Item> {
        match self.inner.take() {
            Some(borrow) => match *borrow {
                [] => None,
                [_, ..] => {
                    let (head, tail) = Ref::map_split(borrow, |slice| (&slice[0], &slice[1..]));
                    self.inner.replace(tail);
                    Some(head)
                }
            },
            None => None,
        }
    }
}