Diffstat (limited to 'src/hkt.rs')
-rw-r--r--src/hkt.rs27
1 files changed, 24 insertions, 3 deletions
diff --git a/src/hkt.rs b/src/hkt.rs
index 50602c1..faac1af 100644
--- a/src/hkt.rs
+++ b/src/hkt.rs
@@ -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;