itermore/adaptors/
circular_array_windows.rs1use core::fmt;
2use core::fmt::Debug;
3use core::iter::{Cycle, FusedIterator};
4
5use crate::{ArrayWindows, IterArrayWindows};
6
7pub trait IterCircularArrayWindows: Iterator {
8 #[inline]
45 fn circular_array_windows<const N: usize>(self) -> CircularArrayWindows<Self, N>
46 where
47 Self: Sized + Clone + ExactSizeIterator,
48 Self::Item: Clone,
49 {
50 CircularArrayWindows::new(self)
51 }
52}
53
54impl<I: ?Sized> IterCircularArrayWindows for I where I: Iterator {}
55
56#[must_use = "iterators are lazy and do nothing unless consumed"]
65pub struct CircularArrayWindows<I, const N: usize>
66where
67 I: Iterator + Clone,
68{
69 iter: ArrayWindows<Cycle<I>, N>,
70 len: usize,
71}
72
73impl<I, const N: usize> CircularArrayWindows<I, N>
74where
75 I: ExactSizeIterator + Clone,
76 I::Item: Clone,
77{
78 fn new(iter: I) -> Self {
79 let len = iter.len();
80 let iter = iter.cycle().array_windows();
81 Self { iter, len }
82 }
83}
84
85impl<I, const N: usize> Debug for CircularArrayWindows<I, N>
86where
87 I: Iterator + Clone + Debug,
88 I::Item: Clone + Debug,
89{
90 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
91 f.debug_struct("CircularArrayWindows")
92 .field("iter", &self.iter)
93 .field("len", &self.len)
94 .finish()
95 }
96}
97
98impl<I, const N: usize> Clone for CircularArrayWindows<I, N>
99where
100 I: Iterator + Clone,
101 I::Item: Clone,
102{
103 fn clone(&self) -> Self {
104 Self {
105 iter: self.iter.clone(),
106 len: self.len,
107 }
108 }
109}
110
111impl<I, const N: usize> Iterator for CircularArrayWindows<I, N>
112where
113 I: Iterator + Clone,
114 I::Item: Clone,
115{
116 type Item = [I::Item; N];
117
118 #[inline]
119 fn next(&mut self) -> Option<Self::Item> {
120 if self.len != 0 {
121 self.len -= 1;
122 self.iter.next()
123 } else {
124 None
125 }
126 }
127
128 #[inline]
129 fn size_hint(&self) -> (usize, Option<usize>) {
130 (self.len, Some(self.len))
131 }
132
133 #[inline]
134 fn count(self) -> usize {
135 self.len
136 }
137}
138
139impl<I, const N: usize> ExactSizeIterator for CircularArrayWindows<I, N>
140where
141 I: ExactSizeIterator + Clone,
142 I::Item: Clone,
143{
144}
145
146impl<I, const N: usize> FusedIterator for CircularArrayWindows<I, N>
147where
148 I: ExactSizeIterator + Clone,
149 I::Item: Clone,
150{
151}