use std::fmt::Debug;
use std::hash::Hash;
use std::ops::{Add, AddAssign, Sub, SubAssign};
use num_traits::One;
use crate::non_zero::{NonZero, NonZeroSign};
use crate::Signed;
pub trait NonZeroFactorizable: NonZero + Clone {
type Factor: NonZero + Eq + PartialEq + Ord + PartialOrd + Hash + Clone + Debug;
type Power: Add<Output=Self::Power> + AddAssign + Sub<Output=Self::Power> + SubAssign + One + Signed + Eq + Copy + Clone + Debug;
fn factorize(&self) -> NonZeroFactorization<Self::Factor, Self::Power>;
}
#[derive(Eq, PartialEq, Clone, Debug)]
pub struct NonZeroFactorization<Factor, Power> {
pub sign: NonZeroSign,
pub factors: Vec<(Factor, Power)>,
}