neovm-core 0.0.1

Core runtime structures for NeoVM
use std::cell::RefCell;
use std::rc::Rc;

use crate::emacs_core::value::Value;

#[derive(Clone)]
pub struct SharedUndoState {
    inner: Rc<RefCell<SharedUndoStateInner>>,
}

#[derive(Clone)]
struct SharedUndoStateInner {
    list: Value,
    in_progress: bool,
    recorded_first_change: bool,
}

impl SharedUndoState {
    pub fn new() -> Self {
        Self::from_parts(Value::NIL, false, false)
    }

    pub fn from_parts(list: Value, in_progress: bool, recorded_first_change: bool) -> Self {
        Self {
            inner: Rc::new(RefCell::new(SharedUndoStateInner {
                list,
                in_progress,
                recorded_first_change,
            })),
        }
    }

    pub fn shares_with(&self, other: &Self) -> bool {
        Rc::ptr_eq(&self.inner, &other.inner)
    }

    pub fn list(&self) -> Value {
        self.inner.borrow().list
    }

    pub fn set_list(&self, list: Value) {
        self.inner.borrow_mut().list = list;
    }

    pub fn in_progress(&self) -> bool {
        self.inner.borrow().in_progress
    }

    pub fn set_in_progress(&self, in_progress: bool) {
        self.inner.borrow_mut().in_progress = in_progress;
    }

    pub fn recorded_first_change(&self) -> bool {
        self.inner.borrow().recorded_first_change
    }

    pub fn set_recorded_first_change(&self, recorded_first_change: bool) {
        self.inner.borrow_mut().recorded_first_change = recorded_first_change;
    }

    pub fn trace_roots(&self, roots: &mut Vec<Value>) {
        roots.push(self.list());
    }
}