1pub trait Map<O, E>: Sized {
9 fn map_ok<F, O2>(self, _: F) -> MapOk<Self, F>
28 where
29 F: FnMut(O) -> O2;
30
31 fn map_err<F, E2>(self, _: F) -> MapErr<Self, F>
54 where
55 F: FnMut(E) -> E2;
56}
57
58impl<I, O, E> Map<O, E> for I
59where
60 I: Iterator<Item = Result<O, E>> + Sized,
61{
62 #[inline]
63 fn map_ok<F, O2>(self, f: F) -> MapOk<Self, F>
64 where
65 F: FnMut(O) -> O2,
66 {
67 MapOk { iter: self, f }
68 }
69
70 #[inline]
71 fn map_err<F, E2>(self, f: F) -> MapErr<Self, F>
72 where
73 F: FnMut(E) -> E2,
74 {
75 MapErr { iter: self, f }
76 }
77}
78
79#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
80pub struct MapOk<I, F> {
81 iter: I,
82 f: F,
83}
84
85impl<I, O, E, F, O2> Iterator for MapOk<I, F>
86where
87 I: Iterator<Item = Result<O, E>>,
88 F: FnMut(O) -> O2,
89{
90 type Item = Result<O2, E>;
91
92 fn next(&mut self) -> Option<Self::Item> {
93 self.iter.next().map(|r| r.map(&mut self.f))
94 }
95
96 #[inline]
97 fn size_hint(&self) -> (usize, Option<usize>) {
98 self.iter.size_hint()
99 }
100}
101
102#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
103pub struct MapErr<I, F> {
104 iter: I,
105 f: F,
106}
107
108impl<I, O, E, F, E2> Iterator for MapErr<I, F>
109where
110 I: Iterator<Item = Result<O, E>>,
111 F: FnMut(E) -> E2,
112{
113 type Item = Result<O, E2>;
114
115 fn next(&mut self) -> Option<Self::Item> {
116 self.iter.next().map(|r| r.map_err(&mut self.f))
117 }
118
119 #[inline]
120 fn size_hint(&self) -> (usize, Option<usize>) {
121 self.iter.size_hint()
122 }
123}
124
125#[cfg(test)]
126mod tests {
127 use super::*;
128
129 #[test]
130 fn test_map_ok_hint() {
131 use std::str::FromStr;
132
133 let hint = ["1", "2", "a", "4", "5"]
134 .iter()
135 .map(|txt| usize::from_str(txt))
136 .map_ok(|i| 2 * i)
137 .size_hint();
138
139 assert_eq!(hint, (5, Some(5)));
140 }
141
142 #[test]
143 fn test_map_err_hint() {
144 use std::str::FromStr;
145
146 let hint = ["1", "2", "a", "4", "5"]
147 .iter()
148 .map(|txt| usize::from_str(txt))
149 .map_err(|e| format!("{:?}", e))
150 .size_hint();
151
152 assert_eq!(hint, (5, Some(5)));
153 }
154}