use borrowscope_runtime::*;
use std::cell::OnceCell;
use std::sync::OnceLock;
fn main() {
reset();
println!("=== OnceCell/OnceLock Tracking Demo ===\n");
println!("--- OnceCell (single-threaded) ---");
let cell: OnceCell<String> = track_once_cell_new("config", "main:1", OnceCell::new());
let value = track_once_cell_get("config", "main:2", cell.get());
println!("Before init: {:?}", value);
let result = track_once_cell_set("config", "main:3", cell.set(String::from("initialized")));
println!("Set result: {:?}", result);
let value = track_once_cell_get("config", "main:4", cell.get());
println!("After init: {:?}", value);
let result = track_once_cell_set("config", "main:5", cell.set(String::from("second")));
println!("Second set result: {:?}", result);
println!("\n--- OnceLock (thread-safe) ---");
let lock: OnceLock<i32> = track_once_lock_new("counter", "main:6", OnceLock::new());
let _ = track_once_cell_set("counter", "main:7", lock.set(42));
let value = track_once_cell_get("counter", "main:8", lock.get());
println!("OnceLock value: {:?}", value);
println!("\n--- get_or_init pattern ---");
let lazy: OnceCell<Vec<i32>> = OnceCell::new();
let was_init = lazy.get().is_some();
let data = lazy.get_or_init(|| vec![1, 2, 3]);
let _ = track_once_cell_get_or_init("lazy_data", was_init, "main:9", data);
println!("Lazy initialized: {:?}", data);
println!("\n=== Tracked Events ===");
for event in get_events() {
println!("{:?}", event);
}
}