windjammer_runtime/
collections.rs

1//! Collection utilities
2//!
3//! Windjammer's `std::collections` module maps to these functions.
4//! Note: Most collections are built into Rust std, this provides helpers.
5
6// Re-export standard collections for public use
7pub use std::collections::HashMap;
8pub use std::collections::HashSet;
9pub use std::collections::VecDeque;
10
11/// Create a new HashMap
12pub fn new_map<K, V>() -> HashMap<K, V>
13where
14    K: std::hash::Hash + Eq,
15{
16    HashMap::new()
17}
18
19/// Create a new HashSet
20pub fn new_set<T>() -> HashSet<T>
21where
22    T: std::hash::Hash + Eq,
23{
24    HashSet::new()
25}
26
27/// Create a new VecDeque
28pub fn new_deque<T>() -> VecDeque<T> {
29    VecDeque::new()
30}
31
32/// Check if slice contains element
33pub fn contains<T: PartialEq>(slice: &[T], item: &T) -> bool {
34    slice.contains(item)
35}
36
37/// Find index of element in slice
38pub fn index_of<T: PartialEq>(slice: &[T], item: &T) -> Option<usize> {
39    slice.iter().position(|x| x == item)
40}
41
42/// Reverse a vector
43pub fn reverse<T: Clone>(vec: &[T]) -> Vec<T> {
44    let mut result = vec.to_vec();
45    result.reverse();
46    result
47}
48
49/// Sort a vector
50pub fn sort<T: Clone + Ord>(vec: &[T]) -> Vec<T> {
51    let mut result = vec.to_vec();
52    result.sort();
53    result
54}
55
56/// Remove duplicates from vector
57pub fn unique<T: Clone + Eq + std::hash::Hash>(vec: &[T]) -> Vec<T> {
58    let set: HashSet<_> = vec.iter().cloned().collect();
59    set.into_iter().collect()
60}
61
62#[cfg(test)]
63mod tests {
64    use super::*;
65
66    #[test]
67    fn test_contains() {
68        let vec = vec![1, 2, 3, 4, 5];
69        assert!(contains(&vec, &3));
70        assert!(!contains(&vec, &10));
71    }
72
73    #[test]
74    fn test_index_of() {
75        let vec = vec!["a", "b", "c"];
76        assert_eq!(index_of(&vec, &"b"), Some(1));
77        assert_eq!(index_of(&vec, &"z"), None);
78    }
79
80    #[test]
81    fn test_reverse() {
82        let vec = vec![1, 2, 3];
83        assert_eq!(reverse(&vec), vec![3, 2, 1]);
84    }
85
86    #[test]
87    fn test_sort() {
88        let vec = vec![3, 1, 2];
89        assert_eq!(sort(&vec), vec![1, 2, 3]);
90    }
91
92    #[test]
93    fn test_unique() {
94        let vec = vec![1, 2, 2, 3, 3, 3];
95        let result = unique(&vec);
96        assert_eq!(result.len(), 3);
97        assert!(result.contains(&1));
98        assert!(result.contains(&2));
99        assert!(result.contains(&3));
100    }
101}