use super::Reasoner;
use crate::{control::ReasonContextCoreOut, entity::Task, global::Float};
use navm::output::Output;
use serde::{Deserialize, Serialize};
use std::collections::VecDeque;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub(super) struct ReasonRecorder {
cached_outputs: VecDeque<Output>,
}
impl ReasonRecorder {
pub fn put(&mut self, output: Output) {
self.cached_outputs.push_back(output)
}
pub fn take(&mut self) -> Option<Output> {
self.cached_outputs.pop_front()
}
pub fn reset(&mut self) {
self.cached_outputs.clear()
}
}
pub mod util_outputs {
use crate::{
entity::{Judgement, Task},
global::Float,
util::ToDisplayAndBrief,
};
use narsese::api::NarseseValue;
use navm::output::Output;
pub const COMMENT_VOLUME_THRESHOLD: usize = 100;
pub const COMMENT_VOLUME_THRESHOLD_PERCENT: Float = (COMMENT_VOLUME_THRESHOLD as Float) / 100.0;
pub fn output_comment(message: impl ToString) -> Output {
Output::COMMENT {
content: message.to_string(),
}
}
pub fn output_error(description: impl ToString) -> Output {
Output::ERROR {
description: description.to_string(),
}
}
pub fn output_info(message: impl ToString) -> Output {
Output::INFO {
message: message.to_string(),
}
}
pub fn output_out(narsese: &Task) -> Output {
Output::OUT {
content_raw: format!("Derived: {}", narsese.to_display_brief()),
narsese: Some(NarseseValue::Task(narsese.to_lexical())),
}
}
pub fn output_in(narsese: &Task) -> Output {
Output::IN {
content: format!("In: {}", narsese.to_display_brief()),
narsese: Some(NarseseValue::Task(narsese.to_lexical())),
}
}
pub fn output_answer(new_belief: &impl Judgement) -> Output {
Output::ANSWER {
content_raw: format!("Answer: {}", new_belief.to_display_brief()),
narsese: Some(NarseseValue::Sentence(new_belief.judgement_to_lexical())),
}
}
}
impl ReasonContextCoreOut {
pub fn report_comment(&mut self, message: impl ToString, silence_percent: Float) {
if silence_percent < util_outputs::COMMENT_VOLUME_THRESHOLD_PERCENT {
return;
}
self.add_output(util_outputs::output_comment(message))
}
pub fn report_out(&mut self, narsese: &Task) {
self.add_output(util_outputs::output_out(narsese))
}
pub fn report_error(&mut self, description: impl ToString) {
self.add_output(util_outputs::output_error(description))
}
}
impl Reasoner {
pub fn report(&mut self, output: Output) {
self.recorder.put(output);
}
pub fn report_comment(&mut self, message: impl ToString) {
if self.volume() >= util_outputs::COMMENT_VOLUME_THRESHOLD {
self.report(util_outputs::output_comment(message));
}
}
pub fn report_info(&mut self, message: impl ToString) {
self.report(util_outputs::output_info(message));
}
#[doc(alias = "report_input")]
pub fn report_in(&mut self, narsese: &Task) {
self.report(util_outputs::output_in(narsese));
}
#[doc(alias = "report_derived")]
pub fn report_out(&mut self, narsese: &Task) {
self.report(util_outputs::output_out(narsese));
}
pub fn report_error(&mut self, description: impl ToString) {
self.report(util_outputs::output_error(description));
}
}