worldwideportal/src/lua_engine/named_closure.rs
2024-11-17 18:39:34 +11:00

36 lines
831 B
Rust

use gc_arena::Collect;
use gc_arena::Gc;
use gc_arena::Rootable;
use piccolo::{Context, UserData, Value};
use std::rc::Rc;
use wasm_bindgen::prelude::Closure;
#[derive(Collect)]
#[collect(require_static)]
struct ClosureCollect<F: ?Sized> {
#[allow(unused)]
inner: Rc<Closure<F>>,
}
pub fn store_named_global_closure<'gc, F: 'static + ?Sized>(
ctx: Context<'gc>,
name: &'static str,
closure: Closure<F>,
) {
ctx.set_global(
name,
UserData::new::<Rootable![Gc<'_, ClosureCollect<F>>]>(
&ctx,
Gc::new(
&ctx,
ClosureCollect {
inner: Rc::new(closure),
},
),
),
);
}
pub fn release_named_global_closure(ctx: Context, name: &'static str) {
ctx.set_global(name, Value::Nil);
}