use std::collections::HashMap;
use hemtt_tokens::Token;
use strsim::levenshtein;
use crate::Definition;
pub type Defines = HashMap<String, (Token, Definition)>;
pub trait DefinitionLibrary {
fn similar_function(&self, search: &str, args: Option<usize>) -> Vec<&str>;
}
impl DefinitionLibrary for Defines {
fn similar_function(&self, search: &str, args: Option<usize>) -> Vec<&str> {
let mut similar = self
.iter()
.filter(|(_, (_, def))| {
let Definition::Function(func) = def else {
return false;
};
args.map_or(true, |args| func.parameters().len() == args)
})
.map(|(name, _)| (name.as_str(), levenshtein(name, search)))
.collect::<Vec<_>>();
similar.sort_by_key(|(_, v)| *v);
similar.retain(|s| s.1 <= 3);
if similar.len() > 3 {
similar.truncate(3);
}
similar.into_iter().map(|(n, _)| n).collect::<Vec<_>>()
}
}