anyscript_compiler/types/
dict.rs1use std::ffi::CString;
5use std::fmt::Display;
6use std::collections::HashMap;
7use std::hash::Hash;
8use crate::types::prelude::*;
9
10#[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}