lang-extension 1.3.0

Rust Lang Extension
Documentation
pub trait SliceExtention {
    fn lift(&mut self, from: usize, to: usize);
}

impl<T: PartialOrd> SliceExtention for [T] {
    fn lift(&mut self, from: usize, to: usize) {
        if from >= self.len() || to >= self.len() || from == to {
            return;
        }
        if from < to {
            for i in from..to {
                self.swap(i, i + 1);
            }
        } else {
            for i in (to..from).rev() {
                self.swap(i + 1, i);
            }
        }
    }
}

#[cfg(test)]
mod tests {
    use super::SliceExtention;
    #[test]
    fn test_lift() {
        let mut v = [1, 2, 3, 4, 5];
        v.lift(1, 3);
        assert_eq!(v, [1, 3, 4, 2, 5]);
        v.lift(3, 1);
        assert_eq!(v, [1, 2, 3, 4, 5]);
        v.lift(0, 4);
        assert_eq!(v, [2, 3, 4, 5, 1]);
        v.lift(4, 0);
        assert_eq!(v, [1, 2, 3, 4, 5]);

        v.lift(5, 0);
        assert_eq!(v, [1, 2, 3, 4, 5]);
        v.lift(0, 5);
        assert_eq!(v, [1, 2, 3, 4, 5]);
        v.lift(0, 0);
        assert_eq!(v, [1, 2, 3, 4, 5]);
        v.lift(3, 3);
        assert_eq!(v, [1, 2, 3, 4, 5]);
        v.lift(10, 11);
        assert_eq!(v, [1, 2, 3, 4, 5]);
    }
}