linkrs_core/value/
list.rs1use serde::{Deserialize, Serialize};
6use std::hash::Hash;
7
8#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
10pub struct List {
11 pub values: Vec<super::Value>,
12}
13
14impl List {
15 pub fn new() -> Self {
16 Self { values: Vec::new() }
17 }
18
19 pub fn len(&self) -> usize {
20 self.values.len()
21 }
22
23 pub fn is_empty(&self) -> bool {
24 self.values.is_empty()
25 }
26
27 pub fn iter(&self) -> std::slice::Iter<'_, super::Value> {
28 self.values.iter()
29 }
30
31 pub fn push(&mut self, value: super::Value) {
32 self.values.push(value);
33 }
34
35 pub fn remove(&mut self, index: usize) -> super::Value {
36 self.values.remove(index)
37 }
38
39 pub fn pop(&mut self) -> Option<super::Value> {
40 self.values.pop()
41 }
42
43 pub fn swap(&mut self, a: usize, b: usize) {
44 self.values.swap(a, b);
45 }
46
47 pub fn get(&self, index: usize) -> Option<&super::Value> {
48 self.values.get(index)
49 }
50
51 pub fn get_mut(&mut self, index: usize) -> Option<&mut super::Value> {
52 self.values.get_mut(index)
53 }
54
55 pub fn insert(&mut self, index: usize, value: super::Value) {
56 self.values.insert(index, value);
57 }
58
59 pub fn clear(&mut self) {
60 self.values.clear();
61 }
62
63 pub fn capacity(&self) -> usize {
64 self.values.capacity()
65 }
66
67 pub fn reserve(&mut self, additional: usize) {
68 self.values.reserve(additional);
69 }
70
71 pub fn shrink_to_fit(&mut self) {
72 self.values.shrink_to_fit();
73 }
74
75 pub fn truncate(&mut self, len: usize) {
76 self.values.truncate(len);
77 }
78
79 pub fn retain<F>(&mut self, f: F)
80 where
81 F: FnMut(&super::Value) -> bool,
82 {
83 self.values.retain(f);
84 }
85
86 pub fn dedup(&mut self)
87 where
88 super::Value: PartialEq,
89 {
90 self.values.dedup();
91 }
92
93 pub fn sort(&mut self)
94 where
95 super::Value: Ord,
96 {
97 self.values.sort();
98 }
99
100 pub fn sort_by<F>(&mut self, f: F)
101 where
102 F: FnMut(&super::Value, &super::Value) -> std::cmp::Ordering,
103 {
104 self.values.sort_by(f);
105 }
106
107 pub fn reverse(&mut self) {
108 self.values.reverse();
109 }
110
111 pub fn contains(&self, value: &super::Value) -> bool
112 where
113 super::Value: PartialEq,
114 {
115 self.values.contains(value)
116 }
117
118 pub fn append(&mut self, other: &mut Self) {
119 self.values.append(&mut other.values);
120 }
121
122 pub fn extend<I>(&mut self, iter: I)
123 where
124 I: IntoIterator<Item = super::Value>,
125 {
126 self.values.extend(iter);
127 }
128
129 pub fn split_off(&mut self, at: usize) -> Self {
130 Self {
131 values: self.values.split_off(at),
132 }
133 }
134
135 pub fn as_slice(&self) -> &[super::Value] {
136 self.values.as_slice()
137 }
138
139 pub fn as_mut_slice(&mut self) -> &mut [super::Value] {
140 self.values.as_mut_slice()
141 }
142
143 pub fn into_vec(self) -> Vec<super::Value> {
144 self.values
145 }
146
147 pub fn from_vec(values: Vec<super::Value>) -> Self {
148 Self { values }
149 }
150
151 pub fn with_capacity(capacity: usize) -> Self {
152 Self {
153 values: Vec::with_capacity(capacity),
154 }
155 }
156}
157
158impl std::ops::Index<usize> for List {
159 type Output = super::Value;
160
161 fn index(&self, index: usize) -> &Self::Output {
162 &self.values[index]
163 }
164}
165
166impl std::ops::IndexMut<usize> for List {
167 fn index_mut(&mut self, index: usize) -> &mut Self::Output {
168 &mut self.values[index]
169 }
170}
171
172impl std::ops::Index<std::ops::Range<usize>> for List {
173 type Output = [super::Value];
174
175 fn index(&self, range: std::ops::Range<usize>) -> &Self::Output {
176 &self.values[range]
177 }
178}
179
180impl std::ops::Index<std::ops::RangeFrom<usize>> for List {
181 type Output = [super::Value];
182
183 fn index(&self, range: std::ops::RangeFrom<usize>) -> &Self::Output {
184 &self.values[range]
185 }
186}
187
188impl std::ops::Index<std::ops::RangeTo<usize>> for List {
189 type Output = [super::Value];
190
191 fn index(&self, range: std::ops::RangeTo<usize>) -> &Self::Output {
192 &self.values[range]
193 }
194}
195
196impl std::ops::Index<std::ops::RangeFull> for List {
197 type Output = [super::Value];
198
199 fn index(&self, range: std::ops::RangeFull) -> &Self::Output {
200 &self.values[range]
201 }
202}
203
204impl IntoIterator for List {
205 type Item = super::Value;
206 type IntoIter = std::vec::IntoIter<super::Value>;
207
208 fn into_iter(self) -> Self::IntoIter {
209 self.values.into_iter()
210 }
211}
212
213impl<'a> IntoIterator for &'a List {
214 type Item = &'a super::Value;
215 type IntoIter = std::slice::Iter<'a, super::Value>;
216
217 fn into_iter(self) -> Self::IntoIter {
218 self.values.iter()
219 }
220}
221
222impl From<Vec<super::Value>> for List {
223 fn from(values: Vec<super::Value>) -> Self {
224 Self { values }
225 }
226}
227
228impl From<List> for Vec<super::Value> {
229 fn from(list: List) -> Self {
230 list.values
231 }
232}
233
234impl Default for List {
235 fn default() -> Self {
236 Self::new()
237 }
238}
239
240impl List {
241 pub fn estimated_size(&self) -> usize {
243 let mut size = std::mem::size_of::<Self>();
244 size += self.values.capacity() * std::mem::size_of::<super::Value>();
245 for value in &self.values {
246 size += value.estimated_size();
247 }
248 size
249 }
250}