Skip to main content

object_rainbow/
monostate_headers.rs

1use crate::*;
2
3#[derive(Debug, Default, Clone)]
4pub struct MonostateHeaders<T, M = ()> {
5    pub inner: T,
6    monostate: M,
7}
8
9impl<T, M> Deref for MonostateHeaders<T, M> {
10    type Target = T;
11
12    fn deref(&self) -> &Self::Target {
13        &self.inner
14    }
15}
16
17impl<T, M> DerefMut for MonostateHeaders<T, M> {
18    fn deref_mut(&mut self) -> &mut Self::Target {
19        &mut self.inner
20    }
21}
22
23pub struct Iter<I, M> {
24    inner: I,
25    monostate: M,
26}
27
28impl<I: Iterator, M: Monostate> Iterator for Iter<I, M> {
29    type Item = (M, I::Item);
30
31    fn next(&mut self) -> Option<Self::Item> {
32        self.inner.next().map(|item| (self.monostate, item))
33    }
34}
35
36impl<T: IntoIterator, M: Monostate> IntoIterator for MonostateHeaders<T, M> {
37    type Item = (M, T::Item);
38    type IntoIter = Iter<T::IntoIter, M>;
39
40    fn into_iter(self) -> Self::IntoIter {
41        Iter {
42            inner: self.inner.into_iter(),
43            monostate: self.monostate,
44        }
45    }
46}
47
48impl<T: FromIterator<A>, M: Monostate, A> FromIterator<(M, A)> for MonostateHeaders<T, M> {
49    fn from_iter<I: IntoIterator<Item = (M, A)>>(iter: I) -> Self {
50        Self {
51            inner: iter.into_iter().map(|(_, item)| item).collect(),
52            monostate: Default::default(),
53        }
54    }
55}
56
57impl<'a, T, M: Monostate> IntoIterator for &'a MonostateHeaders<T, M>
58where
59    &'a T: IntoIterator,
60{
61    type Item = (M, <&'a T as IntoIterator>::Item);
62
63    type IntoIter = Iter<<&'a T as IntoIterator>::IntoIter, M>;
64
65    fn into_iter(self) -> Self::IntoIter {
66        Iter {
67            inner: self.inner.into_iter(),
68            monostate: self.monostate,
69        }
70    }
71}
72
73impl<'a, T, M: Monostate> IntoIterator for &'a mut MonostateHeaders<T, M>
74where
75    &'a mut T: IntoIterator,
76{
77    type Item = (M, <&'a mut T as IntoIterator>::Item);
78
79    type IntoIter = Iter<<&'a mut T as IntoIterator>::IntoIter, M>;
80
81    fn into_iter(self) -> Self::IntoIter {
82        Iter {
83            inner: self.inner.into_iter(),
84            monostate: self.monostate,
85        }
86    }
87}