use crate::constant::Integer;
pub trait ZigZag {
type Zag;
fn zigzag(self) -> Self::Zag;
fn unzigzag(self) -> Self::Zag;
}
impl ZigZag for &Integer {
type Zag = Integer;
fn zigzag(self) -> Self::Zag {
if *self >= 0.into() {
self.clone() << 1
} else {
let double: Integer = self.clone() << 1;
-double - 1
}
}
fn unzigzag(self) -> Self::Zag {
let temp: Integer = self.clone() & Integer::from(1);
(self.clone() >> 1) ^ -(temp)
}
}