tempref 0.2.0

This crate provides a type whose value remains unchanged even when accessed through a mutable reference.
Documentation
use tempref::*;

#[cfg(test)]
mod tests {
    use std::i32;

    use super::*;

    #[test]
    fn unsync() {
        let value = vec![0; 128].into_boxed_slice();
        let workspace = unsync::Temp::new(value, |b| {
            b.fill(0);
        });
        {
            let mut guard = workspace.borrow_mut();
            guard.fill(1);
            assert_eq!(vec![1; 128].into_boxed_slice(), *guard);
        }
        assert_eq!(vec![0; 128].into_boxed_slice(), *workspace.borrow());

        {
            let _r1 = workspace.borrow();
            let _r2 = workspace.borrow();
        }
        {
            let mut guard = workspace.borrow_mut();
            guard.fill(2);
            assert_eq!(vec![2; 128].into_boxed_slice(), *guard);
            guard.reset();
            assert_eq!(vec![0; 128].into_boxed_slice(), *guard);
        }
        let new_value = std::cell::RefCell::new(vec![i32::MAX; 128].into_boxed_slice());
        workspace.swap(&new_value);

        assert_eq!(vec![i32::MAX; 128].into_boxed_slice(), *workspace.borrow());
        workspace.reset();
        assert_eq!(vec![0; 128].into_boxed_slice(), *workspace.borrow());

        let old = workspace.replace(vec![1; 16].into_boxed_slice());
        assert_eq!(vec![0; 128].into_boxed_slice(), old);
        assert_eq!(vec![1; 16].into_boxed_slice(), *workspace.borrow());
        {
            let mut guard = workspace.borrow_mut();
            for n in guard.iter_mut() {
                *n *= 2;
            }
            assert_eq!(vec![2; 16].into_boxed_slice(), *guard);
        }
        assert_eq!(vec![0; 16].into_boxed_slice(), *workspace.borrow());
        let inner = workspace.into_inner();
        assert_eq!(vec![0; 16].into_boxed_slice(), inner);

        let vec_space = unsync::Temp::new(vec![0; 128], |n| {
            n.fill(0);
        });
        {
            let mut guard = vec_space.borrow_mut();
            guard.pop();
            assert_eq!(*guard, vec![0; 127]);
        }

        assert_eq!(*vec_space.borrow(), vec![0; 127]);

        let default: unsync::Temp<i32, _> = unsync::Temp::new_default_with(|n| *n += 1);
        assert_eq!(1, *default.borrow());
    }

    #[test]
    fn rwlock() {
        let value = vec![0; 128].into_boxed_slice();
        let workspace = rwlock::Temp::new(value, |b| {
            b.fill(0);
        });
        {
            let _r1 = workspace.read().unwrap();
            let _r2 = workspace.read().unwrap();
        }
        {
            let mut guard = workspace.write().unwrap();
            guard.fill(2);
            assert_eq!(vec![2; 128].into_boxed_slice(), *guard);
            guard.reset();
            assert_eq!(vec![0; 128].into_boxed_slice(), *guard);
        }
        {
            let mut guard = workspace.write().unwrap();
            guard.fill(1);
            assert_eq!(vec![1; 128].into_boxed_slice(), *guard);
        }
        assert_eq!(vec![0; 128].into_boxed_slice(), *workspace.read().unwrap());

        let inner = workspace.into_inner().unwrap();
        assert_eq!(vec![0; 128].into_boxed_slice(), inner);

        let default: rwlock::Temp<i32, _> = rwlock::Temp::new_default_with(|n| *n += 1);
        assert_eq!(1, *default.read().unwrap());
    }

    #[test]
    fn mutex() {
        let value = vec![1; 128].into_boxed_slice();
        let workspace = mutex::Temp::new(value, |b| {
            b.fill(0);
        });
        assert_eq!(vec![1; 128].into_boxed_slice(), *workspace.lock().unwrap());
        assert_eq!(vec![0; 128].into_boxed_slice(), *workspace.lock().unwrap());
        {
            let mut guard = workspace.lock().unwrap();
            guard.fill(2);
            assert_eq!(vec![2; 128].into_boxed_slice(), *guard);
            guard.reset();
            assert_eq!(vec![0; 128].into_boxed_slice(), *guard);
        }
        {
            let mut guard = workspace.lock().unwrap();
            guard.fill(1);
            assert_eq!(vec![1; 128].into_boxed_slice(), *guard);
        }
        assert_eq!(vec![0; 128].into_boxed_slice(), *workspace.lock().unwrap());

        let inner = workspace.into_inner().unwrap();
        assert_eq!(vec![0; 128].into_boxed_slice(), inner);

        let default: mutex::Temp<i32, _> = mutex::Temp::new_default_with(|n| *n += 1);
        assert_eq!(1, *default.lock().unwrap());
    }
}