Skip to main content

linkrs_core/value/
list.rs

1//! List Type Module
2//!
3//! This module defines the List type and its associated operations.
4
5use serde::{Deserialize, Serialize};
6use std::hash::Hash;
7
8/// Simple list representation
9#[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    /// Estimate the memory usage of the list
242    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}