Skip to main content

iris_ztd/
zset.rs

1use super::{Hashable, NounDecode, NounEncode};
2use crate::zbase::{ZBase, ZEntry, ZHashableEntry};
3use alloc::fmt::Debug;
4#[cfg(feature = "wasm")]
5use alloc::{boxed::Box, format, string::ToString};
6
7#[derive(Debug, Clone, PartialEq, Eq, Ord, PartialOrd, NounDecode, NounEncode, Hashable)]
8#[cfg_attr(feature = "wasm", derive(tsify::Tsify))]
9#[cfg_attr(feature = "wasm", tsify(into_wasm_abi, from_wasm_abi, type = "T"))]
10pub struct ZSetEntry<T> {
11    key: T,
12}
13
14impl<T: Hashable + NounEncode> ZEntry for ZSetEntry<T> {
15    type Key = T;
16    type Value = T;
17    type Pair = T;
18    type BorrowPair<'a>
19        = &'a T
20    where
21        T: 'a;
22
23    fn key(&self) -> &Self::Key {
24        &self.key
25    }
26
27    fn value(&self) -> &Self::Value {
28        &self.key
29    }
30
31    fn value_mut(&mut self) -> &mut Self::Value {
32        &mut self.key
33    }
34
35    fn pair(&self) -> Self::BorrowPair<'_> {
36        &self.key
37    }
38
39    fn into_key(self) -> Self::Key {
40        self.key
41    }
42
43    fn into_value(self) -> Self::Value {
44        self.key
45    }
46
47    fn into_pair(self) -> Self::Pair {
48        self.key
49    }
50
51    fn from_pair(pair: Self::Pair) -> Self {
52        Self { key: pair }
53    }
54}
55
56impl<T: Hashable + NounEncode> ZHashableEntry for ZSetEntry<T> {
57    type HashableBorrowPair<'a>
58        = &'a T
59    where
60        T: 'a;
61
62    fn hashable_pair(&self) -> Self::HashableBorrowPair<'_> {
63        &self.key
64    }
65}
66
67#[derive(Debug, Clone, PartialEq, Eq, Ord, PartialOrd, NounDecode, NounEncode, Hashable)]
68#[cfg_attr(feature = "wasm", derive(tsify::Tsify))]
69#[cfg_attr(feature = "wasm", tsify(into_wasm_abi, from_wasm_abi))]
70pub struct ZSet<T>(pub ZBase<ZSetEntry<T>>);
71
72// Unfortunately, we need to reimplement this, because type/lifetime limitations.
73impl<T> serde::Serialize for ZSet<T>
74where
75    T: Hashable + NounEncode + serde::Serialize,
76{
77    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
78    where
79        S: serde::Serializer,
80    {
81        use serde::ser::SerializeSeq;
82        let mut seq = serializer.serialize_seq(None)?;
83        for entry in self.0.iter() {
84            seq.serialize_element(&entry)?;
85        }
86        seq.end()
87    }
88}
89
90impl<'de, T> serde::Deserialize<'de> for ZSet<T>
91where
92    T: Hashable + NounEncode + serde::Deserialize<'de>,
93{
94    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
95    where
96        D: serde::Deserializer<'de>,
97    {
98        Ok(Self(ZBase::deserialize(deserializer)?))
99    }
100}
101
102impl<T> Default for ZSet<T>
103where
104    T: Hashable + NounEncode,
105{
106    fn default() -> Self {
107        Self(ZBase::default())
108    }
109}
110
111impl<T> core::ops::Deref for ZSet<T> {
112    type Target = ZBase<ZSetEntry<T>>;
113
114    fn deref(&self) -> &Self::Target {
115        &self.0
116    }
117}
118
119impl<T> core::ops::DerefMut for ZSet<T> {
120    fn deref_mut(&mut self) -> &mut Self::Target {
121        &mut self.0
122    }
123}
124
125impl<T> IntoIterator for ZSet<T>
126where
127    T: Hashable + NounEncode,
128{
129    type Item = T;
130    type IntoIter = crate::zbase::ZBaseIntoIterator<ZSetEntry<T>>;
131
132    fn into_iter(self) -> Self::IntoIter {
133        self.0.into_iter()
134    }
135}
136
137impl<T> FromIterator<T> for ZSet<T>
138where
139    T: Hashable + NounEncode,
140{
141    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
142        Self(ZBase::from_iter(iter))
143    }
144}
145
146impl<T> From<ZSet<T>> for alloc::vec::Vec<T>
147where
148    T: Hashable + NounEncode,
149{
150    fn from(set: ZSet<T>) -> Self {
151        set.into_iter().collect()
152    }
153}
154
155impl<'a, T> IntoIterator for &'a ZSet<T>
156where
157    T: Hashable + NounEncode,
158{
159    type Item = &'a T;
160    type IntoIter = crate::zbase::ZBaseIterator<'a, ZSetEntry<T>>;
161
162    fn into_iter(self) -> Self::IntoIter {
163        self.0.iter()
164    }
165}
166
167impl<T> From<alloc::vec::Vec<T>> for ZSet<T>
168where
169    T: Hashable + NounEncode,
170{
171    fn from(v: alloc::vec::Vec<T>) -> Self {
172        Self(crate::zbase::ZBase::from(v))
173    }
174}
175
176impl<T, const N: usize> From<[T; N]> for ZSet<T>
177where
178    T: Hashable + NounEncode,
179{
180    fn from(v: [T; N]) -> Self {
181        Self(crate::zbase::ZBase::from(v))
182    }
183}
184
185impl<T: Hashable + NounEncode> ZSet<T> {
186    pub fn new() -> Self {
187        Self::default()
188    }
189
190    pub fn insert(&mut self, key: T) {
191        self.0.insert_entry(ZSetEntry { key });
192    }
193}
194
195#[cfg(test)]
196mod tests {
197    use super::*;
198    use alloc::string::{String, ToString};
199    use alloc::vec::Vec;
200
201    #[test]
202    fn test_zset_encode_decode() {
203        let mut zm = ZSet::<&str>::new();
204        let s1 = "ver".to_string();
205        let s2 = "ve2".to_string();
206        zm.insert(&s1);
207        zm.insert(&s2);
208        let zm_noun = zm.to_noun();
209        let zm_decode = ZSet::<String>::from_noun(&zm_noun).unwrap();
210        assert_eq!(Vec::from(zm), Vec::from(zm_decode));
211    }
212
213    #[test]
214    fn test_zset_order() {
215        let zs_noun = (1, (2, (3, (), ()), (4, (5, (), ()), ())), (10, (), ())).to_noun();
216        let zs = ZSet::<u64>::from_noun(&zs_noun).unwrap();
217        assert_eq!(zs.iter().copied().collect::<Vec<_>>(), &[10, 1, 4, 5, 2, 3]);
218        assert_eq!(zs.into_iter().collect::<Vec<_>>(), &[10, 1, 4, 5, 2, 3]);
219    }
220
221    #[test]
222    fn test_zset_ins_order() {
223        let expected_order = [
224            20, 4, 15, 14, 2, 19, 6, 5, 8, 7, 11, 1, 17, 16, 3, 13, 10, 12, 18, 9,
225        ];
226
227        let mut zs = ZSet::<u64>::new();
228
229        for i in 1u64..=20 {
230            zs.insert(i);
231        }
232
233        assert_eq!(zs.iter().copied().collect::<Vec<_>>(), &expected_order);
234        assert_eq!(zs.into_iter().collect::<Vec<_>>(), &expected_order);
235
236        let mut zs = ZSet::<u64>::new();
237
238        for i in expected_order {
239            zs.insert(i);
240        }
241
242        assert_eq!(zs.iter().copied().collect::<Vec<_>>(), &expected_order);
243        assert_eq!(zs.into_iter().collect::<Vec<_>>(), &expected_order);
244    }
245}