use crate::control::{ReasonContextConcept, ReasonContextDirect, ReasonContextTransform};
#[derive(Debug, Clone, Copy)]
pub struct InferenceEngine {
#[doc(alias = "direct_process")]
direct: fn(&mut ReasonContextDirect),
#[doc(alias = "transform_task")]
transform: fn(&mut ReasonContextTransform),
#[doc(alias = "match_links")]
matching: fn(&mut ReasonContextConcept),
#[doc(alias = "concept_reason")]
reason: fn(&mut ReasonContextConcept),
}
impl InferenceEngine {
#[inline]
pub const fn new(
direct: fn(&mut ReasonContextDirect),
transform: fn(&mut ReasonContextTransform),
matching: fn(&mut ReasonContextConcept),
reason: fn(&mut ReasonContextConcept),
) -> Self {
Self {
direct,
transform,
matching,
reason,
}
}
pub const VOID: Self = Self::new(|_| {}, |_| {}, |_| {}, |_| {});
pub const ECHO: Self = {
use crate::{
control::{ReasonContext, ReasonContextWithLinks},
util::ToDisplayAndBrief,
};
use nar_dev_utils::{OptionBoost, RefCount};
fn direct(context: &mut ReasonContextDirect) {
context.report_comment(format!(
"#Inference - Direct:\nconcept: {}\ntask: {}",
context.current_concept().to_display_long(),
context.current_task().get_().to_display_long(),
))
}
fn transform(context: &mut ReasonContextTransform) {
context.report_comment(format!(
"#Inference - Transform:\nconcept: {}\ntask-link: {}",
context.current_concept().to_display_long(),
context.current_task_link().to_display_long(),
))
}
fn matching(context: &mut ReasonContextConcept) {
context.report_comment(format!(
"#Inference - Matching:\nconcept: {}\ntask-link: {}\nbelief-link: {}",
context.current_concept().to_display_long(),
context.current_task_link().to_display_long(),
context.current_belief_link().to_display_long(),
))
}
fn reason(context: &mut ReasonContextConcept) {
context.report_comment(format!(
"#Inference - Reason:\nconcept: {}\ntask-link: {}\nbelief-link: {}\nbelief: {}",
context.current_concept().to_display_long(),
context.current_task_link().to_display_long(),
context.current_belief_link().to_display_long(),
context
.current_belief()
.map_unwrap_or(ToDisplayAndBrief::to_display_long, "None".into()),
))
}
Self::new(direct, transform, matching, reason)
};
pub const fn direct_f(&self) -> fn(&mut ReasonContextDirect) {
self.direct
}
pub const fn transform_f(&self) -> fn(&mut ReasonContextTransform) {
self.transform
}
pub const fn matching_f(&self) -> fn(&mut ReasonContextConcept) {
self.matching
}
pub const fn reason_f(&self) -> fn(&mut ReasonContextConcept) {
self.reason
}
}