pub trait Num: 'static + Eq + Copy + Clone + Debug + Hash + Bounded + Ord {
type Range: Iterator<Item = Self>;
fn range(a: usize, b: usize) -> Self::Range;
fn to_usize(self) -> usize;
fn from_usize(v: usize) -> Self;
fn is_valid(v: usize) -> bool;
}