use std::iter::{once, repeat_n};
use crate::{
divisible::{Prime, PrimePower},
local_num::{LocalOne, LocalZero},
UAdic,
};
pub trait AdicPrimitive
where Self: Clone
+ std::ops::Add<Self, Output=Self>
+ std::ops::Mul<Self, Output=Self>
+ LocalZero + LocalOne
+ From<UAdic> {
fn p(&self) -> Prime;
fn zero<P>(p: P) -> Self
where P: Into<Prime>;
fn one<P>(p: P) -> Self
where P: Into<Prime>;
fn from_prime<P>(p: P) -> Self
where P: Into<Prime> {
let p = p.into();
Self::from(UAdic::new(p, vec![0, 1]))
}
fn from_prime_power<PP>(pp: PP) -> Self
where PP: Into<PrimePower> {
let pp = pp.into();
let p = pp.p();
let power = usize::try_from(pp.power()).expect("u32 -> usize conversion");
let d = repeat_n(0, power).chain(once(1)).collect();
Self::from(UAdic::new(p, d))
}
}