makepad_draw/text/
slice.rs1pub trait SliceExt<T> {
2 fn group_by<P>(&self, predicate: P) -> GroupBy<'_, T, P>
3 where
4 P: Fn(&T, &T) -> bool;
5}
6
7impl<T> SliceExt<T> for [T] {
8 fn group_by<P>(&self, predicate: P) -> GroupBy<'_, T, P>
9 where
10 P: Fn(&T, &T) -> bool,
11 {
12 GroupBy {
13 slice: self,
14 predicate,
15 }
16 }
17}
18
19#[derive(Debug)]
20pub struct GroupBy<'a, T, P> {
21 slice: &'a [T],
22 predicate: P,
23}
24
25impl<'a, T, P> Iterator for GroupBy<'a, T, P>
26where
27 P: Fn(&T, &T) -> bool,
28{
29 type Item = &'a [T];
30
31 fn next(&mut self) -> Option<Self::Item> {
32 if self.slice.is_empty() {
33 None
34 } else {
35 let mut len = 1;
36 let mut iter = self.slice.windows(2);
37 while let Some([l, r]) = iter.next() {
38 if (self.predicate)(l, r) {
39 len += 1
40 } else {
41 break;
42 }
43 }
44 let (head, tail) = self.slice.split_at(len);
45 self.slice = tail;
46 Some(head)
47 }
48 }
49}