//@ run-pass #![feature(coroutines, coroutine_trait)] use std::ops::{Coroutine, CoroutineState}; use std::pin::Pin; struct W(T); // This impl isn't safe in general, but the coroutine used in this test is movable // so it won't cause problems. impl + Unpin> Iterator for W { type Item = T::Yield; fn next(&mut self) -> Option { match Pin::new(&mut self.0).resume(()) { CoroutineState::Complete(..) => None, CoroutineState::Yielded(v) => Some(v), } } } fn test() -> impl Coroutine<(), Return = (), Yield = u8> + Unpin { #[coroutine] || { for i in 1..6 { yield i } } } fn main() { let end = 11; let closure_test = |start| { #[coroutine] move || { for i in start..end { yield i } } }; assert!(W(test()).chain(W(closure_test(6))).eq(1..11)); }