Skip to main content

distance_wasm/
lib.rs

1use wasm_bindgen::prelude::*;
2
3pub mod edit;
4pub mod search;
5pub mod token;
6pub mod utils;
7
8#[cfg(feature = "console_error_panic_hook")]
9#[wasm_bindgen(start)]
10pub fn init() {
11    console_error_panic_hook::set_once();
12}
13
14// ============================================================================
15// Edit Distance
16// ============================================================================
17
18#[wasm_bindgen]
19pub fn levenshtein(s1: &str, s2: &str) -> u32 { edit::levenshtein(s1, s2) }
20
21#[wasm_bindgen]
22pub fn levenshtein_normalized(s1: &str, s2: &str) -> f64 { edit::levenshtein_normalized(s1, s2) }
23
24#[wasm_bindgen]
25pub fn damerau_levenshtein(s1: &str, s2: &str) -> u32 { edit::damerau_levenshtein(s1, s2) }
26
27#[wasm_bindgen]
28pub fn damerau_levenshtein_normalized(s1: &str, s2: &str) -> f64 { edit::damerau_levenshtein_normalized(s1, s2) }
29
30#[wasm_bindgen]
31pub fn jaro(s1: &str, s2: &str) -> f64 { edit::jaro(s1, s2) }
32
33#[wasm_bindgen]
34pub fn jarowinkler(s1: &str, s2: &str) -> f64 { edit::jaro_winkler(s1, s2) }
35
36#[wasm_bindgen]
37pub fn hamming(s1: &str, s2: &str) -> u32 { edit::hamming(s1, s2) }
38
39#[wasm_bindgen]
40pub fn hamming_normalized(s1: &str, s2: &str) -> f64 { edit::hamming_normalized(s1, s2) }
41
42#[wasm_bindgen]
43pub fn sift4_simple(s1: &str, s2: &str) -> u32 { edit::sift4_simple(s1, s2) }
44
45#[wasm_bindgen]
46pub fn sift4_simple_normalized(s1: &str, s2: &str) -> f64 { edit::sift4_simple_normalized(s1, s2) }
47
48// ============================================================================
49// Sequence-based
50// ============================================================================
51
52#[wasm_bindgen]
53pub fn lcs_seq(s1: &str, s2: &str) -> u32 { edit::lcs_seq(s1, s2) }
54
55#[wasm_bindgen]
56pub fn lcs_seq_normalized(s1: &str, s2: &str) -> f64 { edit::lcs_seq_normalized(s1, s2) }
57
58#[wasm_bindgen]
59pub fn lcs_str(s1: &str, s2: &str) -> u32 { edit::lcs_str(s1, s2) }
60
61#[wasm_bindgen]
62pub fn lcs_str_normalized(s1: &str, s2: &str) -> f64 { edit::lcs_str_normalized(s1, s2) }
63
64#[wasm_bindgen]
65pub fn ratcliff_obershelp(s1: &str, s2: &str) -> f64 { edit::ratcliff_obershelp(s1, s2) }
66
67#[wasm_bindgen]
68pub fn smith_waterman(s1: &str, s2: &str) -> u32 { edit::smith_waterman(s1, s2) }
69
70#[wasm_bindgen]
71pub fn smith_waterman_normalized(s1: &str, s2: &str) -> f64 { edit::smith_waterman_normalized(s1, s2) }
72
73#[wasm_bindgen]
74pub fn needleman_wunsch(s1: &str, s2: &str) -> i32 { edit::needleman_wunsch(s1, s2) }
75
76#[wasm_bindgen]
77pub fn needleman_wunsch_normalized(s1: &str, s2: &str) -> f64 { edit::needleman_wunsch_normalized(s1, s2) }
78
79#[wasm_bindgen]
80pub fn gotoh(s1: &str, s2: &str) -> f64 { edit::gotoh(s1, s2) }
81
82#[wasm_bindgen]
83pub fn gotoh_normalized(s1: &str, s2: &str) -> f64 { edit::gotoh_normalized(s1, s2) }
84
85#[wasm_bindgen]
86pub fn monge_elkan(s1: &str, s2: &str) -> f64 { edit::monge_elkan(s1, s2) }
87
88#[wasm_bindgen]
89pub fn monge_elkan_symmetric(s1: &str, s2: &str) -> f64 { edit::monge_elkan_symmetric(s1, s2) }
90
91#[wasm_bindgen]
92pub fn bag_distance(s1: &str, s2: &str) -> u32 { edit::bag_distance(s1, s2) }
93
94#[wasm_bindgen]
95pub fn bag_distance_normalized(s1: &str, s2: &str) -> f64 { edit::bag_distance_normalized(s1, s2) }
96
97#[wasm_bindgen]
98pub fn mra(s1: &str, s2: &str) -> u32 { edit::mra(s1, s2) }
99
100#[wasm_bindgen]
101pub fn mra_normalized(s1: &str, s2: &str) -> f64 { edit::mra_normalized(s1, s2) }
102
103// ============================================================================
104// Token Similarity
105// ============================================================================
106
107#[wasm_bindgen]
108pub fn jaccard(s1: &str, s2: &str) -> f64 { token::jaccard(s1, s2) }
109
110#[wasm_bindgen]
111pub fn cosine(s1: &str, s2: &str) -> f64 { token::cosine(s1, s2) }
112
113#[wasm_bindgen]
114pub fn sorensen(s1: &str, s2: &str) -> f64 { token::sorensen(s1, s2) }
115
116#[wasm_bindgen]
117pub fn tversky(s1: &str, s2: &str) -> f64 { token::tversky(s1, s2) }
118
119#[wasm_bindgen]
120pub fn overlap(s1: &str, s2: &str) -> f64 { token::overlap(s1, s2) }
121
122#[wasm_bindgen]
123pub fn jaccard_bigram(s1: &str, s2: &str) -> f64 { token::jaccard_bigram(s1, s2) }
124
125#[wasm_bindgen]
126pub fn cosine_bigram(s1: &str, s2: &str) -> f64 { token::cosine_bigram(s1, s2) }
127
128// ============================================================================
129// Naive
130// ============================================================================
131
132#[wasm_bindgen]
133pub fn prefix(s1: &str, s2: &str) -> f64 { token::prefix(s1, s2) }
134
135#[wasm_bindgen]
136pub fn suffix(s1: &str, s2: &str) -> f64 { token::suffix(s1, s2) }
137
138#[wasm_bindgen]
139pub fn length(s1: &str, s2: &str) -> f64 { token::length(s1, s2) }
140
141// ============================================================================
142// Universal compare
143// ============================================================================
144
145#[wasm_bindgen]
146pub fn compare(s1: &str, s2: &str, algorithm: &str) -> f64 {
147    match algorithm.to_lowercase().as_str() {
148        "levenshtein" => levenshtein_normalized(s1, s2),
149        "damerau_levenshtein" | "damerau-levenshtein" => damerau_levenshtein_normalized(s1, s2),
150        "jaro" => jaro(s1, s2),
151        "jaro_winkler" | "jaro-winkler" | "jarowinkler" => jarowinkler(s1, s2),
152        "hamming" => hamming_normalized(s1, s2),
153        "sift4" | "sift4_simple" => sift4_simple_normalized(s1, s2),
154        "lcs_seq" | "lcs-seq" | "lcsseq" => lcs_seq_normalized(s1, s2),
155        "lcs_str" | "lcs-str" | "lcsstr" => lcs_str_normalized(s1, s2),
156        "ratcliff_obershelp" | "ratcliff-obershelp" => ratcliff_obershelp(s1, s2),
157        "smith_waterman" | "smith-waterman" => smith_waterman_normalized(s1, s2),
158        "needleman_wunsch" | "needleman-wunsch" => needleman_wunsch_normalized(s1, s2),
159        "gotoh" => gotoh_normalized(s1, s2),
160        "monge_elkan" | "monge-elkan" => monge_elkan(s1, s2),
161        "bag_distance" | "bag-distance" => bag_distance_normalized(s1, s2),
162        "mra" => mra_normalized(s1, s2),
163        "jaccard" => jaccard(s1, s2),
164        "cosine" => cosine(s1, s2),
165        "sorensen" | "dice" | "sorensen_dice" => sorensen(s1, s2),
166        "tversky" => tversky(s1, s2),
167        "overlap" => overlap(s1, s2),
168        "prefix" => prefix(s1, s2),
169        "suffix" => suffix(s1, s2),
170        "length" => length(s1, s2),
171        "jaccard_bigram" | "jaccard-bigram" => jaccard_bigram(s1, s2),
172        "cosine_bigram" | "cosine-bigram" => cosine_bigram(s1, s2),
173        _ => levenshtein_normalized(s1, s2),
174    }
175}