1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
use super::num::Rand; pub trait Chaos { fn chaos(&mut self); } impl<T> Chaos for Vec<T> where T: Copy + Clone { fn chaos(&mut self) { let mut result: Vec<T> = Vec::new(); let mut order: Vec<usize> = Vec::new(); for i in 0..self.len() { order.push(i); } for _ in 0..self.len() { let index = usize::rand() % order.len(); let value = self[order[index]]; result.push(value); for i in index..order.len()-1 { order[i] = order[i+1]; } order.pop(); } *self = result; } } impl<T> Chaos for [T] where T: Copy + Clone { fn chaos(&mut self) { let mut _self: Vec<T> = Vec::new(); for value in self.iter() { _self.push(*value); } _self.chaos(); for (id, value) in _self.iter().enumerate() { self[id] = value.clone(); } } } impl Chaos for String { fn chaos(&mut self) { let mut result = "".to_string(); let mut _self: Vec<char> = Vec::new(); for value in self.chars() { _self.push(value); } _self.chaos(); for value in _self.iter() { result += &*value.to_string(); } *self = result; } }