use std::sync::{Arc, RwLock}; use mlua::prelude::*; use super::{cell::Cell, Sheet}; pub trait LuaForEach { fn lua_foreach<'lua>( &self, func: LuaFunction<'lua>, range: Vec<(usize, usize)>, ) -> Result<(), LuaError>; } impl LuaForEach for Arc> { fn lua_foreach<'lua>( &self, func: LuaFunction<'lua>, range: Vec<(usize, usize)>, ) -> Result<(), LuaError> { let mut this = self.write().unwrap(); let mut sheet = this.clone(); for (row, column) in range.iter() { let cellref = this.get_ref(*row, *column); match func.call::<_, Cell>(cellref) { Ok(cell) => sheet.set_cell(*row, *column, cell), Err(error) => return Err(error), } } this.apply(sheet); Ok(()) } }