hir_ty/diagnostics/match_check/
pat_util.rs1use std::iter::Enumerate;
6
7pub(crate) struct EnumerateAndAdjust<I> {
8 enumerate: Enumerate<I>,
9 gap_pos: usize,
10 gap_len: usize,
11}
12
13impl<I> Iterator for EnumerateAndAdjust<I>
14where
15 I: Iterator,
16{
17 type Item = (usize, <I as Iterator>::Item);
18
19 fn next(&mut self) -> Option<(usize, <I as Iterator>::Item)> {
20 self.enumerate
21 .next()
22 .map(|(i, elem)| (if i < self.gap_pos { i } else { i + self.gap_len }, elem))
23 }
24
25 fn size_hint(&self) -> (usize, Option<usize>) {
26 self.enumerate.size_hint()
27 }
28}
29
30pub(crate) trait EnumerateAndAdjustIterator {
31 fn enumerate_and_adjust(
32 self,
33 expected_len: usize,
34 gap_pos: Option<usize>,
35 ) -> EnumerateAndAdjust<Self>
36 where
37 Self: Sized;
38}
39
40impl<T: ExactSizeIterator> EnumerateAndAdjustIterator for T {
41 fn enumerate_and_adjust(
42 self,
43 expected_len: usize,
44 gap_pos: Option<usize>,
45 ) -> EnumerateAndAdjust<Self>
46 where
47 Self: Sized,
48 {
49 let actual_len = self.len();
50 EnumerateAndAdjust {
51 enumerate: self.enumerate(),
52 gap_pos: gap_pos.unwrap_or(expected_len),
53 gap_len: expected_len - actual_len,
54 }
55 }
56}