afrim_memory/utils.rs
1#![deny(missing_docs)]
2//! Set of tools to facilitate the loading of data.
3
4use crate::Node;
5
6/// Load the sequential codes from a plain text and returns it.
7///
8/// # Example
9///
10/// ```
11/// use afrim_memory::{Cursor, Node, utils};
12/// use std::rc::Rc;
13///
14/// let text_buffer = Node::default();
15/// let data = utils::load_data(r#"
16/// ..a ä
17/// ..af ɑ̈
18/// ..ai ɛ̈
19/// "#);
20/// data.iter().for_each(|d| { text_buffer.insert(d[0].chars().collect(), d[1].to_owned()); });
21/// let memory = Rc::new(text_buffer);
22///
23/// let mut cursor = Cursor::new(memory, 8);
24/// "..af".chars().for_each(|c| { cursor.hit(c); });
25///
26/// assert_eq!(cursor.state(), (Some("ɑ̈".to_owned()), 4, 'f'));
27///```
28pub fn load_data(data: &str) -> Vec<Vec<&str>> {
29 let data = data
30 .trim()
31 .split('\n')
32 .map(|line| {
33 line.split_whitespace()
34 .filter(|token| !token.is_empty())
35 .take(2)
36 .collect()
37 })
38 .collect();
39
40 data
41}
42
43/// Build a map from a list of sequential codes.
44///
45/// # Example
46///
47/// ```
48/// use afrim_memory::{Cursor, Node, utils};
49/// use std::rc::Rc;
50///
51/// let data = utils::load_data(r#"
52/// ..a ä
53/// ..af ɑ̈
54/// ..ai ɛ̈
55/// "#);
56/// let text_buffer = utils::build_map(data);
57/// let memory = Rc::new(text_buffer);
58///
59/// let mut cursor = Cursor::new(memory, 8);
60/// "..af".chars().for_each(|c| { cursor.hit(c); });
61///
62/// assert_eq!(cursor.state(), (Some("ɑ̈".to_owned()), 4, 'f'));
63///```
64pub fn build_map(data: Vec<Vec<&str>>) -> Node {
65 let root = Node::default();
66
67 data.iter().filter(|e| e.len() == 2).for_each(|e| {
68 root.insert(e[0].chars().collect(), e[1].to_owned());
69 });
70
71 root
72}
73
74#[cfg(test)]
75mod tests {
76 #[test]
77 fn test_load_data() {
78 use crate::utils;
79
80 let data = include_str!("../data/sample.txt");
81
82 utils::load_data(data)
83 .iter()
84 .for_each(|pair| assert_eq!(pair.len(), 2));
85 }
86
87 #[test]
88 fn test_build_map() {
89 use crate::utils;
90
91 let data = vec![vec!["af11", "ɑ̀ɑ̀"], vec!["?.", "ʔ"], vec![], vec!["c/"]];
92 utils::build_map(data);
93
94 let data = include_str!("../data/sample.txt");
95 let data = utils::load_data(data);
96
97 utils::build_map(data);
98 }
99}