mirror of
https://github.com/rust-lang/rust
synced 2024-11-05 20:45:15 +00:00
52 lines
1 KiB
Rust
52 lines
1 KiB
Rust
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,
|
|
});
|
|
}
|