1pub fn rle<T: PartialEq>(a: &[T]) -> Vec<(&T, usize)> {
5 let mut ret = vec![];
6
7 for x in a {
8 match ret.last_mut() {
9 Some((y, c)) if x == *y => *c += 1,
10 _ => ret.push((x, 1)),
11 }
12 }
13
14 ret
15}
16
17#[cfg(test)]
18mod tests {
19 use super::*;
20
21 #[test]
22 fn test_vec() {
23 let a = vec![1, 1, 2, 1, 3, 4, 5, 5, 4];
24 assert_eq!(
25 rle(&a),
26 [
27 (&1, 2),
28 (&2, 1),
29 (&1, 1),
30 (&3, 1),
31 (&4, 1),
32 (&5, 2),
33 (&4, 1)
34 ]
35 );
36 }
37
38 #[test]
39 fn test_str() {
40 let a = "aabbccd";
41 assert_eq!(
42 rle(&a.chars().collect::<Vec<_>>()),
43 [(&'a', 2), (&'b', 2), (&'c', 2), (&'d', 1)]
44 );
45 }
46}