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
use std::fmt; use std::ops::Deref; #[derive(Copy, Clone, Default, Eq, Hash, PartialEq, PartialOrd, Ord, Debug)] pub struct Frozen<T> { val: T, } impl<T> Frozen<T> { pub fn freeze(val: T) -> Frozen<T> { Frozen { val: val } } pub fn thaw(self) -> T { self.val } } impl<T> Deref for Frozen<T> { type Target = T; fn deref(&self) -> &T { &self.val } } impl<U, T> AsRef<U> for Frozen<T> where T: AsRef<U> { fn as_ref(&self) -> &U { self.val.as_ref() } } impl<T: fmt::Display> fmt::Display for Frozen<T> { fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { self.val.fmt(f) } }