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