bidivec/bidiiter/immutable_xy/
border.rs

1use crate::bidiiter::borderstate::IterBorderState;
2use crate::BidiRect;
3use crate::BidiRectSigned;
4use crate::BidiView;
5use std::iter::Iterator;
6
7/// An iterator type returning items in a rectangular region.
8pub struct OnBorder<'v, T: 'v, V: BidiView<Output = T>> {
9    pub(crate) view: &'v V,
10    pub(crate) rect: BidiRect,
11    pub(crate) state: IterBorderState,
12    pub(crate) border: BidiRectSigned,
13}
14
15impl<'v, T: 'v, V: BidiView<Output = T>> Iterator for OnBorder<'v, T, V> {
16    type Item = (usize, usize, &'v T);
17
18    fn next(&mut self) -> Option<<Self as Iterator>::Item> {
19        self.state.advance(&self.rect, &self.border);
20
21        if let IterBorderState::Iterating(x, y) = self.state {
22            self.view
23                .get_signed(x, y)
24                .map(|v| (x as usize, y as usize, v))
25        } else {
26            None
27        }
28    }
29}