Diffstat (limited to 'src/hkt.rs')
| -rw-r--r-- | src/hkt.rs | 164 |
1 files changed, 137 insertions, 27 deletions
@@ -121,14 +121,14 @@ macro_rules! bijective_higher_ranked_trait { where $($($bound)*)? $($($for_bound)*)? { - type T: ?Sized + RaiseForLt<$lt, $($lifetimes,)* B, $($generic),*> $(+ $($provides)+)? + $lt; + type T: ?Sized + RaiseForLt<$lt, $($lifetimes,)* B, $($generic,)* HigherRanked = Self> $(+ $($provides)+)? + $lt; } pub trait RaiseForLt<$lt, $($lifetimes,)* B, $($generic),*> where $($($bound)*)? $($($for_bound)*)? { - type HigherRanked: ?Sized + LowerForLt<$lt, $($lifetimes,)* B, $($generic),*>; + type HigherRanked: ?Sized + LowerForLt<$lt, $($lifetimes,)* B, $($generic,)* T = Self> + $($lifetimes +)*; } pub trait Trait<$($lifetimes,)* $($generic),*>: @@ -175,23 +175,104 @@ macro_rules! bijective_higher_ranked_type { $($ctx:lifetime),* ][ $($generic:ident),* - ]: ($($type_class:tt)*)[$($type_class_lifetime:lifetime)*][$($type_class_generic:ident)*] + ]$([ + $($forwarding_generic:ident[$($forward_lt:lifetime),*][$($forward_generic:ident),*]),* + ])?: $type_class:ident[$($type_class_lifetime:lifetime)*][$($type_class_generic:ident)*] + for<$lt:lifetime> + ($for_lt_type:ty) + ($higher_ranked_type:ty) $(where {$($bound:tt)*})? - = for<$lt:lifetime> $for_lt_type:ty - $(where {$($higher_bound:tt)*})? } => { - $vis struct $name<$($type_class_lifetime,)* $($generic),*>(core::marker::PhantomData<fn() -> ($(&$type_class_lifetime (),)* $($generic,)*)>); - - impl<$lt, $($ctx,)* $($generic),*> $($type_class)*::LowerForLt<$lt, $($type_class_lifetime,)* &$lt ($(&$type_class_lifetime (),)* $($generic,)*), $($type_class_generic),*> for $name<$($type_class_lifetime,)* $($generic),*> - where $($($bound)*)? $($($higher_bound)*)? + $vis struct $name< + $($type_class_lifetime,)* + $($generic: ?Sized,)* + $($($forwarding_generic: ?Sized),*)? + >( + core::marker::PhantomData<fn() -> ( + $(&$type_class_lifetime (),)* + $(*const $generic,)* + $($(*const $forwarding_generic,)*)? + )> + ); + + impl< + $lt, + $($ctx,)* + $($generic,)* + $($($forwarding_generic),*)? + > $type_class::LowerForLt< + $lt, + $($type_class_lifetime,)* + &$lt ( + $(&$type_class_lifetime (),)* + $(*const $type_class_generic,)* + ), + $($type_class_generic),* + > for $name< + $($type_class_lifetime,)* + $($generic,)* + $($($forwarding_generic),*)? + > + where + $($( + $forwarding_generic: $type_class::LowerForLt< + $lt, + $($forward_lt,)* + &$lt ( + $(&$forward_lt (),)* + $(*const $forward_generic,)* + ) + $($forward_generic,)* + >, + )*)? + $($($bound)*)? { type T = $for_lt_type; } - impl<$lt, $($ctx,)* $($generic),*> $($type_class)*::RaiseForLt<$lt, $($type_class_lifetime,)* &$lt ($(&$type_class_lifetime (),)* $($generic,)*), $($type_class_generic),*> for $for_lt_type - where $($($bound)*)? $($($higher_bound)*)? + impl< + $lt, + $($ctx,)* + $($generic,)* + $($($forwarding_generic),*)? + > $type_class::RaiseForLt< + $lt, + $($type_class_lifetime,)* + &$lt ( + $(&$type_class_lifetime (),)* + $(*const $type_class_generic,)* + ), + $($type_class_generic),* + > for $higher_ranked_type + where + $($( + $forwarding_generic: $type_class::RaiseForLt< + $lt, + $($forward_lt,)* + &$lt ( + $(&$forward_lt (),)* + $(*const $forward_generic,)* + ) + $($forward_generic,)* + >, + )*)? + $($($bound)*)? { - type HigherRanked = $name<$($type_class_lifetime,)* $($generic),*>; + type HigherRanked = $name< + $($type_class_lifetime,)* + $($generic,)* + $($( + <$forwarding_generic as $type_class::RaiseForLt< + $lt, + $($forward_lt,)* + &$lt ( + $(&$forward_lt (),)* + $(*const $forward_generic,)* + ) + $($forward_generic,)* + >>::HigherRanked + ),*)? + >; } }; { @@ -199,26 +280,55 @@ macro_rules! bijective_higher_ranked_type { $($ctx:lifetime),* ][ $($generic:ident),* - ]: ($($type_class:tt)*)[$($type_class_lifetime:lifetime)*][$($type_class_generic:ident)*] + ]$([ + $($forwarding_generic:ident[$($forward_lt:lifetime),*][$($forward_generic:ident),*]),* + ])?: $type_class:ident[$($type_class_lifetime:lifetime)*][$($type_class_generic:ident)*] + for<$lt:lifetime> + ($for_lt_type:ty) + $(($higher_ranked_type:ty))? $(where {$($bound:tt)*})? - = for<$lt:lifetime> $for_lt_type:ty - $(where {$($higher_bound:tt)*})? } => { const _: () = { - $vis struct __Name<$($type_class_lifetime,)* $($generic: ?Sized),*>(core::marker::PhantomData<fn() -> ($(&$type_class_lifetime (),)* $(*const $generic),*)>); - - impl<$lt, $($ctx,)* $($generic),*> $($type_class)*::LowerForLt<$lt, $($type_class_lifetime,)* &$lt ($(&$type_class_lifetime (),)* $(*const $generic),*), $($type_class_generic),*> for __Name<$($type_class_lifetime,)* $($generic),*> - where $($($bound)*)? $($($higher_bound)*)? - { - type T = $for_lt_type; - } - - impl<$lt, $($ctx,)* $($generic),*> $($type_class)*::RaiseForLt<$lt, $($type_class_lifetime,)* &$lt ($(&$type_class_lifetime (),)* $(*const $generic),*), $($type_class_generic),*> for $for_lt_type - where $($($bound)*)? $($($higher_bound)*)? - { - type HigherRanked = __Name<$($type_class_lifetime,)* $($generic),*>; + $crate::hkt::bijective_higher_ranked_type! { + $vis type __HigherRanked[ + $($ctx),* + ][ + $($generic),* + ]$([ + $($forwarding_generic[$($forward_lt),*][$($forward_generic),*]),* + ])?: $type_class[$($type_class_lifetime)*][$($type_class_generic)*] + for<$lt> + ($for_lt_type) + $(($higher_ranked_type))? + $(where {$($bound)*})? } }; + }; + { + $vis:vis type $name:ident[ + $($ctx:lifetime),* + ][ + $($generic:ident),* + ]$([ + $($forwarding_generic:ident[$($forward_lt:lifetime),*][$($forward_generic:ident),*]),* + ])?: $type_class:ident[$($type_class_lifetime:lifetime)*][$($type_class_generic:ident)*] + for<$lt:lifetime> + ($for_lt_type:ty) + $(where {$($bound:tt)*})? + } => { + $crate::hkt::bijective_higher_ranked_type! { + $vis type $name[ + $($ctx),* + ][ + $($generic),* + ]$([ + $($forwarding_generic[$($forward_lt),*][$($forward_generic),*]),* + ])?: $type_class[$($type_class_lifetime)*][$($type_class_generic)*] + for<$lt> + ($for_lt_type) + ($for_lt_type) + $(where {$($bound)*})? + } } } |