rust_queries_core/
queryable.rs

1//! Queryable trait for supporting multiple container types.
2//!
3//! This module provides the `Queryable` trait which enables querying
4//! various container types: Vec, HashMap, HashSet, BTreeMap, VecDeque, etc.
5
6use std::collections::{HashMap, HashSet, BTreeMap, BTreeSet, VecDeque, LinkedList};
7
8/// Trait for types that can be queried.
9///
10/// Implemented for standard collections like Vec, HashMap, HashSet, etc.
11pub trait Queryable<T> {
12    /// Returns an iterator over references to items.
13    fn query_iter(&self) -> Box<dyn Iterator<Item = &T> + '_>;
14}
15
16// Implementation for slice
17impl<T> Queryable<T> for [T] {
18    fn query_iter(&self) -> Box<dyn Iterator<Item = &T> + '_> {
19        Box::new(self.iter())
20    }
21}
22
23// Implementation for Vec
24impl<T> Queryable<T> for Vec<T> {
25    fn query_iter(&self) -> Box<dyn Iterator<Item = &T> + '_> {
26        Box::new(self.iter())
27    }
28}
29
30// Implementation for VecDeque
31impl<T> Queryable<T> for VecDeque<T> {
32    fn query_iter(&self) -> Box<dyn Iterator<Item = &T> + '_> {
33        Box::new(self.iter())
34    }
35}
36
37// Implementation for LinkedList
38impl<T> Queryable<T> for LinkedList<T> {
39    fn query_iter(&self) -> Box<dyn Iterator<Item = &T> + '_> {
40        Box::new(self.iter())
41    }
42}
43
44// Implementation for HashSet
45impl<T> Queryable<T> for HashSet<T>
46where
47    T: Eq + std::hash::Hash,
48{
49    fn query_iter(&self) -> Box<dyn Iterator<Item = &T> + '_> {
50        Box::new(self.iter())
51    }
52}
53
54// Implementation for BTreeSet
55impl<T> Queryable<T> for BTreeSet<T>
56where
57    T: Ord,
58{
59    fn query_iter(&self) -> Box<dyn Iterator<Item = &T> + '_> {
60        Box::new(self.iter())
61    }
62}
63
64// Implementation for HashMap (queries values)
65impl<K, V> Queryable<V> for HashMap<K, V>
66where
67    K: Eq + std::hash::Hash,
68{
69    fn query_iter(&self) -> Box<dyn Iterator<Item = &V> + '_> {
70        Box::new(self.values())
71    }
72}
73
74// Implementation for BTreeMap (queries values)
75impl<K, V> Queryable<V> for BTreeMap<K, V>
76where
77    K: Ord,
78{
79    fn query_iter(&self) -> Box<dyn Iterator<Item = &V> + '_> {
80        Box::new(self.values())
81    }
82}
83
84// Implementation for arrays of any size
85impl<T, const N: usize> Queryable<T> for [T; N] {
86    fn query_iter(&self) -> Box<dyn Iterator<Item = &T> + '_> {
87        Box::new(self.iter())
88    }
89}
90
91// Implementation for Option (0 or 1 item)
92impl<T> Queryable<T> for Option<T> {
93    fn query_iter(&self) -> Box<dyn Iterator<Item = &T> + '_> {
94        Box::new(self.iter())
95    }
96}
97
98// Implementation for Result (0 or 1 item)
99impl<T, E> Queryable<T> for Result<T, E> {
100    fn query_iter(&self) -> Box<dyn Iterator<Item = &T> + '_> {
101        Box::new(self.iter())
102    }
103}
104