pub trait MyTrait2 { type Output; } pub trait MyTrait { type Item; fn next(&mut self) -> Option; fn fold(self, init: B, f: F) -> B where Self: Sized, F: MyTrait2<(B, Self::Item), Output = B>; } pub struct Cloned(I); impl<'a, T, I> MyTrait for Cloned where T: 'a + Clone, I: MyTrait, { type Item = T; fn next(&mut self) -> Option { loop {} } fn fold(self, init: B, f: F) -> B where Self: Sized, F: MyTrait2<(B, Self::Item), Output = B>, { loop {} } } pub trait MyFuture { type Output; } pub trait MyIntoFuture { type Output; type Fut: MyFuture; fn into_future(self) -> Self::Fut; fn into_future_2(self, other: Self) -> Self::Fut; }