rive_cache_inmemory/
iter.rs

1use dashmap::iter::Iter;
2use rive_models::{
3    channel::Channel,
4    emoji::Emoji,
5    member::{Member, MemberCompositeKey},
6    message::Message,
7    server::Server,
8    user::User,
9};
10use std::hash::Hash;
11
12use crate::{reference::IterReference, InMemoryCache};
13
14/// Immutable cache iterator.
15pub struct ResourceIter<'a, K, V> {
16    iter: Iter<'a, K, V>,
17}
18
19impl<'a, K, V> ResourceIter<'a, K, V> {
20    pub(crate) const fn new(iter: Iter<'a, K, V>) -> Self {
21        Self { iter }
22    }
23}
24
25impl<'a, K: Eq + Hash, V> Iterator for ResourceIter<'a, K, V> {
26    type Item = IterReference<'a, K, V>;
27
28    fn next(&mut self) -> Option<Self::Item> {
29        self.iter.next().map(IterReference::new)
30    }
31}
32
33/// Interface to create iterators over various resources.
34///
35/// The created iterators will iterate over all entities of a resource.
36///
37/// The iteration order of all iterators are arbitrary.
38///
39/// Example:
40///
41/// ```no_run
42/// use rive_cache_inmemory::InMemoryCache;
43///
44/// let cache = InMemoryCache::new();
45///
46/// // later in the code...
47/// let count = cache
48///     .iter()
49///     .users()
50///     .filter(|user| user.avatar.is_some())
51///     .count();
52///
53/// println!("users with avatar: {count}");
54/// ```
55#[derive(Clone, Debug)]
56pub struct InMemoryCacheIter<'a>(&'a InMemoryCache);
57
58impl<'a> InMemoryCacheIter<'a> {
59    /// Create a new instance of cache iterator interface.
60    pub(super) const fn new(cache: &'a InMemoryCache) -> Self {
61        Self(cache)
62    }
63
64    /// Create an iterator over the users in the cache.
65    pub fn users(&'a self) -> ResourceIter<String, User> {
66        ResourceIter::new(self.0.users.iter())
67    }
68
69    /// Create an iterator over the servers in the cache.
70    pub fn serevrs(&'a self) -> ResourceIter<String, Server> {
71        ResourceIter::new(self.0.servers.iter())
72    }
73
74    /// Create an iterator over the channels in the cache.
75    pub fn channels(&'a self) -> ResourceIter<String, Channel> {
76        ResourceIter::new(self.0.channels.iter())
77    }
78
79    /// Create an iterator over the messages in the cache.
80    pub fn messages(&'a self) -> ResourceIter<String, Message> {
81        ResourceIter::new(self.0.messages.iter())
82    }
83
84    /// Create an iterator over the emojis in the cache.
85    pub fn emojis(&'a self) -> ResourceIter<String, Emoji> {
86        ResourceIter::new(self.0.emojis.iter())
87    }
88
89    /// Create an iterator over the servers members in the cache.
90    pub fn members(&'a self) -> ResourceIter<MemberCompositeKey, Member> {
91        ResourceIter::new(self.0.members.iter())
92    }
93}