use std::mem;
pub struct Clink<T, F>
where
F: Fn(&T) -> bool,
{
value: T,
invariant: F,
}
impl<T, F> Clink<T, F>
where
F: Fn(&T) -> bool,
{
pub fn new(val: T, inv: F) -> Clink<T, F> {
assert!((inv)(&val));
Clink {
value: val,
invariant: inv,
}
}
pub fn get(&self) -> &T {
&self.value
}
pub fn set(&mut self, val: T) {
assert!((self.invariant)(&val));
self.value = val;
}
pub fn swap(&mut self, mut val: T) -> T {
assert!((self.invariant)(&val));
mem::swap(&mut val, &mut self.value);
val
}
}