use super::*;
type _DoubleIf<N, C> = If<C, PushBit<N, crate::lit!(0)>, N>;
#[apply(nat_expr)]
pub type _Shl<L: NatExpr, R: NatExpr> = If<
R,
_DoubleIf<
_Shl<_Shl<crate::Eval<L>, _H<R>>, _H<R>>,
_P<R>,
>,
L,
>;
#[doc(alias = "<<")]
#[apply(opaque)]
#[apply(test_op!
test_shl,
L << R,
..,
..=15,
)]
pub type Shl<L, R> = _Shl;
type _HalfIf<N, C> = If<C, PopBit<N>, N>;
#[apply(nat_expr)]
pub type _Shr<L: NatExpr, R: NatExpr> = If<
_And<L, R>,
_HalfIf<
_Shr<_Shr<crate::Eval<L>, _H<R>>, _H<R>>,
_P<R>,
>,
L,
>;
#[doc(alias = ">>")]
#[apply(opaque)]
#[apply(test_op!
test_shr,
L >> R,
..,
..=15,
)]
pub type Shr<L, R> = _Shr;