polkadot_runtime_parachains/paras_inherent/
misc.rs1use alloc::vec::Vec;
18use core::cmp::Ordering;
19
20pub trait IndexedRetain<T> {
23 fn indexed_retain(&mut self, f: impl FnMut(usize, &T) -> bool);
30}
31
32impl<T> IndexedRetain<T> for Vec<T> {
33 fn indexed_retain(&mut self, mut f: impl FnMut(usize, &T) -> bool) {
34 let mut idx = 0_usize;
35 self.retain(move |item| {
36 let ret = f(idx, item);
37 idx += 1_usize;
38 ret
39 })
40 }
41}
42
43pub trait IsSortedBy<T> {
46 fn is_sorted_by<F>(self, cmp: F) -> bool
47 where
48 F: FnMut(&T, &T) -> Ordering;
49}
50
51impl<'x, T, X> IsSortedBy<T> for X
52where
53 X: 'x + IntoIterator<Item = &'x T>,
54 T: 'x,
55{
56 fn is_sorted_by<F>(self, mut cmp: F) -> bool
57 where
58 F: FnMut(&T, &T) -> Ordering,
59 {
60 let mut iter = self.into_iter();
61 let mut previous: &T = if let Some(previous) = iter.next() {
62 previous
63 } else {
64 return true
66 };
67 while let Some(cursor) = iter.next() {
68 match cmp(&previous, &cursor) {
69 Ordering::Greater => return false,
70 _ => {
71 },
73 }
74 previous = cursor;
75 }
76 true
77 }
78}
79
80#[cfg(test)]
81mod tests {
82 use super::*;
83
84 #[test]
85 fn is_sorted_simple() {
86 let v = vec![1_i32, 2, 3, 1000];
87 assert!(IsSortedBy::<i32>::is_sorted_by(v.as_slice(), |a: &i32, b: &i32| { a.cmp(b) }));
88 assert!(!IsSortedBy::<i32>::is_sorted_by(&v, |a, b| { b.cmp(a) }));
89
90 let v = vec![8_i32, 8, 8, 8];
91 assert!(IsSortedBy::<i32>::is_sorted_by(v.as_slice(), |a: &i32, b: &i32| { a.cmp(b) }));
92 assert!(IsSortedBy::<i32>::is_sorted_by(v.as_slice(), |a: &i32, b: &i32| { b.cmp(a) }));
93 }
94
95 #[test]
96 fn is_not_sorted() {
97 let v = vec![7, 1, 3];
98 assert!(!IsSortedBy::is_sorted_by(&v, |a, b| { a.cmp(b) }));
99 assert!(!IsSortedBy::is_sorted_by(&v, |a, b| { b.cmp(a) }));
100 }
101
102 #[test]
103 fn empty_is_sorted() {
104 let v = Vec::<u8>::new();
105 assert!(IsSortedBy::is_sorted_by(&v, |_a, _b| { unreachable!() }));
106 }
107
108 #[test]
109 fn single_items_is_sorted() {
110 let v = vec![7_u8];
111 assert!(IsSortedBy::is_sorted_by(&v, |_a, _b| { unreachable!() }));
112 }
113}