diff --git a/src/manager.rs b/src/manager.rs index 8cd31b2..8fa9087 100644 --- a/src/manager.rs +++ b/src/manager.rs @@ -185,6 +185,16 @@ impl Songbird { }) } + /// Creates an iterator for all [`Call`]s currently managed. + pub fn iter(&self) -> Iter<'_> { + Iter { + inner: self + .calls + .iter() + .map(|x| (*x.key(), Arc::clone(&x.value()))), + } + } + /// Sets a shared configuration for all drivers created from this /// manager. /// @@ -449,6 +459,40 @@ impl VoiceGatewayManager for Songbird { } } +type DashMapIter<'a> = dashmap::iter::Iter<'a, GuildId, Arc>>; + +/// An iterator over all [`Call`]s currently stored in the manager instance. +pub struct Iter<'a> { + inner: std::iter::Map< + DashMapIter<'a>, + fn( as Iterator>::Item) -> (GuildId, Arc>), + >, +} + +impl<'a> Iterator for Iter<'a> { + type Item = (GuildId, Arc>); + + fn next(&mut self) -> Option { + self.inner.next() + } + + fn size_hint(&self) -> (usize, Option) { + self.inner.size_hint() + } + + fn count(self) -> usize { + self.inner.count() + } + + fn fold(self, init: B, f: F) -> B + where + Self: Sized, + F: FnMut(B, Self::Item) -> B, + { + self.inner.fold(init, f) + } +} + #[inline] fn shard_id(guild_id: u64, shard_count: u64) -> u64 { (guild_id >> 22) % shard_count