use crate::{primitive_set::EnginePrimitiveSet, EngineError};
use any_fn::AnyFn;
#[cfg(doc)]
use stak_dynamic::DynamicPrimitiveSet;
use stak_dynamic::SchemeValue;
use stak_module::Module;
use stak_vm::{Error, Value, Vm};
const DEFAULT_VALUE_COUNT: usize = 1 << 10;
pub struct Engine<'a, 'b, const N: usize = DEFAULT_VALUE_COUNT> {
vm: Vm<'a, EnginePrimitiveSet<'a, 'b, N>>,
}
impl<'a, 'b, const N: usize> Engine<'a, 'b, N> {
pub fn new(heap: &'a mut [Value], functions: &'a mut [AnyFn<'b>]) -> Result<Self, Error> {
Ok(Self {
vm: Vm::new(heap, EnginePrimitiveSet::new(functions))?,
})
}
pub fn run(&mut self, module: &'static impl Module<'static>) -> Result<(), EngineError> {
self.vm.initialize(module.bytecode().iter().copied())?;
self.vm.run()
}
pub fn register_type<T: SchemeValue + 'static>(&mut self) {
self.vm
.primitive_set_mut()
.dynamic_mut()
.register_type::<T>()
}
}