bidivec/bidiiter/immutable_xy/
border.rs1use crate::bidiiter::borderstate::IterBorderState;
2use crate::BidiRect;
3use crate::BidiRectSigned;
4use crate::BidiView;
5use std::iter::Iterator;
6
7pub 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}