diff --git a/iroh-relay/src/relay_map.rs b/iroh-relay/src/relay_map.rs index 355c3dc8f2..3a01f99e64 100644 --- a/iroh-relay/src/relay_map.rs +++ b/iroh-relay/src/relay_map.rs @@ -112,11 +112,34 @@ impl RelayMap { self.relays.write().expect("poisoned").remove(url) } + /// Joins this `RelayMap` with another one into a new one + pub fn join(self, other: RelayMap) -> RelayMap { + { + let mut a = self.relays.write().expect("poisoned"); + let b = other.relays.read().expect("poisoned"); + a.extend(b.iter().map(|(a, b)| (a.clone(), b.clone()))); + } + self + } +} + +impl Extend<(RelayUrl, Arc)> for RelayMap { /// Extends this `RelayMap` with another one. - pub fn extend(&self, other: &RelayMap) { + /// + /// You can use this like this: + /// + /// ```rust + /// # let relay_map_a: RelayMap = { unimplemented!() }; + /// # let relay_map_b: RelayMap = { unimplemented!() }; + /// + /// relay_map_a.extend(relay_map_b.relays::>()); + /// ``` + fn extend(&mut self, iter: I) + where + I: IntoIterator)>, + { let mut a = self.relays.write().expect("poisoned"); - let b = other.relays.read().expect("poisoned"); - a.extend(b.iter().map(|(a, b)| (a.clone(), b.clone()))); + a.extend(iter); } }