tinystring/
lib.rs

1pub struct Slot {
2    slot: String,
3    count: usize,
4}
5
6pub fn generate_dictionary<'a>(data: String, slen: usize) -> Vec<String> {
7    const MLEN: usize = 896;
8    let mut dict: Vec<Slot> = Vec::new();
9    for i in 0..data.len() - slen {
10        for j in 2..slen {
11            let slot: String = data[i..i + j].to_string();
12            if dict.iter().any(|r| r.slot == slot) {
13                // do nothing
14            } else {
15                dict.push(Slot {
16                    slot: slot.to_string(),
17                    count: data.matches(&slot).count(),
18                });
19            }
20        }
21    }
22    dict.sort_by(|a, b| b.count.cmp(&a.count));
23    let mut v: Vec<String> = dict[0..MLEN].iter().map(|r| r.slot.to_string()).collect();
24    v.sort_by(|a, b| b.len().cmp(&a.len()));
25    v.to_vec()
26}
27
28pub fn tiny_string_deflate (data: String, dict: Vec<String>) -> String {
29    let mut compressed: String = data;
30    let mut i: u32 = 0;
31    for slot in dict {
32        let r: String = std::char::from_u32(128 + i).unwrap().to_string();
33        compressed = compressed.replace(&slot, &r);
34        i += 1;
35    }
36    compressed
37}
38
39pub fn tiny_string_inflate (data: String, dict: Vec<String>) -> String {
40    let mut compressed: String = data;
41    let mut i: u32 = 0;
42    for slot in dict {
43        let r: String = std::char::from_u32(128 + i).unwrap().to_string();
44        compressed = compressed.replace(&r, &slot);
45        i += 1;
46    }
47    compressed
48}