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 } 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}