]>
Commit | Line | Data |
---|---|---|
532ac7d7 XL |
1 | use std::marker::PhantomData; |
2 | ||
3 | trait DistributedIterator { | |
4 | fn reduce(self) | |
5 | where | |
6 | Self: Sized, | |
7 | { | |
8 | unreachable!() | |
9 | } | |
10 | } | |
11 | ||
12 | trait DistributedIteratorMulti<Source> { | |
13 | type Item; | |
14 | } | |
15 | ||
16 | struct Connect<I>(PhantomData<fn(I)>); | |
17 | impl<I: for<'a> DistributedIteratorMulti<&'a ()>> DistributedIterator for Connect<I> where {} | |
18 | ||
19 | struct Cloned<Source>(PhantomData<fn(Source)>); | |
20 | impl<'a, Source> DistributedIteratorMulti<&'a Source> for Cloned<&'a Source> { | |
21 | type Item = (); | |
22 | } | |
23 | ||
24 | struct Map<I, F> { | |
25 | i: I, | |
26 | f: F, | |
27 | } | |
28 | impl<I: DistributedIteratorMulti<Source>, F, Source> DistributedIteratorMulti<Source> for Map<I, F> | |
29 | where | |
30 | F: A<<I as DistributedIteratorMulti<Source>>::Item>, | |
31 | { | |
32 | type Item = (); | |
33 | } | |
34 | ||
35 | trait A<B> {} | |
36 | ||
37 | struct X; | |
38 | impl A<()> for X {} | |
39 | ||
40 | fn multi<I>(_reducer: I) | |
41 | where | |
42 | I: for<'a> DistributedIteratorMulti<&'a ()>, | |
43 | { | |
44 | DistributedIterator::reduce(Connect::<I>(PhantomData)) | |
45 | } | |
46 | ||
47 | fn main() { | |
48 | multi(Map { //~ ERROR implementation of `DistributedIteratorMulti` is not general enough | |
49 | i: Cloned(PhantomData), | |
50 | f: X, | |
51 | }); | |
52 | } |