projections 1.1.1

Macro-free pin projections because why not?
Documentation
use core::marker::PhantomData;

#[non_exhaustive]
#[derive(Debug)]
pub enum Type<T> {
    Unit(PhantomData<fn() -> T>),
    TupleA,
    TupleB,
    TupleC,
    TupleD,
    TupleE,
    TupleF,
    TupleG,
}

pub trait Generics {
    type A;
    type B;
    type C;
    type D;
    type E;
    type F;
    type G;
}

macro_rules! generics {
    ($($generic:ident),* $(,)?) => {
        generics!($($generic),*; $($generic),*);
    };
    ($($generic:ident),*; $(,)?) => {
        generics!($($generic),*; ());
    };
    ($($generic:ident),*; $a:ty $(,)?) => {
        generics!($($generic),*; $a, ());
    };
    ($($generic:ident),*; $a:ty, $b:ty $(,)?) => {
        generics!($($generic),*; $a, $b, ());
    };
    ($($generic:ident),*; $a:ty, $b:ty, $c:ty $(,)?) => {
        generics!($($generic),*; $a, $b, $c, ());
    };
    ($($generic:ident),*; $a:ty, $b:ty, $c:ty, $d:ty $(,)?) => {
        generics!($($generic),*; $a, $b, $c, $d, ());
    };
    ($($generic:ident),*; $a:ty, $b:ty, $c:ty, $d:ty, $e:ty $(,)?) =>
    {
        generics!($($generic),*; $a, $b, $c, $d, $e, ());
    };
    ($($generic:ident),*; $a:ty, $b:ty, $c:ty, $d:ty, $e:ty, $f:ty $(,)?) => {
        generics!($($generic),*; $a, $b, $c, $d, $e, $f, ());
    };
    (
        $($generic:ident),*;
        $a:ty,
        $b:ty,
        $c:ty,
        $d:ty,
        $e:ty,
        $f:ty,
        $g:ty $(,)?
    ) => {
        impl<$($generic),*> Generics for Type<($($generic,)*)> {
            type A = $a;
            type B = $b;
            type C = $c;
            type D = $d;
            type E = $e;
            type F = $f;
            type G = $g;
        }
    };
}

generics!();
generics!(A);
generics!(A, B);
generics!(A, B, C);
generics!(A, B, C, D);
generics!(A, B, C, D, E);
generics!(A, B, C, D, E, F);
generics!(A, B, C, D, E, F, G);