rx_rust/observable/
cloneable_boxed_observable.rs1use 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 #[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 #[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}