| // This demonstrates a proposed alternate or additional option of having yield in postfix position. |
| |
| //@ run-pass |
| //@ edition: 2024 |
| |
| #![feature(gen_blocks, coroutines, coroutine_trait, yield_expr, stmt_expr_attributes)] |
| |
| use std::ops::{Coroutine, CoroutineState}; |
| use std::pin::pin; |
| |
| fn main() { |
| // generators (i.e. yield doesn't return anything useful) |
| let mut gn = gen { |
| yield 1; |
| 2.yield; |
| }; |
| |
| assert_eq!(gn.next(), Some(1)); |
| assert_eq!(gn.next(), Some(2)); |
| assert_eq!(gn.next(), None); |
| |
| //coroutines (i.e. yield returns something useful) |
| let mut coro = pin!( |
| #[coroutine] |
| |_: i32| { |
| let x = 1.yield; |
| (x + 2).yield; |
| } |
| ); |
| |
| assert_eq!(coro.as_mut().resume(0), CoroutineState::Yielded(1)); |
| assert_eq!(coro.as_mut().resume(2), CoroutineState::Yielded(4)); |
| assert_eq!(coro.as_mut().resume(3), CoroutineState::Complete(())); |
| } |