use std::{collections::HashMap, sync::Mutex};
use lazy_static::lazy_static;
use crate::{Env, Result};
type InitFn = Fn(&Env) -> Result<()> + Send + 'static;
type FnMap = HashMap<String, Box<InitFn>>;
lazy_static! {
pub static ref __INIT_FNS__: Mutex<FnMap> = Mutex::new(HashMap::new());
pub static ref __PREFIX__: Mutex<[String; 2]> = Mutex::new(["".to_owned(), "-".to_owned()]);
pub static ref __MOD_IN_NAME__: Mutex<bool> = Mutex::new(true);
}
fn lisp_name(s: &str) -> String {
s.replace("_", "-")
}
pub fn lisp_pkg(module_path: &str) -> String {
let crate_name = module_path.split("::").nth(0).expect("module_path is empty!");
lisp_name(&crate_name)
}
pub fn lisp_path(module_path: &str) -> String {
let split = module_path.split("::");
let mut path =
__PREFIX__.try_lock().expect("Failed to acquire read lock of module prefix").join("");
for segment in split.skip(1) {
path.push_str(segment);
path.push('-');
}
lisp_name(&path)
}