anyscript_compiler/types/
dict.rs

1//! # Dict
2//!
3//! This module contains the definition for the Dict type.
4use std::ffi::CString;
5use std::fmt::Display;
6use std::collections::HashMap;
7use std::hash::Hash;
8use crate::types::prelude::*;
9
10/// Class to Handle a Dictionary
11#[derive(Clone)]
12pub struct Dict<K, V> {
13    pub keys: Vec<K>,
14    pub values: Vec<V>,
15    pub size: usize,
16    pub dict: HashMap<K, V>,
17}
18
19impl<K: Default + Display + Eq + Hash + Clone + Send + Sync, V: Default + Display + Clone + Send + Sync> Default for Dict<K, V> {
20    fn default() -> Self {
21        Self::new()
22    }
23}
24
25impl<K: Default + Display + Eq + Hash + Clone + Send + Sync, V: Default + Display + Clone + Send + Sync> Dict<K, V> {
26
27    pub fn new() -> Self {
28        Self {
29            keys: Vec::new(),
30            values: Vec::new(),
31            size: 0,
32            dict: HashMap::new(),
33        }
34    }
35
36    pub fn insert(&mut self, key: K, value: V) {
37        self.keys.push(key);
38        self.values.push(value);
39    }
40
41    pub fn to_string2(&self) -> String {
42        let mut string = String::new();
43        for (key, value) in self.keys.iter().zip(self.values.iter()) {
44            string.push_str(&format!("{}: {}\n", key, value));
45        }
46        string
47    }
48
49    pub fn to_cstring(&self) -> CString {
50        let string = self.to_string2();
51        
52        CString::new(string).unwrap()
53    }
54
55    pub fn to_dict(&mut self) -> HashMap<K, V> {
56        for (key, value) in self.keys.iter().zip(self.values.iter()) {
57            self.dict.insert(key.clone(), value.clone());
58        }
59        self.dict.clone()
60    }
61
62    pub fn get_type(&self) -> String {
63        let k_type = std::any::type_name::<K>();
64        let v_type = std::any::type_name::<V>();
65        format!("{}, {}", k_type, v_type)
66    }
67
68    fn update_size(&mut self) {
69        let x1 = self.keys.len();
70        let x2 = self.values.len();
71        self.size = x1 + x2;
72    }
73
74    pub fn get_size(&mut self) -> usize {
75        self.update_size();
76        self.size
77    }
78
79    pub fn replace(&mut self, key: K, new: V) {
80        let index = self.keys.iter().position(|x| x == &key);
81        if let Some(index) = index {
82            self.values[index] = new;
83        }
84    }
85
86    pub fn remove(&mut self, key: K) {
87        let index = self.keys.iter().position(|x| x == &key);
88        if let Some(index) = index {
89            self.keys.remove(index);
90            self.values.remove(index);
91        }
92    }
93
94    pub fn destroy(&mut self) {
95        self.keys.clear();
96        self.values.clear();
97        self.dict.clear();
98    }
99
100    pub fn get_key_items(&self) -> List<K> {
101        let mut items = List::new();
102        for k in &self.keys {
103            items.append(k.clone());
104        }
105        items
106    }
107
108    pub fn get_value_items(&self) -> List<V> {
109        let mut items = List::new();
110        for v in &self.values {
111            items.append(v.clone());
112        }
113        items
114    }
115
116    pub fn get(&self, key: K) -> V {
117        self.dict[&key].clone()
118    }
119
120    pub fn to_list(&self) -> Tuple<List<K>, List<V>> {
121        let mut keys = List::new();
122        let mut values = List::new();
123        for (key, value) in self.keys.iter().zip(self.values.iter()) {
124            keys.append(key.clone());
125            values.append(value.clone());
126        }
127        Tuple {
128            first: keys.clone(),
129            second: values.clone(),
130            tuple: (keys, values),
131        }
132    }
133
134    pub fn from(map: HashMap<K, V>) -> Self {
135        let mut dict = Self::new();
136        for (key, value) in map {
137            dict.insert(key, value);
138        }
139        dict
140    }
141}