rx_rust/observable/
cloneable_boxed_observable.rs

1use super::{Observable, Observer};
2use crate::{
3    disposable::subscription::Subscription,
4    observable::{boxed_observable::BoxedObservable, observable_ext::ObservableExt},
5    utils::types::{NecessarySendSync, Shared},
6};
7use educe::Educe;
8
9cfg_if::cfg_if! {
10    if #[cfg(feature = "single-threaded")] {
11        /// Cloneable `BoxedObservable` for single-threaded builds.
12        #[derive(Educe)]
13        #[educe(Clone)]
14        pub struct CloneableBoxedObservable<'or, 'sub, 'oe, T, E>(
15            Shared<dyn Fn() -> BoxedObservable<'or, 'sub, 'oe, T, E> + 'oe>,
16        );
17    } else {
18        /// Cloneable `BoxedObservable` for multi-threaded builds.
19        #[derive(Educe)]
20        #[educe(Clone)]
21        pub struct CloneableBoxedObservable<'or, 'sub, 'oe, T, E>(
22            Shared<dyn Fn() -> BoxedObservable<'or, 'sub, 'oe, T, E> + Send + Sync + 'oe>,
23        );
24    }
25}
26
27impl<'or, 'sub, 'oe, T, E> CloneableBoxedObservable<'or, 'sub, 'oe, T, E> {
28    pub fn new(
29        observable: impl Observable<'or, 'sub, T, E> + Clone + NecessarySendSync + 'oe,
30    ) -> Self
31    where
32        T: 'or,
33        E: 'or,
34    {
35        Self(Shared::new(move || observable.clone().into_boxed()))
36    }
37}
38
39impl<'or, 'sub, T, E> Observable<'or, 'sub, T, E>
40    for CloneableBoxedObservable<'or, 'sub, '_, T, E>
41{
42    fn subscribe(
43        self,
44        observer: impl Observer<T, E> + NecessarySendSync + 'or,
45    ) -> Subscription<'sub> {
46        self.0().subscribe(observer)
47    }
48}
49
50impl<T, E> std::fmt::Debug for CloneableBoxedObservable<'_, '_, '_, T, E> {
51    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
52        f.write_str(std::any::type_name::<Self>())
53    }
54}