use std::time::Duration; use mlua::{Function, Lua, Result, Table, Value, Variadic}; use tokio::time; use crate::utils::table_builder::ReadonlyTableBuilder; const DEFAULT_SLEEP_DURATION: f32 = 1.0 / 60.0; pub fn new(lua: &Lua) -> Result { ReadonlyTableBuilder::new(lua)? .with_async_function( "defer", |lua, (func, args): (Function, Variadic)| async move { let thread = lua.create_thread(func)?; thread.into_async(args).await?; Ok(()) }, )? .with_async_function( "delay", |lua, (func, duration, args): (Function, Option, Variadic)| async move { let secs = duration.unwrap_or(DEFAULT_SLEEP_DURATION); time::sleep(Duration::from_secs_f32(secs)).await; let thread = lua.create_thread(func)?; thread.into_async(args).await?; Ok(()) }, )? .with_async_function( "spawn", |lua, (func, args): (Function, Variadic)| async move { let thread = lua.create_thread(func)?; thread.into_async(args).await?; Ok(()) }, )? .with_async_function("wait", |_, duration: Option| async move { let secs = duration.unwrap_or(DEFAULT_SLEEP_DURATION); time::sleep(Duration::from_secs_f32(secs)).await; Ok(secs) })? .build() }