]>
Commit | Line | Data |
---|---|---|
b7449926 XL |
1 | // run-pass |
2 | ||
0531ce1d | 3 | #![feature(generators, generator_trait)] |
ea8adc8c | 4 | |
9fa01778 | 5 | use std::marker::Unpin; |
ea8adc8c | 6 | use std::ops::{GeneratorState, Generator}; |
9fa01778 | 7 | use std::pin::Pin; |
ea8adc8c XL |
8 | |
9 | struct W<T>(T); | |
10 | ||
0531ce1d XL |
11 | // This impl isn't safe in general, but the generator used in this test is movable |
12 | // so it won't cause problems. | |
74b04a01 | 13 | impl<T: Generator<(), Return = ()> + Unpin> Iterator for W<T> { |
ea8adc8c XL |
14 | type Item = T::Yield; |
15 | ||
16 | fn next(&mut self) -> Option<Self::Item> { | |
74b04a01 | 17 | match Pin::new(&mut self.0).resume(()) { |
ea8adc8c XL |
18 | GeneratorState::Complete(..) => None, |
19 | GeneratorState::Yielded(v) => Some(v), | |
20 | } | |
21 | } | |
22 | } | |
23 | ||
74b04a01 | 24 | fn test() -> impl Generator<(), Return=(), Yield=u8> + Unpin { |
ea8adc8c XL |
25 | || { |
26 | for i in 1..6 { | |
27 | yield i | |
28 | } | |
29 | } | |
30 | } | |
31 | ||
32 | fn main() { | |
33 | let end = 11; | |
34 | ||
35 | let closure_test = |start| { | |
36 | move || { | |
37 | for i in start..end { | |
38 | yield i | |
39 | } | |
40 | } | |
41 | }; | |
42 | ||
43 | assert!(W(test()).chain(W(closure_test(6))).eq(1..11)); | |
44 | } |