Skip to content

Commit ad41345

Browse files
committed
Make ChunkBy compatible with MSRV
1 parent e60b57e commit ad41345

File tree

1 file changed

+37
-4
lines changed

1 file changed

+37
-4
lines changed

src/slice/chunk_by.rs

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,15 @@ use crate::iter::plumbing::*;
22
use crate::iter::*;
33
use std::fmt;
44

5+
fn find_first_index<T, P>(xs: &[T], pred: &P) -> Option<usize>
6+
where
7+
P: Fn(&T, &T) -> bool,
8+
{
9+
xs.windows(2)
10+
.position(|w| !pred(&w[0], &w[1]))
11+
.map(|i| i + 1)
12+
}
13+
514
fn find_index<T, P>(xs: &[T], pred: &P) -> Option<usize>
615
where
716
P: Fn(&T, &T) -> bool,
@@ -52,11 +61,23 @@ where
5261
}
5362
}
5463

55-
fn fold_with<F>(self, folder: F) -> F
64+
fn fold_with<F>(mut self, folder: F) -> F
5665
where
5766
F: Folder<Self::Item>,
5867
{
59-
folder.consume_iter(self.slice.chunk_by(self.pred))
68+
// TODO (MSRV 1.77):
69+
// folder.consume_iter(self.slice.chunk_by(self.pred))
70+
71+
folder.consume_iter(std::iter::from_fn(move || {
72+
if self.slice.is_empty() {
73+
None
74+
} else {
75+
let i = find_first_index(self.slice, self.pred).unwrap_or(self.slice.len());
76+
let (head, tail) = self.slice.split_at(i);
77+
self.slice = tail;
78+
Some(head)
79+
}
80+
}))
6081
}
6182
}
6283

@@ -147,11 +168,23 @@ where
147168
}
148169
}
149170

150-
fn fold_with<F>(self, folder: F) -> F
171+
fn fold_with<F>(mut self, folder: F) -> F
151172
where
152173
F: Folder<Self::Item>,
153174
{
154-
folder.consume_iter(self.slice.chunk_by_mut(self.pred))
175+
// TODO (MSRV 1.77):
176+
// folder.consume_iter(self.slice.chunk_by_mut(self.pred))
177+
178+
folder.consume_iter(std::iter::from_fn(move || {
179+
if self.slice.is_empty() {
180+
None
181+
} else {
182+
let i = find_first_index(self.slice, self.pred).unwrap_or(self.slice.len());
183+
let (head, tail) = std::mem::take(&mut self.slice).split_at_mut(i);
184+
self.slice = tail;
185+
Some(head)
186+
}
187+
}))
155188
}
156189
}
157190

0 commit comments

Comments
 (0)