use crate::Enum;
use core::hint::unreachable_unchecked;
pub trait VariantCore<E: Enum>: Sized {
fn into_enum(self) -> E;
fn from_enum(e: E) -> Option<Self>;
fn ref_enum(e: &E) -> Option<&Self>;
fn mut_enum(e: &mut E) -> Option<&mut Self>;
fn is_enum_variant(e: &E) -> bool {
Self::ref_enum(e).is_some()
}
fn from_enum_unwrap(e: E) -> Self {
match Self::from_enum(e) {
Some(v) => v,
None => panic!("called `Variant::from_enum_unwrap` on another enum variant"),
}
}
unsafe fn from_enum_unchecked(e: E) -> Self {
match Self::from_enum(e) {
Some(v) => v,
None => unreachable_unchecked(),
}
}
unsafe fn ref_enum_unchecked(e: &E) -> &Self {
match Self::ref_enum(e) {
Some(v) => v,
None => unreachable_unchecked(),
}
}
unsafe fn mut_enum_unchecked(e: &mut E) -> &mut Self {
match Self::mut_enum(e) {
Some(v) => v,
None => unreachable_unchecked(),
}
}
}