// Copyright 2017 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. #![feature(generators, generator_trait)] use std::ops::{GeneratorState, Generator}; fn finish(mut amt: usize, mut t: T) -> T::Return where T: Generator { loop { match t.resume() { GeneratorState::Yielded(()) => amt -= 1, GeneratorState::Complete(ret) => { assert_eq!(amt, 0); return ret } } } } fn main() { finish(1, || yield); finish(3, || { let mut x = 0; yield; x += 1; yield; x += 1; yield; assert_eq!(x, 2); }); finish(8, || { for _ in 0..8 { yield; } }); finish(1, || { if true { yield; } else { } }); finish(1, || { if false { } else { yield; } }); finish(2, || { if { yield; false } { yield; panic!() } yield }); }