logisheets_controller 0.2.1

the core of LogiSheets
Documentation
use logisheets_base::{
    async_func::{AsyncCalcResult, Task},
    CellId,
};

use crate::SheetId;

#[derive(Default)]
pub struct AsyncFuncManager {
    pub values: std::collections::HashMap<Task, AsyncCalcResult>,
    pub queue: Vec<Task>,
    pub dirties: Vec<(SheetId, CellId)>,
}

impl AsyncFuncManager {
    pub fn add_value(&mut self, t: Task, v: AsyncCalcResult) {
        self.values.insert(t, v);
    }

    pub fn query_or_commit(
        &mut self,
        t: Task,
        sheet_id: SheetId,
        cell_id: CellId,
    ) -> Option<AsyncCalcResult> {
        if let Some(res) = self.values.get(&t) {
            Some(res.clone())
        } else {
            self.dirties.push((sheet_id, cell_id));
            self.queue.push(t);
            None
        }
    }

    pub fn get_calc_tasks(&mut self) -> (Vec<Task>, Vec<(SheetId, CellId)>) {
        let mut empty_tasks = Vec::<Task>::new();
        let mut empty_dirty = Vec::<(SheetId, CellId)>::new();
        std::mem::swap(&mut empty_tasks, &mut self.queue);
        std::mem::swap(&mut empty_dirty, &mut self.dirties);
        (empty_tasks, empty_dirty)
    }
}