sim-kernel 0.3.0

Small protocol kernel contracts for the expandable SIM Rust runtime.
Documentation
use crate::{
    datum_store::BTreeDatumStore, error::Result, fact_store::BTreeFactStore, library::Registry,
};

use super::{Cx, load_ledger::LibLoadLedger};

pub(crate) struct LibraryState {
    pub(crate) registry: Registry,
    datum_store: BTreeDatumStore,
    facts: BTreeFactStore,
    lib_load_ledger: LibLoadLedger,
}

impl Cx {
    pub(crate) fn library_state(&self) -> LibraryState {
        LibraryState {
            registry: self.registry.clone(),
            datum_store: self.datum_store.clone(),
            facts: self.facts.clone(),
            lib_load_ledger: self.lib_load_ledger.clone(),
        }
    }

    pub(crate) fn commit_library_state(&mut self, state: LibraryState) {
        self.registry = state.registry;
        self.datum_store = state.datum_store;
        self.facts = state.facts;
        self.lib_load_ledger = state.lib_load_ledger;
    }

    pub(crate) fn with_library_state<T>(
        &mut self,
        state: &mut LibraryState,
        f: impl FnOnce(&mut Self) -> Result<T>,
    ) -> Result<T> {
        std::mem::swap(&mut self.registry, &mut state.registry);
        std::mem::swap(&mut self.datum_store, &mut state.datum_store);
        std::mem::swap(&mut self.facts, &mut state.facts);
        std::mem::swap(&mut self.lib_load_ledger, &mut state.lib_load_ledger);
        let result = f(self);
        std::mem::swap(&mut self.registry, &mut state.registry);
        std::mem::swap(&mut self.datum_store, &mut state.datum_store);
        std::mem::swap(&mut self.facts, &mut state.facts);
        std::mem::swap(&mut self.lib_load_ledger, &mut state.lib_load_ledger);
        result
    }
}