object_rainbow/
monostate_headers.rs1use 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}