rustkov 0.1.0

Markov chain chatbot library
Documentation
use crate::brain_prelude::*;

#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct State(pub(crate) Vec<StateElement>);
impl State {
    pub(crate) fn random_element(&self, rng: &mut dyn RngCore) -> &StateElement {
        self.0.choose(rng).unwrap()
    }
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Transistion {
    pub(crate) prev: Vec<(StateElement, usize)>,
    pub(crate) next: Vec<(StateElement, usize)>,
}
impl Transistion {
    pub(crate) fn increment_occurence(
        &mut self,
        direction: SentenceDirection,
        new_element: &StateElement,
    ) {
        if *new_element == StateElement::Marker(SentenceMarker::Placeholder) {
            return;
        }

        let working_vec = match direction {
            SentenceDirection::Backward => &mut self.prev,
            SentenceDirection::Forward => &mut self.next,
        };

        let mut exists = false;
        for (element, occurence) in working_vec.iter_mut() {
            if element != new_element {
                continue;
            }
            *occurence += 1;
            exists = true;
        }

        if !exists {
            working_vec.push((new_element.clone(), 1));
        }
    }
}