typewit/base_type_wit/
meta_base_type_wit.rs

1use crate::{MakeTypeWitness, TypeWitnessTypeArg, TypeEq, TypeNe, TypeCmp};
2
3use core::fmt::{self, Debug};
4
5/// Type witness for 
6/// [`TypeEq`](crate::TypeEq)/[`TypeNe`](crate::TypeNe)/[`TypeCmp`](crate::TypeCmp).
7#[cfg_attr(feature = "docsrs", doc(cfg(feature = "rust_1_61")))]
8pub enum MetaBaseTypeWit<L: ?Sized, R: ?Sized, W> {
9    /// `where W == TypeEq<L, R>`
10    Eq(TypeEq<W, TypeEq<L, R>>),
11    /// `where W == TypeNe<L, R>`
12    Ne(TypeEq<W, TypeNe<L, R>>),
13    /// `where W == TypeCmp<L, R>`
14    Cmp(TypeEq<W, TypeCmp<L, R>>),
15}
16
17impl<L: ?Sized, R: ?Sized, W> MetaBaseTypeWit<L, R, W> {
18    /// Converts `W` to `TypeCmp<L, R>`
19    pub const fn to_cmp(self, witness: W) -> TypeCmp<L, R> {
20        match self {
21            Self::Cmp(te) => te.to_right(witness),
22            Self::Eq(te) => TypeCmp::Eq(te.to_right(witness)),
23            Self::Ne(te) => TypeCmp::Ne(te.to_right(witness)),
24        }
25    }
26}
27
28
29impl<L: ?Sized, R: ?Sized, W> Copy for  MetaBaseTypeWit<L, R, W> {}
30
31impl<L: ?Sized, R: ?Sized, W> Clone for  MetaBaseTypeWit<L, R, W> {
32    fn clone(&self) -> Self {
33        *self
34    }
35}
36
37impl<L: ?Sized, R: ?Sized, W> Debug for MetaBaseTypeWit<L, R, W> {
38    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
39        let isa = match self {
40            Self::Eq{..} => "TypeEq",
41            Self::Ne{..} => "TypeNe",
42            Self::Cmp{..} => "TypeCmp",
43        };
44
45        f.write_str(isa)
46    }
47}
48
49
50impl<L: ?Sized, R: ?Sized, W> TypeWitnessTypeArg for MetaBaseTypeWit<L, R, W> {
51    type Arg = W;
52}
53
54impl<L: ?Sized, R: ?Sized> MakeTypeWitness for MetaBaseTypeWit<L, R, TypeCmp<L, R>> {
55    const MAKE: Self = Self::Cmp(TypeEq::NEW);
56}
57
58impl<L: ?Sized, R: ?Sized> MakeTypeWitness for MetaBaseTypeWit<L, R, TypeEq<L, R>> {
59    const MAKE: Self = Self::Eq(TypeEq::NEW);
60}
61
62impl<L: ?Sized, R: ?Sized> MakeTypeWitness for MetaBaseTypeWit<L, R, TypeNe<L, R>> {
63    const MAKE: Self = Self::Ne(TypeEq::NEW);
64}