rxrust/subscription/
tuple.rs1use super::Subscription;
2
3pub struct TupleSubscription<U1, U2> {
25 unsub1: U1,
26 unsub2: U2,
27}
28
29impl<U1, U2> TupleSubscription<U1, U2> {
30 pub fn new(unsub1: U1, unsub2: U2) -> Self { TupleSubscription { unsub1, unsub2 } }
32}
33
34impl<U1, U2> Subscription for TupleSubscription<U1, U2>
35where
36 U1: Subscription,
37 U2: Subscription,
38{
39 fn unsubscribe(self) {
40 self.unsub1.unsubscribe();
42 self.unsub2.unsubscribe();
43 }
44
45 fn is_closed(&self) -> bool {
46 self.unsub1.is_closed() && self.unsub2.is_closed()
48 }
49}
50
51#[cfg(test)]
52mod tests {
53 use std::{cell::RefCell, rc::Rc};
54
55 use super::*;
56
57 struct MockSubscription {
59 closed: Rc<RefCell<bool>>,
60 }
61
62 impl MockSubscription {
63 fn new() -> (Self, Rc<RefCell<bool>>) {
64 let closed = Rc::new(RefCell::new(false));
65 (Self { closed: closed.clone() }, closed)
66 }
67 }
68
69 impl Subscription for MockSubscription {
70 fn unsubscribe(self) { *self.closed.borrow_mut() = true; }
71
72 fn is_closed(&self) -> bool { *self.closed.borrow() }
73 }
74
75 #[rxrust_macro::test]
76 fn test_tuple_subscription() {
77 let (mock1, closed1) = MockSubscription::new();
78 let (mock2, closed2) = MockSubscription::new();
79
80 let tuple_sub = TupleSubscription::new(mock1, mock2);
81
82 assert!(!tuple_sub.is_closed());
83 tuple_sub.unsubscribe();
84
85 assert!(*closed1.borrow());
86 assert!(*closed2.borrow());
87 }
88}