pub fn csw() -> i32 {
static mut FUNCTION_DEFINED: bool = false;
let lua = crate::lua_state();
if unsafe { !FUNCTION_DEFINED } {
#[rustfmt::skip]
lua.exec(r#"
function fiber_csw()
local fiber = require('fiber')
return fiber.info()[fiber.id()].csw
end
"#).unwrap();
unsafe {
FUNCTION_DEFINED = true;
}
}
lua.get::<crate::tlua::LuaFunction<_>, _>("fiber_csw")
.unwrap()
.into_call()
.unwrap()
}
pub fn check_yield<F, T>(f: F) -> YieldResult<T>
where
F: FnOnce() -> T,
{
let csw_before = csw();
let res = f();
if csw() == csw_before {
YieldResult::DidntYield(res)
} else {
YieldResult::Yielded(res)
}
}
#[derive(Debug, PartialEq, Eq)]
pub enum YieldResult<T> {
DidntYield(T),
Yielded(T),
}