use super::{ReasonContext, ReasonContextCore, ReasonContextCoreOut};
use crate::{
__delegate_from_core,
control::Reasoner,
entity::{Concept, RCTask, Task},
global::{ClockTime, Float},
language::Term,
parameters::Parameters,
storage::Memory,
};
use navm::output::Output;
#[derive(Debug)]
pub struct ReasonContextDirect<'this> {
pub(crate) core: ReasonContextCore<'this>,
pub(crate) outs: ReasonContextCoreOut,
pub(crate) current_task: RCTask,
}
impl<'this> ReasonContextDirect<'this> {
pub fn new<'r: 'this>(
reasoner: &'r mut Reasoner,
current_concept: Concept,
current_task: RCTask,
) -> Self {
let core = ReasonContextCore::new(reasoner, current_concept);
let outs = ReasonContextCoreOut::new();
Self {
core,
outs,
current_task,
}
}
pub fn memory_mut(&mut self) -> &mut Memory {
self.core.memory_mut()
}
pub fn key_to_concept_mut(&mut self, key: &str) -> Option<&mut Concept> {
match key == Memory::term_to_key(self.current_term()) {
true => Some(self.current_concept_mut()),
false => self.memory_mut().key_to_concept_mut(key),
}
}
pub fn get_concept_or_create(&mut self, term: &Term) -> Option<&mut Concept> {
match term == self.current_term() {
true => Some(self.current_concept_mut()),
false => self.memory_mut().get_concept_or_create(term),
}
}
}
impl ReasonContext for ReasonContextDirect<'_> {
__delegate_from_core! {}
fn current_task<'r, 's: 'r>(&'s self) -> impl std::ops::Deref<Target = RCTask> + 'r {
&self.current_task
}
fn current_task_mut<'r, 's: 'r>(&'s mut self) -> impl std::ops::DerefMut<Target = RCTask> + 'r {
&mut self.current_task
}
fn absorbed_by_reasoner(self) {
self.core.absorbed_by_reasoner(self.outs);
}
}