| use std::marker::PhantomData; |
| |
| trait DistributedIterator { |
| fn reduce(self) |
| where |
| Self: Sized, |
| { |
| unreachable!() |
| } |
| } |
| |
| trait DistributedIteratorMulti<Source> { |
| type Item; |
| } |
| |
| struct Connect<I>(PhantomData<fn(I)>); |
| impl<I: for<'a> DistributedIteratorMulti<&'a ()>> DistributedIterator for Connect<I> where {} |
| |
| struct Cloned<Source>(PhantomData<fn(Source)>); |
| impl<'a, Source> DistributedIteratorMulti<&'a Source> for Cloned<&'a Source> { |
| type Item = (); |
| } |
| |
| struct Map<I, F> { |
| i: I, |
| f: F, |
| } |
| impl<I: DistributedIteratorMulti<Source>, F, Source> DistributedIteratorMulti<Source> for Map<I, F> |
| where |
| F: A<<I as DistributedIteratorMulti<Source>>::Item>, |
| { |
| type Item = (); |
| } |
| |
| trait A<B> {} |
| |
| struct X; |
| impl A<()> for X {} |
| |
| fn multi<I>(_reducer: I) |
| where |
| I: for<'a> DistributedIteratorMulti<&'a ()>, |
| { |
| DistributedIterator::reduce(Connect::<I>(PhantomData)) |
| } |
| |
| fn main() { |
| multi(Map { //~ ERROR implementation of `DistributedIteratorMulti` is not general enough |
| i: Cloned(PhantomData), |
| f: X, |
| }); |
| } |