use super::*;
type _Quad<N> = PushBit<PushBit<N, crate::lit!(0)>, crate::lit!(0)>;
#[apply(nat_expr)]
pub type _Square<N: NatExpr> = If<
N,
If<
_P<N>,
_Add<
_Quad<_Square<_H<N>>>,
_Quad<_H<N>>,
crate::lit!(1), >,
_Quad<_Square<_H<N>>>,
>,
crate::lit!(0),
>;
type _MulIf<N, F, C> = If<C, _Mul<F, N>, N>;
#[apply(nat_expr)]
pub type _Pow<B: NatExpr, E: NatExpr> = If<
E,
_MulIf<
_Square<_Pow<B, _H<E>>>, B,
_P<E>,
>,
crate::lit!(1),
>;
#[apply(opaque)]
#[apply(test_op!
test_pow,
B.pow(E.try_into().unwrap()),
..,
// Cap the exponent at 10 for tests
..=10,
)]
pub type Pow<B, E> = _Pow;