type AnyResult<O, E> = PatternableResult<AnyResultVariantPresence, O, E>;
type OkResult<O, E> = PatternableResult<OkResultVariantPresence, O, E>;
trait ResultVariantPresence {
type Ok;
type Err;
}
struct AnyResultVariantPresence;
impl ResultVariantPresence for AnyResultVariantPresence {
type Ok = ();
type Err = ();
}
enum Never {}
struct OkResultVariantPresence;
impl ResultVariantPresence for OkResultVariantPresence {
type Ok = ();
type Err = Never;
}
enum PatternableResult<P: ResultVariantPresence, O, E> {
Ok(O, P::Ok),
_Err(E, P::Err),
}
fn main() {
upcast();
unwrap_safely(OkResult::Ok(1, ()));
}
#[test]
fn test_main() {
main()
}
fn unwrap_safely(ok: OkResult<i64, ()>) -> i64 {
match ok {
OkResult::Ok(contains, _) => {
contains
} }
}
fn upcast() {
let any_res: AnyResult<i64, i64> = unsafe { std::mem::transmute(OkResult::<i64, i64>::Ok(1, ())) };
assert!(matches!(&any_res, AnyResult::Ok(_, _)));
let ok_res: OkResult<i64, i64> = unsafe { std::mem::transmute(any_res) };
assert!(matches!(&ok_res, OkResult::Ok(_, _)));
}