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
72impl<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}