use napi::bindgen_prelude::*;
use napi_derive::napi;
#[napi]
pub fn levenshtein_distance(a: String, b: String) -> u32 {
crate::algo::levenshtein::distance(&a, &b) as u32
}
#[napi]
pub fn levenshtein_similarity(a: String, b: String) -> f64 {
crate::algo::levenshtein::similarity(&a, &b)
}
#[napi]
pub fn jaro_winkler_similarity(a: String, b: String) -> f64 {
crate::algo::jaro_winkler::similarity(&a, &b)
}
#[napi]
pub fn hamming_distance(a: String, b: String) -> Result<u32> {
crate::algo::hamming::distance(&a, &b)
.map(|d| d as u32)
.ok_or_else(|| napi::Error::from_reason("Strings must have equal length"))
}
#[napi]
pub fn hamming_similarity(a: String, b: String) -> Result<f64> {
crate::algo::hamming::similarity(&a, &b)
.ok_or_else(|| napi::Error::from_reason("Strings must have equal length"))
}
#[napi]
pub fn jaccard_similarity(a: String, b: String, n: i32) -> f64 {
crate::algo::jaccard::similarity(&a, &b, n as usize)
}
#[napi]
pub fn jaccard_bigram_similarity(a: String, b: String) -> f64 {
crate::algo::jaccard::bigram_similarity(&a, &b)
}
#[napi]
pub fn jaccard_trigram_similarity(a: String, b: String) -> f64 {
crate::algo::jaccard::trigram_similarity(&a, &b)
}
#[napi]
pub fn jaccard_word_similarity(a: String, b: String) -> f64 {
crate::algo::jaccard::word_similarity(&a, &b)
}
#[napi]
pub fn minhash_signature(text: String, shingle_size: i32, num_hashes: i32) -> Vec<u32> {
let sig = crate::algo::minhash::signature(&text, shingle_size as usize, num_hashes as usize);
sig.signatures.iter().map(|&v| v as u32).collect()
}
#[napi]
pub fn minhash_similarity(a: String, b: String, shingle_size: i32, num_hashes: i32) -> f64 {
crate::algo::minhash::compare(&a, &b, shingle_size as usize, num_hashes as usize)
}
#[napi]
pub fn minhash_similarity_default(a: String, b: String) -> f64 {
crate::algo::minhash::compare_default(&a, &b)
}
#[napi]
pub fn simhash_fingerprint(text: String, shingle_size: i32) -> u32 {
crate::algo::simhash::fingerprint(&text, shingle_size as usize).0 as u32
}
#[napi]
pub fn simhash_fingerprint_default(text: String) -> u32 {
crate::algo::simhash::fingerprint_default(&text).0 as u32
}
#[napi]
pub fn simhash_similarity(a: String, b: String, shingle_size: i32) -> f64 {
crate::algo::simhash::compare(&a, &b, shingle_size as usize)
}
#[napi]
pub fn simhash_similarity_default(a: String, b: String) -> f64 {
crate::algo::simhash::compare_default(&a, &b)
}
#[napi]
pub fn bm25_similarity(a: String, b: String) -> f64 {
crate::algo::bm25::similarity(&a, &b)
}
#[napi]
pub fn tfidf_similarity(a: String, b: String) -> f64 {
crate::algo::tfidf::similarity(&a, &b)
}
#[napi]
pub fn clean_text(text: String) -> String {
crate::preprocess::clean(&text)
}
#[napi]
pub fn clean_text_stopwords(text: String) -> String {
crate::preprocess::clean_with_stopwords(&text)
}