Diffstat (limited to 'src/hkt.rs')
-rw-r--r--src/hkt.rs164
1 files changed, 137 insertions, 27 deletions
diff --git a/src/hkt.rs b/src/hkt.rs
index 3f2c52d..58539db 100644
--- a/src/hkt.rs
+++ b/src/hkt.rs
@@ -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)*})?
+ }
}
}