1pub trait ApplyAssign<T> {
2 fn app_ass<F>(&mut self, f: F)
14 where
15 F: FnOnce(T) -> T;
16}
17
18impl<T> ApplyAssign<T> for T
19where
20 T: Clone,
21{
22 fn app_ass<F>(&mut self, f: F)
23 where
24 F: FnOnce(T) -> T,
25 {
26 *self = f(self.clone())
27 }
28}
29
30pub fn rev_string(s: String) ->String {
40 s.chars().rev().collect()
41}
42
43#[cfg(test)]
44mod tests {
45 use super::*;
46
47 fn tuple_edit(x: (i32, i32)) -> (i32, i32) {
48 (x.1, x.0)
49 }
50
51 fn vec_edit(x: Vec<i32>) -> Vec<i32> {
52 x.into_iter().rev().collect()
53 }
54
55 #[test]
56 fn tuples() {
57 let mut x = (1, 2);
58
59 x.app_ass(tuple_edit);
60
61 assert_eq!(x, (2, 1))
62 }
63
64 #[test]
65 fn vecs() {
66 let mut x = vec![1, 2, 3];
67
68 x.app_ass(vec_edit);
69
70 assert_eq!(x, vec![3, 2, 1])
71 }
72}