makepad_draw/text/
slice.rs

1pub 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}