1use crate::Line;
5
6type Inner<'b> = std::iter::Map<
9 std::slice::Iter<'b, Line>, for<'a> fn(&'a Line) -> &'a str
10>;
11type TaggedInner<'b> = std::iter::Map<
12 std::slice::Iter<'b, Line>, for<'a> fn(&'a Line) -> (char, &'a str)
13>;
14
15pub struct LinesIter<'a> {
20 inner: LinesIterInner<'a>,
23}
24enum LinesIterInner<'a> {
26 Real(Inner<'a>),
27 #[cfg(any(fuzzing, test))]
28 Test(Box<dyn Iterator<Item = &'a str>>),
29}
30
31impl<'a> Iterator for LinesIter<'a> {
32 type Item = &'a str;
33
34 fn next(&mut self) -> Option<Self::Item> {
35 match &mut self.inner {
36 LinesIterInner::Real(x) => x.next(),
37 #[cfg(any(fuzzing, test))]
38 LinesIterInner::Test(x) => x.next(),
39 }
40 }
41}
42
43impl<'a> From<Inner<'a>> for LinesIter<'a> {
44 fn from(i: Inner<'a>) -> Self {
45 Self{ inner: LinesIterInner::Real(i) }
46 }
47}
48
49#[cfg(any(fuzzing, test))]
50impl<'a, I: Iterator<Item=&'a str> + 'static> From<Box<I>> for LinesIter<'a> {
51 fn from(i: Box<I>) -> Self {
52 Self{ inner: LinesIterInner::Test(i) }
53 }
54}
55pub struct TaggedLinesIter<'a> {
60 inner: TaggedInner<'a>,
61}
62
63impl<'a> Iterator for TaggedLinesIter<'a> {
64 type Item = (char, &'a str);
65
66 fn next(&mut self) -> Option<Self::Item> {
67 self.inner.next()
68 }
69}
70
71impl<'a> From<TaggedInner<'a>> for TaggedLinesIter<'a> {
72 fn from(i: TaggedInner<'a>) -> Self {
73 Self{ inner: i }
74 }
75}