50 lines
942 B
Rust
50 lines
942 B
Rust
//@check-pass
|
|
|
|
use higher_kinded_types::*;
|
|
mod higher_kinded_types {
|
|
pub(crate) trait HKT {
|
|
type Of<'lt>;
|
|
}
|
|
|
|
pub(crate) trait WithLifetime<'lt> {
|
|
type T;
|
|
}
|
|
|
|
impl<T: ?Sized + for<'any> WithLifetime<'any>> HKT for T {
|
|
type Of<'lt> = <T as WithLifetime<'lt>>::T;
|
|
}
|
|
}
|
|
|
|
trait Trait {
|
|
type Gat<'lt>;
|
|
}
|
|
|
|
impl Trait for () {
|
|
type Gat<'lt> = ();
|
|
}
|
|
|
|
/// Same as `Trait`, but using HKTs rather than GATs
|
|
trait HTrait {
|
|
type Hat: ?Sized + HKT;
|
|
}
|
|
|
|
impl<T: Trait> HTrait for T {
|
|
type Hat = dyn for<'lt> WithLifetime<'lt, T = T::Gat<'lt>>;
|
|
}
|
|
|
|
impl<Hat: ?Sized + HKT> Trait for Box<dyn '_ + HTrait<Hat = Hat>> {
|
|
type Gat<'lt> = Hat::Of<'lt>;
|
|
}
|
|
|
|
fn existential() -> impl for<'a> Trait<Gat<'a> = ()> {}
|
|
|
|
fn dyn_hoops<T: Trait>(
|
|
_: T,
|
|
) -> Box<dyn HTrait<Hat = dyn for<'a> WithLifetime<'a, T = T::Gat<'a>>>> {
|
|
loop {}
|
|
}
|
|
|
|
fn main() {
|
|
let _ = || -> _ { dyn_hoops(existential()) };
|
|
}
|