Diffstat (limited to 'src/hkt.rs')
| -rw-r--r-- | src/hkt.rs | 27 |
1 files changed, 24 insertions, 3 deletions
@@ -70,10 +70,11 @@ macro_rules! higher_ranked_trait { $($($lower_where)*)? $($($higher_where)*)? { - type T: RaiseForLt<$($lt,)+ $($($generic)*,)? B, HigherRanked = Self> + ?Sized + $($lower)*; + type T: RaiseForLt<$($lt,)+ $($($generic)*,)? B, HigherRanked = Self, HigherRankedAll = Self> + ?Sized + $($lower)*; } pub trait RaiseForLt<$($lt,)+ $($($generic)*,)? B> + : RaiseForLtAll<$($($generic)*,)? B> where $($($lower_where)*)? $($($higher_where)*)? @@ -81,6 +82,13 @@ macro_rules! higher_ranked_trait { type HigherRanked: LowerForLt<$($lt,)+ $($($generic)*,)? B, T = Self> + ?Sized + $($higher)*; } + pub trait RaiseForLtAll<$($($generic)*,)? B> + where + $($($higher_where)*)? + { + type HigherRankedAll: for<$($lt,)+> LowerForLt<$($lt,)+ $($($generic)*,)? $bound> + ?Sized + $($higher)*; + } + pub type Bound<$($lt,)+ $($($generic)*)?> = $bound; pub trait MemberType$(<$($generic)*>)?: @@ -113,6 +121,9 @@ macro_rules! higher_ranked_trait { pub type HigherRanked<$($lt,)+ $($($generic)*,)? __> = <__ as RaiseForLt<$($lt,)+ $($($generic)*,)? Bound<$($lt,)+ $($($generic)*)?>>>::HigherRanked; + + pub type HigherRankedAll<$($lt,)+ $($($generic)*,)? __> = + <__ as RaiseForLtAll<$($($generic)*,)? Bound<$($lt,)+ $($($generic)*)?>>>::HigherRankedAll; } } } @@ -127,9 +138,13 @@ macro_rules! higher_ranked_type { $lower:ty $(where {$($lower_where:tt)*})?; - impl$([$($higher_generic:tt)*])? type HigherRanked[$($higher_forward:tt)*] for $higher_lower:ty = + impl$([$($higher_generic:tt)*])? type HigherRanked[$($higher_lt:lifetime),+]$([$($higher_forward:tt)*])? for $higher_lower:ty = $higher:ty $(where {$($higher_where:tt)*})?; + + impl$([$($higher_all_generic:tt)*])? type HigherRankedAll[$($higher_all_lt:lifetime),+]$([$($higher_all_forward:tt)*])? for $higher_all_lower:ty = + $higher_all:ty + $(where {$($higher_all_where:tt)*})?; } } => { impl$(<$($lower_generic)*>)* $higher_trait::LowerForLt<$($lower_forward)*, $higher_trait::Bound<$($lower_forward)*>> for $lower_higher @@ -138,11 +153,17 @@ macro_rules! higher_ranked_type { type T = $lower; } - impl$(<$($higher_generic)*>)* $higher_trait::RaiseForLt<$($higher_forward)*, $higher_trait::Bound<$($higher_forward)*>> for $higher_lower + impl$(<$($higher_generic)*>)* $higher_trait::RaiseForLt<$($higher_lt,)+ $($($higher_forward)*,)? $higher_trait::Bound<$($higher_lt,)+ $($($higher_forward)*)?>> for $higher_lower $(where $($higher_where)*)? { type HigherRanked = $higher; } + + impl$(<$($higher_all_generic)*>)* $higher_trait::RaiseForLtAll<$($($higher_all_forward)*,)? $higher_trait::Bound<$($higher_all_lt,)+ $($($higher_all_forward)*)?>> for $higher_all_lower + $(where $($higher_all_where)*)? + { + type HigherRankedAll = $higher_all; + } } } pub use higher_ranked_type; |