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}