Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #![allow(dead_code)]
- use std::cell::RefCell;
- use std::marker::PhantomData;
- // Lua is Send but !Sync
- struct Lua(RefCell<()>);
- struct LuaValue<'a>(&'a Lua);
- trait ToLua<'a> {
- fn to_lua(self, &'a Lua) -> LuaValue<'a>;
- }
- trait FromLua<'a> {
- fn from_lua(&'a Lua, LuaValue<'a>) -> Self;
- }
- struct LuaTable<'a>(&'a Lua);
- impl<'a> ToLua<'a> for LuaTable<'a> {
- fn to_lua(self, lua: &'a Lua) -> LuaValue<'a> {
- LuaValue(lua)
- }
- }
- impl<'a> FromLua<'a> for LuaTable<'a> {
- fn from_lua(lua: &'a Lua, _: LuaValue<'a>) -> Self {
- LuaTable(lua)
- }
- }
- type LuaCallback = Box<for<'a> Fn(&'a Lua, LuaValue<'a>) -> LuaValue<'a> + Send>;
- fn example_function<'a>(_lua: &'a Lua, arg: LuaTable<'a>) -> LuaTable<'a> {
- arg
- }
- trait CallbackTrait<'lua> {
- fn to_callback(self) -> Box<Fn(&'lua Lua, LuaValue<'lua>) -> LuaValue<'lua> + Send>;
- }
- struct Wrapper<A, R, F>(F, PhantomData<(A, R)>);
- impl<'lua, A, R, F> CallbackTrait<'lua> for Wrapper<A, R, F>
- where
- A: FromLua<'lua>,
- R: ToLua<'lua>,
- F: Fn(&'lua Lua, A) -> R + 'static + Send,
- {
- fn to_callback(self) -> Box<Fn(&'lua Lua, LuaValue<'lua>) -> LuaValue<'lua> + Send> {
- let f = self.0;
- Box::new(move |lua, arg| f(lua, FromLua::from_lua(lua, arg)).to_lua(lua))
- }
- }
- fn wrap_callback<A, R, F>(f: F) -> LuaCallback
- where
- Wrapper<A, R, F>: for<'lua> CallbackTrait<'lua>,
- {
- Wrapper(f, PhantomData).to_callback()
- }
- fn main() {}
Add Comment
Please, Sign In to add comment