use crate::{NatExpr, condty::CondTy, utils};
#[track_caller]
pub const fn unwrap_true<C: NatExpr, T, F>(tern: CondTy<C, T, F>) -> T {
ctx!(
|c| c.unwrap_true(tern),
|_| panic!("Call to `unwrap_true` with false condition"),
C,
)
}
#[track_caller]
pub const fn new_true<C: NatExpr, T, F>(value: T) -> CondTy<C, T, F> {
ctx!(
|c| c.new_true(value),
|_| panic!("Call to `new_true` with false condition"),
C,
)
}
#[track_caller]
pub const fn unwrap_false<C: NatExpr, T, F>(tern: CondTy<C, T, F>) -> F {
ctx!(
|_| panic!("Call to `unwrap_false` with true condition"),
|c| c.unwrap_false(tern),
C,
)
}
#[track_caller]
pub const fn new_false<C: NatExpr, T, F>(value: F) -> CondTy<C, T, F> {
ctx!(
|_| panic!("Call to `new_false` with true condition"),
|c| c.new_false(value),
C,
)
}
pub const fn as_ref<C: NatExpr, T, F>(tern: &CondTy<C, T, F>) -> CondTy<C, &T, &F> {
unsafe { utils::same_type_transmute!(&CondTy::<C, T, F>, CondTy::<C, &T, &F>, tern) }
}
pub const fn as_mut<C: NatExpr, T, F>(tern: &mut CondTy<C, T, F>) -> CondTy<C, &mut T, &mut F> {
unsafe {
utils::same_type_transmute!(&mut CondTy::<C, T, F>, CondTy::<C, &mut T, &mut F>, tern)
}
}
pub const fn unwrap_trivial<C: NatExpr, T>(tern: CondTy<C, T, T>) -> T {
unsafe { crate::utils::same_type_transmute!(CondTy::<C, T, T>, T, tern) }
}
pub const fn new_trivial<C: NatExpr, T>(inner: T) -> CondTy<C, T, T> {
unsafe { crate::utils::same_type_transmute!(T, CondTy::<C, T, T>, inner) }
}