use std::error::Error as StdError;
use luajit::{self as lua, ffi::*, macros::cstr};
use types::Function;
use crate::IntoResult;
pub fn schedule<F, R>(fun: F)
where
F: FnOnce(()) -> R + 'static,
R: IntoResult<()>,
R::Error: StdError + 'static,
{
unsafe {
lua::with_state(move |lstate| {
lua_getglobal(lstate, cstr!("vim"));
lua_getfield(lstate, -1, cstr!("schedule"));
let fun = Function::from_fn_once(fun);
lua_rawgeti(lstate, LUA_REGISTRYINDEX, fun.lua_ref());
lua_call(lstate, 1, 0);
lua_pop(lstate, 1);
luaL_unref(lstate, LUA_REGISTRYINDEX, fun.lua_ref());
})
};
}