use crate::ops::string_similarity::jaro::jaro_unchecked;
use crate::ops::string_similarity::validation::{validate_pair, SimilarityError};
pub const PREFIX_LIMIT: usize = 4;
pub const PREFIX_SCALE: f32 = 0.1;
pub fn jaro_winkler(a: &[u8], b: &[u8]) -> Result<f32, SimilarityError> {
validate_pair(a, b)?;
let jaro = jaro_unchecked(a, b);
let prefix = a
.iter()
.zip(b)
.take(PREFIX_LIMIT)
.take_while(|(left, right)| left == right)
.count() as f32;
Ok(jaro + prefix * PREFIX_SCALE * (1.0 - jaro))
}
pub fn jaro_winkler_bits(a: &[u8], b: &[u8]) -> Result<u32, SimilarityError> {
Ok(jaro_winkler(a, b)?.to_bits())
}