use tinycoro::Coroutine;
unsafe extern "C" fn example_coroutine(_co: *mut tinycoro::mco_coro) {
println!("Coroutine started!");
println!("About to yield for the first time...");
let _ = tinycoro::yield_current();
println!("Resumed after first yield!");
println!("About to yield for the second time...");
let _ = tinycoro::yield_current();
println!("Resumed after second yield!");
println!("Coroutine finished!");
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== Tinycoro Basic Example ===\n");
let mut coroutine = unsafe { Coroutine::new(example_coroutine, 64 * 1024)? };
println!("Created coroutine with status: {:?}", coroutine.status());
let data = 42u32;
coroutine.push(&data)?;
println!("Pushed data: {}", data);
println!("Bytes stored: {}", coroutine.bytes_stored());
println!("Storage size: {}", coroutine.storage_size());
println!("\n--- First Resume ---");
coroutine.resume()?;
println!(
"Coroutine status after first resume: {:?}",
coroutine.status()
);
println!("\n--- Second Resume ---");
coroutine.resume()?;
println!(
"Coroutine status after second resume: {:?}",
coroutine.status()
);
println!("\n--- Final Resume ---");
coroutine.resume()?;
println!(
"Coroutine status after final resume: {:?}",
coroutine.status()
);
let retrieved_data: u32 = coroutine.pop()?;
println!("\nPopped data: {}", retrieved_data);
assert_eq!(data, retrieved_data);
println!("Bytes stored after pop: {}", coroutine.bytes_stored());
println!("\n--- Working with different data types ---");
let text = "Hello, coroutines!";
coroutine.push(&text)?;
println!("Pushed string: '{}'", text);
#[derive(Debug, PartialEq)]
struct Point {
x: i32,
y: i32,
}
let point = Point { x: 10, y: 20 };
coroutine.push(&point)?;
println!("Pushed point: {:?}", point);
println!("Total bytes stored: {}", coroutine.bytes_stored());
let retrieved_point: Point = coroutine.pop()?;
let retrieved_text: &str = coroutine.pop()?;
println!("Popped point: {:?}", retrieved_point);
println!("Popped string: '{}'", retrieved_text);
assert_eq!(point, retrieved_point);
assert_eq!(text, retrieved_text);
println!("\n=== Example completed successfully! ===");
Ok(())
}