1 | //! The module contains [`LimitColumns`] records iterator. |
2 | |
3 | use crate::grid::records::IntoRecords; |
4 | |
5 | /// An iterator which limits amount of columns. |
6 | #[derive (Debug)] |
7 | pub struct LimitColumns<I> { |
8 | records: I, |
9 | limit: usize, |
10 | } |
11 | |
12 | impl LimitColumns<()> { |
13 | /// Creates new [`LimitColumns`]. |
14 | pub fn new<I: IntoRecords>(records: I, limit: usize) -> LimitColumns<I> { |
15 | LimitColumns { records, limit } |
16 | } |
17 | } |
18 | |
19 | impl<I> IntoRecords for LimitColumns<I> |
20 | where |
21 | I: IntoRecords, |
22 | { |
23 | type Cell = I::Cell; |
24 | type IterColumns = LimitColumnsColumnsIter<<I::IterColumns as IntoIterator>::IntoIter>; |
25 | type IterRows = LimitColumnsIter<<I::IterRows as IntoIterator>::IntoIter>; |
26 | |
27 | fn iter_rows(self) -> Self::IterRows { |
28 | LimitColumnsIter { |
29 | iter: self.records.iter_rows().into_iter(), |
30 | limit: self.limit, |
31 | } |
32 | } |
33 | } |
34 | |
35 | /// An iterator over rows for [`LimitColumns`]. |
36 | #[derive (Debug)] |
37 | pub struct LimitColumnsIter<I> { |
38 | iter: I, |
39 | limit: usize, |
40 | } |
41 | |
42 | impl<I> Iterator for LimitColumnsIter<I> |
43 | where |
44 | I: Iterator, |
45 | I::Item: IntoIterator, |
46 | <I::Item as IntoIterator>::Item: AsRef<str>, |
47 | { |
48 | type Item = LimitColumnsColumnsIter<<I::Item as IntoIterator>::IntoIter>; |
49 | |
50 | fn next(&mut self) -> Option<Self::Item> { |
51 | let iter: ::Item = self.iter.next()?; |
52 | Some(LimitColumnsColumnsIter { |
53 | iter: iter.into_iter(), |
54 | limit: self.limit, |
55 | }) |
56 | } |
57 | } |
58 | |
59 | /// An iterator over columns for [`LimitColumns`]. |
60 | #[derive (Debug)] |
61 | pub struct LimitColumnsColumnsIter<I> { |
62 | iter: I, |
63 | limit: usize, |
64 | } |
65 | |
66 | impl<I> Iterator for LimitColumnsColumnsIter<I> |
67 | where |
68 | I: Iterator, |
69 | I::Item: AsRef<str>, |
70 | { |
71 | type Item = I::Item; |
72 | |
73 | fn next(&mut self) -> Option<Self::Item> { |
74 | if self.limit == 0 { |
75 | return None; |
76 | } |
77 | |
78 | self.limit -= 1; |
79 | |
80 | self.iter.next() |
81 | } |
82 | } |
83 | |