use super::*;
#[apply(nat_expr)]
#[apply(test_op! test_cmp, {
match L.cmp(&R) {
core::cmp::Ordering::Less => 0,
core::cmp::Ordering::Greater => 1,
core::cmp::Ordering::Equal => 2,
}
})]
pub type _Cmp<L: Nat, R: Nat> = If<
L,
If<R, _CmpRecExpr<L, R>, crate::lit!(1)>,
If<R, crate::lit!(0), crate::lit!(2)>,
>;
#[apply(nat_expr)]
pub type _CmpRecExpr<L: Nat, R: Nat> = _CmpInterp<
crate::Eval<
_Cmp<
_H<L>, _H<R>,
>,
>,
_P<L>,
_P<R>,
>;
#[apply(nat_expr)]
pub type _CmpInterp<CmpHalf: Nat, PL: Nat, PR: Nat> = If<
_H<CmpHalf>,
If<
PL,
If<PR, crate::lit!(2), crate::lit!(1)>,
If<PR, crate::lit!(0), crate::lit!(2)>,
>,
CmpHalf,
>;
#[doc(alias = "==")]
#[apply(opaque)]
#[apply(test_op! test_eq, (L == R) as _)]
pub type Eq<L, R> = _Eq;
#[apply(nat_expr)] pub type _Eq<L: NatExpr, R: NatExpr> = _H<_Cmp<L::Eval, R::Eval>>;
#[doc(alias = "!=")]
#[apply(opaque)]
pub type Ne<L, R> = _Ne;
#[apply(nat_expr)]
pub type _Ne<L: NatExpr, R: NatExpr> = IsZero<_Eq<L, R>>;
#[doc(alias = "<")]
#[apply(opaque)]
#[apply(test_op! test_lt, (L < R) as _)]
pub type Lt<L, R> = _Lt;
#[apply(nat_expr)] pub type _Lt<L: NatExpr, R: NatExpr> = IsZero<_Cmp<L::Eval, R::Eval>>;
#[doc(alias = ">")]
pub type Gt<L, R> = Lt<R, L>;
#[doc(alias = "<=")]
#[apply(opaque)]
pub type Le<L, R> = _Le;
#[apply(nat_expr)]
pub type _Le<L: NatExpr, R: NatExpr> = IsZero<Gt<L, R>>;
#[doc(alias = ">=")]
pub type Ge<L, R> = Le<R, L>;
#[apply(opaque)]
pub type Min<L, R> = _Min;
#[apply(nat_expr)]
pub type _Min<L: NatExpr, R: NatExpr> = If<_Lt<L, R>, R, L>;
#[apply(nat_expr)]
pub type _Max<L: NatExpr, R: NatExpr> = If<_Lt<L, R>, L, R>;
#[apply(opaque)]
pub type Max<L, R> = _Max;