Skip to main content

anda_db_utils/
lib.rs

1use core::ops::Deref;
2use rustc_hash::{FxBuildHasher, FxHashSet};
3use serde::{
4    de::{Deserialize, DeserializeOwned, Deserializer},
5    ser::{Serialize, Serializer},
6};
7use std::{borrow::Borrow, hash::Hash};
8
9mod cbor_size;
10
11pub use cbor_size::{CborSizeError, estimate_cbor_size, try_estimate_cbor_size};
12
13/// A trait for functional-style method chaining.
14///
15/// Allows any value to be passed through a function, enabling
16/// fluent interfaces and functional programming patterns.
17pub trait Pipe<T> {
18    /// Passes the value through a function.
19    ///
20    /// # Arguments
21    ///
22    /// * `f` - Function to apply to the value
23    ///
24    /// # Returns
25    ///
26    /// The result of applying the function to the value
27    fn pipe<F, R>(self, f: F) -> R
28    where
29        F: FnOnce(Self) -> R,
30        Self: Sized;
31}
32
33impl<T> Pipe<T> for T {
34    fn pipe<F, R>(self, f: F) -> R
35    where
36        F: FnOnce(Self) -> R,
37    {
38        f(self)
39    }
40}
41
42/// A helper utility to efficiently push or extend a `Vec` with unique items.
43///
44/// This struct maintains an internal `HashSet` to keep track of existing items,
45/// providing an optimized way to perform multiple non-existent insertions.
46/// It is designed to be used with a `Vec` that it helps manage.
47///
48/// # Examples
49///
50/// ```rust
51/// use anda_db_utils::UniqueVec;
52///
53/// let vec = vec![1, 2, 3];
54/// let mut extender = UniqueVec::from(vec);
55///
56/// // Push an item that already exists (no change)
57/// extender.push(2);
58/// assert_eq!(extender.as_ref(), &[1, 2, 3]);
59///
60/// // Push a new item
61/// extender.push(4);
62/// assert_eq!(extender.as_ref(), &[1, 2, 3, 4]);
63///
64/// // Extend with a list of items
65/// extender.extend(vec![3, 5, 6]);
66/// assert_eq!(extender.as_ref(), &[1, 2, 3, 4, 5, 6]);
67/// ```
68#[derive(Clone, Debug)]
69pub struct UniqueVec<T> {
70    set: FxHashSet<T>,
71    vec: Vec<T>,
72}
73
74impl<T> Default for UniqueVec<T> {
75    /// Creates an empty `UniqueVec`.
76    fn default() -> Self {
77        Self {
78            set: FxHashSet::default(),
79            vec: Vec::new(),
80        }
81    }
82}
83
84impl<T> From<Vec<T>> for UniqueVec<T>
85where
86    T: Eq + Hash + Clone,
87{
88    /// Creates a `UniqueVec` from a `Vec`.
89    ///
90    /// The extender is initialized with all the unique items from the vector.
91    fn from(mut vec: Vec<T>) -> Self {
92        let mut set = FxHashSet::with_capacity_and_hasher(vec.len(), FxBuildHasher);
93        vec.retain(|item| set.insert(item.clone()));
94        Self { set, vec }
95    }
96}
97
98impl<T> FromIterator<T> for UniqueVec<T>
99where
100    T: Eq + Hash + Clone,
101{
102    /// Creates a `UniqueVec` from an iterator.
103    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
104        let vec: Vec<T> = iter.into_iter().collect();
105        vec.into()
106    }
107}
108
109impl<T> From<UniqueVec<T>> for Vec<T> {
110    /// Converts a `UniqueVec` into a `Vec`.
111    fn from(extender: UniqueVec<T>) -> Self {
112        extender.vec
113    }
114}
115
116impl<T> AsRef<[T]> for UniqueVec<T> {
117    /// Returns a slice containing the entire vector.
118    fn as_ref(&self) -> &[T] {
119        &self.vec
120    }
121}
122
123impl<T> Deref for UniqueVec<T> {
124    type Target = Vec<T>;
125
126    /// Dereferences the `UniqueVec` to a `Vec`.
127    fn deref(&self) -> &Self::Target {
128        &self.vec
129    }
130}
131
132impl<T> UniqueVec<T>
133where
134    T: Eq + Hash + Clone,
135{
136    /// Creates a new, empty `UniqueVec`.
137    pub fn new() -> Self {
138        UniqueVec::default()
139    }
140
141    /// Creates a new, empty `UniqueVec` with a specified capacity.
142    pub fn with_capacity(capacity: usize) -> Self {
143        UniqueVec {
144            set: FxHashSet::with_capacity_and_hasher(capacity, FxBuildHasher),
145            vec: Vec::with_capacity(capacity),
146        }
147    }
148
149    /// Returns `true` if the `UniqueVec` contains the specified item.
150    pub fn contains<Q>(&self, item: &Q) -> bool
151    where
152        T: Borrow<Q>,
153        Q: Eq + Hash + ?Sized,
154    {
155        self.set.contains(item)
156    }
157
158    /// Pushes an item to the vector if it does not already exist.
159    ///
160    /// # Arguments
161    ///
162    /// * `item` - The item to add.
163    ///
164    /// # Returns
165    ///
166    /// `true` if the item was added, `false` otherwise.
167    pub fn push(&mut self, item: T) -> bool {
168        if self.set.insert(item.clone()) {
169            self.vec.push(item);
170            true
171        } else {
172            false
173        }
174    }
175
176    /// Extends the vector with items from an iterator that do not already exist.
177    ///
178    /// # Arguments
179    ///
180    /// * `items` - An iterator providing the items to add.
181    pub fn extend(&mut self, items: impl IntoIterator<Item = T>) {
182        Extend::extend(self, items);
183    }
184
185    /// Retains only the elements specified by the predicate.
186    pub fn retain<F>(&mut self, mut f: F)
187    where
188        F: FnMut(&T) -> bool,
189    {
190        self.vec.retain(&mut f);
191        self.set.clear();
192        self.set.extend(self.vec.iter().cloned());
193    }
194
195    /// Removes and returns the element at `index`.
196    pub fn remove(&mut self, index: usize) -> T {
197        let item = self.vec.remove(index);
198        self.set.remove(&item);
199        item
200    }
201
202    /// Removes **an element** from the vector and returns it.
203    /// The first element that satisfies the predicate will be removed.
204    pub fn remove_if<P>(&mut self, mut predicate: P) -> Option<T>
205    where
206        P: FnMut(&T) -> bool,
207    {
208        if let Some(index) = self.vec.iter().position(&mut predicate) {
209            let item = self.vec.remove(index);
210            self.set.remove(&item);
211            Some(item)
212        } else {
213            None
214        }
215    }
216
217    /// Removes **an element** from the vector and returns it.
218    /// The last element is swapped into its place.
219    pub fn swap_remove_if<P>(&mut self, mut predicate: P) -> Option<T>
220    where
221        P: FnMut(&T) -> bool,
222    {
223        if let Some(index) = self.vec.iter().position(&mut predicate) {
224            let item = self.vec.swap_remove(index);
225            self.set.remove(&item);
226            Some(item)
227        } else {
228            None
229        }
230    }
231
232    /// Intersects the `UniqueVec` with another `UniqueVec`.
233    pub fn intersect_with(&mut self, other: &UniqueVec<T>) {
234        self.vec.retain(|item| other.set.contains(item));
235        self.set.clear();
236        self.set.extend(self.vec.iter().cloned());
237    }
238
239    /// Returns the inner `Vec` of the `UniqueVec`.
240    pub fn into_vec(self) -> Vec<T> {
241        self.vec
242    }
243
244    /// Returns the inner `FxHashSet` of the `UniqueVec`.
245    pub fn into_set(self) -> FxHashSet<T> {
246        self.set
247    }
248
249    /// Converts the `UniqueVec` to a `Vec`.
250    pub fn to_vec(&self) -> Vec<T> {
251        self.vec.clone()
252    }
253
254    /// Converts the `UniqueVec` to a `FxHashSet`.
255    pub fn to_set(&self) -> FxHashSet<T> {
256        self.set.clone()
257    }
258}
259
260impl<T> Extend<T> for UniqueVec<T>
261where
262    T: Eq + Hash + Clone,
263{
264    /// Extends the vector with items from an iterator that do not already exist.
265    fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
266        self.vec.extend(
267            iter.into_iter()
268                .filter(|item| self.set.insert(item.clone())),
269        );
270    }
271}
272
273impl<T> Serialize for UniqueVec<T>
274where
275    T: Eq + Hash + Clone + Serialize,
276{
277    /// Serializes the `UniqueVec` as a sequence.
278    #[inline]
279    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
280        serializer.collect_seq(self.vec.iter())
281    }
282}
283
284impl<'de, T> Deserialize<'de> for UniqueVec<T>
285where
286    T: Eq + Hash + Clone + DeserializeOwned,
287{
288    /// Deserializes a sequence into a `UniqueVec`.
289    #[inline]
290    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
291        let vec: Vec<T> = Deserialize::deserialize(deserializer)?;
292        Ok(UniqueVec::from(vec))
293    }
294}
295
296/// Utility for counting the size of serialized CBOR data.
297#[derive(Clone, Debug, Eq, PartialEq)]
298pub struct CountingWriter {
299    count: usize,
300}
301
302impl Default for CountingWriter {
303    /// Creates a new `CountingWriter` with a count of 0.
304    fn default() -> Self {
305        Self::new()
306    }
307}
308
309impl CountingWriter {
310    /// Creates a new `CountingWriter`.
311    pub const fn new() -> Self {
312        CountingWriter { count: 0 }
313    }
314
315    /// Returns the current count of bytes written.
316    pub const fn size(&self) -> usize {
317        self.count
318    }
319}
320
321impl std::io::Write for CountingWriter {
322    /// Implements the write method for the Write trait.
323    /// This simply counts the bytes without actually writing them.
324    fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
325        let len = buf.len();
326        self.count = self
327            .count
328            .checked_add(len)
329            .ok_or_else(|| std::io::Error::other("byte count overflow"))?;
330        Ok(len)
331    }
332
333    /// Implements the flush method for the Write trait.
334    /// This is a no-op since we're not actually writing data.
335    fn flush(&mut self) -> std::io::Result<()> {
336        Ok(())
337    }
338}
339
340#[cfg(test)]
341mod tests {
342    use super::*;
343    use std::io::Write;
344
345    #[test]
346    fn test_pipe_trait() {
347        // Test basic pipe functionality
348        let result = 5.pipe(|x| x * 2).pipe(|x| x + 1);
349        assert_eq!(result, 11);
350
351        // Test pipe with different types
352        let string_result = "hello"
353            .pipe(|s| s.to_uppercase())
354            .pipe(|s| format!("{} world", s));
355        assert_eq!(string_result, "HELLO world");
356
357        // Test pipe with closure that changes type
358        let vec_result = vec![1, 2, 3].pipe(|v| v.len()).pipe(|len| len as f64);
359        assert_eq!(vec_result, 3.0);
360    }
361
362    #[test]
363    fn test_unique_vec_new() {
364        let uv: UniqueVec<i32> = UniqueVec::new();
365        assert_eq!(uv.len(), 0);
366        assert!(uv.is_empty());
367    }
368
369    #[test]
370    fn test_unique_vec_with_capacity() {
371        let uv: UniqueVec<i32> = UniqueVec::with_capacity(10);
372        assert_eq!(uv.len(), 0);
373        assert_eq!(uv.capacity(), 10);
374    }
375
376    #[test]
377    fn test_unique_vec_from_vec() {
378        let vec = vec![1, 2, 2, 3, 2, 1];
379        let uv = UniqueVec::from(vec);
380        assert_eq!(uv.len(), 3);
381        assert!(uv.contains(&1));
382        assert!(uv.contains(&2));
383        assert!(uv.contains(&3));
384    }
385
386    #[test]
387    fn test_unique_vec_from_iterator() {
388        let uv: UniqueVec<i32> = [2, 2, 1, 3, 2, 1].iter().cloned().collect();
389        assert_eq!(uv.len(), 3);
390        assert!(uv.contains(&2));
391        assert!(uv.contains(&1));
392        assert!(uv.contains(&3));
393    }
394
395    #[test]
396    fn test_unique_vec_push() {
397        let mut uv = UniqueVec::new();
398
399        // Push new items
400        assert!(uv.push(1));
401        assert!(uv.push(2));
402        assert!(uv.push(3));
403        assert_eq!(uv.len(), 3);
404
405        // Push duplicate items
406        assert!(!uv.push(1));
407        assert!(!uv.push(2));
408        assert_eq!(uv.len(), 3);
409
410        // Verify order is maintained
411        assert_eq!(uv.as_ref(), &[1, 2, 3]);
412    }
413
414    #[test]
415    fn test_unique_vec_extend() {
416        let mut uv = UniqueVec::from(vec![1, 2, 3]);
417
418        // Extend with mix of new and existing items
419        uv.extend(vec![3, 4, 5, 2, 6]);
420
421        assert_eq!(uv.len(), 6);
422        assert_eq!(uv.as_ref(), &[1, 2, 3, 4, 5, 6]);
423    }
424
425    #[test]
426    fn test_unique_vec_retain() {
427        let mut uv = UniqueVec::from(vec![1, 2, 3, 4, 5]);
428
429        // Retain only even numbers
430        uv.retain(|&x| x % 2 == 0);
431
432        assert_eq!(uv.len(), 2);
433        assert_eq!(uv.as_ref(), &[2, 4]);
434        assert!(uv.contains(&2));
435        assert!(uv.contains(&4));
436        assert!(!uv.contains(&1));
437        assert!(!uv.contains(&3));
438        assert!(!uv.contains(&5));
439    }
440
441    #[test]
442    fn test_unique_vec_remove() {
443        let mut uv = UniqueVec::from(vec![1, 2, 3, 4, 5]);
444
445        let removed = uv.remove(2); // Remove element at index 2 (value 3)
446        assert_eq!(removed, 3);
447        assert_eq!(uv.len(), 4);
448        assert_eq!(uv.as_ref(), &[1, 2, 4, 5]);
449        assert!(!uv.contains(&3));
450    }
451
452    #[test]
453    #[should_panic]
454    fn test_unique_vec_remove_out_of_bounds() {
455        let mut uv = UniqueVec::from(vec![1, 2, 3]);
456        uv.remove(5); // Should panic
457    }
458
459    #[test]
460    fn test_unique_vec_remove_if() {
461        let mut uv = UniqueVec::from(vec![1, 2, 3, 4, 5]);
462
463        // Remove first even number
464        let removed = uv.remove_if(|&x| x % 2 == 0);
465        assert_eq!(removed, Some(2));
466        assert_eq!(uv.len(), 4);
467        assert_eq!(uv.as_ref(), &[1, 3, 4, 5]);
468        assert!(!uv.contains(&2));
469
470        // Try to remove non-existent condition
471        let removed = uv.remove_if(|&x| x > 10);
472        assert_eq!(removed, None);
473        assert_eq!(uv.len(), 4);
474    }
475
476    #[test]
477    fn test_unique_vec_swap_remove_if() {
478        let mut uv = UniqueVec::from(vec![1, 2, 3, 4, 5]);
479
480        // Remove first even number (swap with last)
481        let removed = uv.swap_remove_if(|&x| x % 2 == 0);
482        assert_eq!(removed, Some(2));
483        assert_eq!(uv.len(), 4);
484        // After swap_remove, the last element (5) should be in position of removed element
485        assert_eq!(uv.as_ref(), &[1, 5, 3, 4]);
486        assert!(!uv.contains(&2));
487    }
488
489    #[test]
490    fn test_unique_vec_contains() {
491        let uv = UniqueVec::from(vec![1, 2, 3]);
492
493        assert!(uv.contains(&1));
494        assert!(uv.contains(&2));
495        assert!(uv.contains(&3));
496        assert!(!uv.contains(&4));
497    }
498
499    #[test]
500    fn test_unique_vec_intersect_with() {
501        let mut uv1 = UniqueVec::from(vec![1, 2, 3, 4, 5]);
502        let uv2 = UniqueVec::from(vec![3, 4, 5, 6, 7]);
503
504        uv1.intersect_with(&uv2);
505
506        assert_eq!(uv1.len(), 3);
507        assert!(uv1.contains(&3));
508        assert!(uv1.contains(&4));
509        assert!(uv1.contains(&5));
510        assert!(!uv1.contains(&1));
511        assert!(!uv1.contains(&2));
512    }
513
514    #[test]
515    fn test_unique_vec_to_vec() {
516        let uv = UniqueVec::from(vec![1, 2, 2, 3]);
517        let vec = uv.to_vec();
518        assert_eq!(vec, vec![1, 2, 3]);
519    }
520
521    #[test]
522    fn test_unique_vec_to_set() {
523        let uv = UniqueVec::from(vec![1, 2, 3]);
524        let set = uv.to_set();
525        assert_eq!(set.len(), 3);
526        assert!(set.contains(&1));
527        assert!(set.contains(&2));
528        assert!(set.contains(&3));
529    }
530
531    #[test]
532    fn test_unique_vec_as_ref() {
533        let uv = UniqueVec::from(vec![1, 2, 3]);
534        let slice: &[i32] = uv.as_ref();
535        assert_eq!(slice, &[1, 2, 3]);
536    }
537
538    #[test]
539    fn test_unique_vec_deref() {
540        let uv = UniqueVec::from(vec![1, 2, 3]);
541        // Test deref by calling Vec methods directly
542        assert_eq!(uv.len(), 3);
543        assert_eq!(uv[0], 1);
544        assert_eq!(uv[1], 2);
545        assert_eq!(uv[2], 3);
546    }
547
548    #[test]
549    fn test_unique_vec_into_vec() {
550        let uv = UniqueVec::from(vec![1, 2, 3]);
551        let vec: Vec<i32> = uv.into();
552        assert_eq!(vec, vec![1, 2, 3]);
553    }
554
555    #[test]
556    fn test_unique_vec_serialize_deserialize() {
557        let uv = UniqueVec::from(vec![1, 2, 2, 3, 2, 1]); // Duplicates should be removed
558
559        // Serialize
560        let json = serde_json::to_string(&uv).unwrap();
561        assert_eq!(json, "[1,2,3]");
562
563        // Deserialize
564        let deserialized: UniqueVec<i32> = serde_json::from_str("[1,3,2,3,3,2,1]").unwrap();
565        assert_eq!(deserialized.len(), 3);
566        assert_eq!(deserialized.as_ref(), &[1, 3, 2]);
567    }
568
569    #[test]
570    fn test_unique_vec_clone() {
571        let uv1 = UniqueVec::from(vec![1, 2, 3]);
572        let uv2 = uv1.clone();
573
574        assert_eq!(uv1.len(), uv2.len());
575        assert_eq!(uv1.as_ref(), uv2.as_ref());
576    }
577
578    #[test]
579    fn test_counting_writer_new() {
580        let writer = CountingWriter::new();
581        assert_eq!(writer.size(), 0);
582    }
583
584    #[test]
585    fn test_counting_writer_default() {
586        let writer = CountingWriter::default();
587        assert_eq!(writer.size(), 0);
588    }
589
590    #[test]
591    fn test_counting_writer_write() {
592        let mut writer = CountingWriter::new();
593
594        let result = writer.write(b"hello");
595        assert!(result.is_ok());
596        assert_eq!(result.unwrap(), 5);
597        assert_eq!(writer.size(), 5);
598
599        let result = writer.write(b" world");
600        assert!(result.is_ok());
601        assert_eq!(result.unwrap(), 6);
602        assert_eq!(writer.size(), 11);
603    }
604
605    #[test]
606    fn test_counting_writer_flush() {
607        let mut writer = CountingWriter::new();
608        let result = writer.flush();
609        assert!(result.is_ok());
610        assert_eq!(writer.size(), 0); // Flush doesn't change size
611    }
612
613    #[test]
614    fn test_counting_writer_multiple_writes() {
615        let mut writer = CountingWriter::new();
616
617        // Multiple writes should accumulate
618        writer.write_all(b"a").unwrap();
619        assert_eq!(writer.size(), 1);
620
621        writer.write_all(b"bc").unwrap();
622        assert_eq!(writer.size(), 3);
623
624        writer.write_all(b"defg").unwrap();
625        assert_eq!(writer.size(), 7);
626    }
627
628    #[test]
629    fn test_counting_writer_empty_write() {
630        let mut writer = CountingWriter::new();
631
632        let result = writer.write(b"");
633        assert!(result.is_ok());
634        assert_eq!(result.unwrap(), 0);
635        assert_eq!(writer.size(), 0);
636    }
637
638    #[test]
639    fn test_unique_vec_edge_cases() {
640        // Test with empty vector
641        let uv = UniqueVec::from(vec![] as Vec<i32>);
642        assert_eq!(uv.len(), 0);
643        assert!(uv.is_empty());
644
645        // Test with single element
646        let mut uv = UniqueVec::from(vec![42]);
647        assert_eq!(uv.len(), 1);
648        assert!(uv.contains(&42));
649
650        // Test removing the only element
651        let removed = uv.remove(0);
652        assert_eq!(removed, 42);
653        assert_eq!(uv.len(), 0);
654        assert!(!uv.contains(&42));
655    }
656
657    #[test]
658    fn test_unique_vec_string_type() {
659        let mut uv = UniqueVec::new();
660
661        uv.push("hello".to_string());
662        uv.push("world".to_string());
663        uv.push("hello".to_string()); // Duplicate
664
665        assert_eq!(uv.len(), 2);
666        assert!(uv.contains("hello"));
667        assert!(uv.contains("world"));
668    }
669
670    #[test]
671    fn test_counting_writer_overflow() {
672        let mut writer = CountingWriter { count: usize::MAX };
673        let err = writer.write(b"x").unwrap_err();
674
675        assert_eq!(err.kind(), std::io::ErrorKind::Other);
676        assert_eq!(writer.size(), usize::MAX);
677    }
678}