const R3_VERBS: &[&str] = &[
"self-evolve",
"self-improve",
"self-grade",
"self-optimize",
"self-tune",
"self-evaluate",
];
const R5_OPS: &[&str] = &["auto-close", "auto-prune", "self-stop", "auto-inherit"];
fn hits(text: &str, words: &[&str]) -> Vec<String> {
let lower = text.to_lowercase();
words
.iter()
.filter(|w| lower.contains(*w))
.map(|w| w.to_string())
.collect()
}
pub fn r3_self_evolve(text: &str) -> Vec<String> {
hits(text, R3_VERBS)
}
pub fn r5_forbidden_op(text: &str) -> Vec<String> {
hits(text, R5_OPS)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn r3_should_return_the_verb_when_the_system_is_a_self_evolve_subject() {
let text = "the retrieval system will self-evolve its schema";
let hits = r3_self_evolve(text);
assert_eq!(hits, vec!["self-evolve".to_string()]);
}
#[test]
fn r3_should_return_no_hits_when_text_is_ordinary() {
let text = "build our own retrieval; reject pgvector";
let hits = r3_self_evolve(text);
assert!(hits.is_empty());
}
#[test]
fn r5_should_return_the_op_when_text_describes_an_auto_close() {
let text = "the system will auto-close stale grounds";
let hits = r5_forbidden_op(text);
assert_eq!(hits, vec!["auto-close".to_string()]);
}
}