use std::collections::HashMap;
use crate::types::{VerbRoots, WordEntry};
pub const WORDS_DAT: &str = include_str!("../data/words.dat");
pub const VERBS_DAT: &str = include_str!("../data/verbs.dat");
pub const STOPWORDS_DAT: &str = include_str!("../data/stopwords.dat");
pub const ABBREVIATIONS_DAT: &str = include_str!("../data/abbreviations.dat");
pub const INFORMAL_WORDS_DAT: &str = include_str!("../data/iwords.dat");
pub const INFORMAL_VERBS_DAT: &str = include_str!("../data/iverbs.dat");
pub fn parse_words(source: &str) -> HashMap<String, WordEntry> {
let mut map = HashMap::new();
for line in source.lines() {
let parts: Vec<&str> = line.trim().splitn(3, '\t').collect();
if parts.len() != 3 {
continue;
}
let word = parts[0].to_string();
let Ok(frequency) = parts[1].parse::<u64>() else {
continue;
};
let pos_tags = parts[2].split(',').map(str::to_string).collect();
map.insert(word, WordEntry { frequency, pos_tags });
}
map
}
pub fn parse_verbs(source: &str) -> Vec<VerbRoots> {
source
.lines()
.filter(|l| !l.trim().is_empty())
.filter_map(|line| {
let line = line.trim();
let mut parts = line.splitn(2, '#');
let past = parts.next()?.to_string();
let present = parts.next()?.to_string();
Some(VerbRoots { past, present })
})
.collect()
}
pub fn parse_stopwords(source: &str) -> Vec<String> {
let mut words: Vec<String> = source
.lines()
.map(|l| l.trim().to_string())
.filter(|l| !l.is_empty())
.collect::<std::collections::HashSet<_>>()
.into_iter()
.collect();
words.sort();
words
}
pub fn parse_abbreviations(source: &str) -> Vec<String> {
source
.lines()
.map(|l| l.trim().to_string())
.filter(|l| !l.is_empty())
.collect()
}
pub fn words_list() -> std::collections::HashMap<String, crate::types::WordEntry> {
parse_words(WORDS_DAT)
}
pub fn verbs_list() -> Vec<crate::types::VerbRoots> {
parse_verbs(VERBS_DAT)
}
pub fn stopwords_list() -> Vec<String> {
parse_stopwords(STOPWORDS_DAT)
}
pub fn past_roots() -> Vec<String> {
parse_verbs(VERBS_DAT).into_iter().map(|v| v.past).collect()
}
pub fn present_roots() -> Vec<String> {
parse_verbs(VERBS_DAT).into_iter().map(|v| v.present).collect()
}