use crate::sign::ResidualSign;
use crate::grammar::GrammarState;
use crate::bank::HeuristicsBank;
use crate::episode::Episode;
use crate::provenance::ProvenanceTag;
use crate::motif::Motif;
pub trait Enduce {
fn enduce(
&self,
signs: &[ResidualSign],
grammar_path: &[GrammarState],
bank: &HeuristicsBank,
step_range: (usize, usize),
add_descriptor: &str,
) -> Episode;
}
pub struct DefaultEnduce;
impl Enduce for DefaultEnduce {
fn enduce(
&self,
signs: &[ResidualSign],
grammar_path: &[GrammarState],
bank: &HeuristicsBank,
step_range: (usize, usize),
add_descriptor: &str,
) -> Episode {
let persistence = grammar_path.iter()
.rev()
.take_while(|&&g| g == *grammar_path.last().unwrap_or(&GrammarState::Admissible))
.count();
let motif = if bank.is_empty() {
Motif::Unknown
} else {
bank.match_episode(signs, grammar_path, persistence)
};
let tag = ProvenanceTag::new(
signs.to_vec(),
grammar_path.to_vec(),
add_descriptor,
step_range,
);
Episode::new(motif, tag)
}
}