1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
use std::sync::{Arc, RwLock};
use mlua::prelude::*;
use super::{cell::Cell, Sheet};
pub trait LuaMap {
fn lua_map<'lua>(
&self,
func: LuaFunction<'lua>,
range: Vec<(usize, usize)>,
) -> Result<(), LuaError>;
}
impl LuaMap for Arc<RwLock<Sheet>> {
fn lua_map<'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(())
}
}
|