///|
pub(open) trait UnsignedNum: FromInt + ToInt + ToByte + Add + Mul + Zero {
  one() -> Self = _
}

///|
pub(open) trait NumType: UnsignedNum + Sub + Neg {}

///|
impl UnsignedNum with one() {
  FromInt::from_int(1)
}

// ///|
// impl UnsignedNum with op_add(a, b) {
//   FromInt::from_int(a.to_int() + b.to_int())
// }

// ///|
// impl UnsignedNum with op_mul(a, b) {
//   FromInt::from_int(a.to_int() * b.to_int())
// }

// ///|
// impl UnsignedNum with lxor(a, b) { FromInt::from_int(a.to_int() ^ b.to_int()) }

// ///|
// impl NumType with op_sub(a, b) { FromInt::from_int(a.to_int() - b.to_int()) }

// ///|
// impl NumType with op_neg(a) { UnsignedNum::zero() - a }