use crate::{
context::{Context, LocalCtx, SharedCtx},
observable::{CoreObservable, ObservableType},
observer::{
BoxedObserver, BoxedObserverMutRef, BoxedObserverMutRefSend, BoxedObserverSend,
IntoBoxedObserver,
},
subscription::{BoxedSubscription, BoxedSubscriptionSend, IntoBoxedSubscription},
};
pub trait DynCoreObservable<Ctx>
where
Ctx: Context,
{
fn dyn_subscribe(self: Box<Self>, ctx: Ctx) -> Ctx::BoxedSubscription;
}
pub trait DynCoreObservableClone<'a, Ctx>: DynCoreObservable<Ctx>
where
Ctx: Context + 'a,
{
fn clone_box(&self) -> Box<dyn DynCoreObservableClone<'a, Ctx> + 'a>;
}
impl<S, Ctx> DynCoreObservable<Ctx> for S
where
Ctx: Context,
S: CoreObservable<Ctx, Unsub: IntoBoxedSubscription<Ctx::BoxedSubscription>>,
{
fn dyn_subscribe(self: Box<Self>, ctx: Ctx) -> Ctx::BoxedSubscription {
(*self).subscribe(ctx).into_boxed()
}
}
impl<'a, S, Ctx> DynCoreObservableClone<'a, Ctx> for S
where
Ctx: Context + 'a,
S: CoreObservable<Ctx, Unsub: IntoBoxedSubscription<Ctx::BoxedSubscription>> + Clone + 'a,
{
fn clone_box(&self) -> Box<dyn DynCoreObservableClone<'a, Ctx> + 'a> { Box::new(self.clone()) }
}
impl<'a, Ctx> Clone for Box<dyn DynCoreObservableClone<'a, Ctx> + 'a>
where
Ctx: Context + 'a,
{
fn clone(&self) -> Self { self.clone_box() }
}
pub type BoxedCoreObservable<'a, Item, Err, S> =
Box<dyn DynCoreObservable<LocalCtx<BoxedObserver<'a, Item, Err>, S>> + 'a>;
pub type BoxedCoreObservableSend<'a, Item, Err, S> =
Box<dyn DynCoreObservable<SharedCtx<BoxedObserverSend<'a, Item, Err>, S>> + Send + 'a>;
pub type BoxedCoreObservableMutRef<'a, Item, Err, S> =
Box<dyn DynCoreObservable<LocalCtx<BoxedObserverMutRef<'a, Item, Err>, S>> + 'a>;
pub type BoxedCoreObservableMutRefSend<'a, Item, Err, S> =
Box<dyn DynCoreObservable<SharedCtx<BoxedObserverMutRefSend<'a, Item, Err>, S>> + Send + 'a>;
pub type BoxedCoreObservableClone<'a, Item, Err, S> =
Box<dyn DynCoreObservableClone<'a, LocalCtx<BoxedObserver<'a, Item, Err>, S>> + 'a>;
pub type BoxedCoreObservableSendClone<'a, Item, Err, S> =
Box<dyn DynCoreObservableClone<'a, SharedCtx<BoxedObserverSend<'a, Item, Err>, S>> + Send + 'a>;
pub type BoxedCoreObservableMutRefClone<'a, Item, Err, S> =
Box<dyn DynCoreObservableClone<'a, LocalCtx<BoxedObserverMutRef<'a, Item, Err>, S>> + 'a>;
pub type BoxedCoreObservableMutRefSendClone<'a, Item, Err, S> = Box<
dyn DynCoreObservableClone<'a, SharedCtx<BoxedObserverMutRefSend<'a, Item, Err>, S>> + Send + 'a,
>;
pub trait IntoBoxedCoreObservable<Target> {
fn into_boxed(self) -> Target;
}
impl<'a, Item, Err, S, Src> IntoBoxedCoreObservable<BoxedCoreObservable<'a, Item, Err, S>> for Src
where
S: Clone + Default + 'a,
Src: DynCoreObservable<LocalCtx<BoxedObserver<'a, Item, Err>, S>> + 'a,
{
fn into_boxed(self) -> BoxedCoreObservable<'a, Item, Err, S> { Box::new(self) }
}
impl<'a, Item, Err, S, Src> IntoBoxedCoreObservable<BoxedCoreObservableSend<'a, Item, Err, S>>
for Src
where
S: Clone + Default + 'a,
Src: DynCoreObservable<SharedCtx<BoxedObserverSend<'a, Item, Err>, S>> + Send + 'a,
{
fn into_boxed(self) -> BoxedCoreObservableSend<'a, Item, Err, S> { Box::new(self) }
}
impl<'a, Item: 'a, Err: 'a, S, Src>
IntoBoxedCoreObservable<BoxedCoreObservableClone<'a, Item, Err, S>> for Src
where
S: Clone + Default + 'a,
Src: DynCoreObservableClone<'a, LocalCtx<BoxedObserver<'a, Item, Err>, S>> + 'a,
{
fn into_boxed(self) -> BoxedCoreObservableClone<'a, Item, Err, S> { Box::new(self) }
}
impl<'a, Item: 'a, Err: 'a, S, Src>
IntoBoxedCoreObservable<BoxedCoreObservableSendClone<'a, Item, Err, S>> for Src
where
S: Clone + Default + 'a,
Src: DynCoreObservableClone<'a, SharedCtx<BoxedObserverSend<'a, Item, Err>, S>> + Send + 'a,
{
fn into_boxed(self) -> BoxedCoreObservableSendClone<'a, Item, Err, S> { Box::new(self) }
}
#[allow(coherence_leak_check)]
impl<'a, Item: 'a, Err, S, Src> IntoBoxedCoreObservable<BoxedCoreObservableMutRef<'a, Item, Err, S>>
for Src
where
S: Clone + Default + 'a,
Src: DynCoreObservable<LocalCtx<BoxedObserverMutRef<'a, Item, Err>, S>> + 'a,
{
fn into_boxed(self) -> BoxedCoreObservableMutRef<'a, Item, Err, S> { Box::new(self) }
}
#[allow(coherence_leak_check)]
impl<'a, Item: 'a, Err: 'a, S, Src>
IntoBoxedCoreObservable<BoxedCoreObservableMutRefClone<'a, Item, Err, S>> for Src
where
S: Clone + Default + 'a,
Src: DynCoreObservableClone<'a, LocalCtx<BoxedObserverMutRef<'a, Item, Err>, S>> + 'a,
{
fn into_boxed(self) -> BoxedCoreObservableMutRefClone<'a, Item, Err, S> { Box::new(self) }
}
#[allow(coherence_leak_check)]
impl<'a, Item: 'a, Err, S, Src>
IntoBoxedCoreObservable<BoxedCoreObservableMutRefSend<'a, Item, Err, S>> for Src
where
S: Clone + Default + 'a,
Src: DynCoreObservable<SharedCtx<BoxedObserverMutRefSend<'a, Item, Err>, S>> + Send + 'a,
{
fn into_boxed(self) -> BoxedCoreObservableMutRefSend<'a, Item, Err, S> { Box::new(self) }
}
#[allow(coherence_leak_check)]
impl<'a, Item: 'a, Err: 'a, S, Src>
IntoBoxedCoreObservable<BoxedCoreObservableMutRefSendClone<'a, Item, Err, S>> for Src
where
S: Clone + Default + 'a,
Src: DynCoreObservableClone<'a, SharedCtx<BoxedObserverMutRefSend<'a, Item, Err>, S>> + Send + 'a,
{
fn into_boxed(self) -> BoxedCoreObservableMutRefSendClone<'a, Item, Err, S> { Box::new(self) }
}
impl<'a, Item, Err, S> ObservableType for BoxedCoreObservable<'a, Item, Err, S> {
type Item<'m>
= Item
where
Self: 'm;
type Err = Err;
}
impl<'a, Item, Err, S> ObservableType for BoxedCoreObservableClone<'a, Item, Err, S> {
type Item<'m>
= Item
where
Self: 'm;
type Err = Err;
}
impl<'a, Item, Err, S> ObservableType for BoxedCoreObservableSend<'a, Item, Err, S> {
type Item<'m>
= Item
where
Self: 'm;
type Err = Err;
}
impl<'a, Item, Err, S> ObservableType for BoxedCoreObservableSendClone<'a, Item, Err, S> {
type Item<'m>
= Item
where
Self: 'm;
type Err = Err;
}
#[allow(coherence_leak_check)]
impl<'a, Item: 'a, Err, S> ObservableType for BoxedCoreObservableMutRef<'a, Item, Err, S> {
type Item<'m>
= &'m mut Item
where
Self: 'm;
type Err = Err;
}
#[allow(coherence_leak_check)]
impl<'a, Item: 'a, Err, S> ObservableType for BoxedCoreObservableMutRefClone<'a, Item, Err, S> {
type Item<'m>
= &'m mut Item
where
Self: 'm;
type Err = Err;
}
#[allow(coherence_leak_check)]
impl<'a, Item: 'a, Err, S> ObservableType for BoxedCoreObservableMutRefSend<'a, Item, Err, S> {
type Item<'m>
= &'m mut Item
where
Self: 'm;
type Err = Err;
}
#[allow(coherence_leak_check)]
impl<'a, Item: 'a, Err, S> ObservableType for BoxedCoreObservableMutRefSendClone<'a, Item, Err, S> {
type Item<'m>
= &'m mut Item
where
Self: 'm;
type Err = Err;
}
impl<'a, Item, Err, S, O> CoreObservable<LocalCtx<O, S>> for BoxedCoreObservable<'a, Item, Err, S>
where
S: Clone + Default,
O: IntoBoxedObserver<BoxedObserver<'a, Item, Err>>,
{
type Unsub = BoxedSubscription;
fn subscribe(self, context: LocalCtx<O, S>) -> Self::Unsub {
let ctx = context.transform(|o| o.into_boxed());
self.dyn_subscribe(ctx)
}
}
impl<'a, Item, Err, S, O> CoreObservable<LocalCtx<O, S>>
for BoxedCoreObservableClone<'a, Item, Err, S>
where
S: Clone + Default,
O: IntoBoxedObserver<BoxedObserver<'a, Item, Err>>,
{
type Unsub = BoxedSubscription;
fn subscribe(self, context: LocalCtx<O, S>) -> Self::Unsub {
let ctx = context.transform(|o| o.into_boxed());
self.dyn_subscribe(ctx)
}
}
impl<'a, Item, Err, S, O> CoreObservable<SharedCtx<O, S>>
for BoxedCoreObservableSend<'a, Item, Err, S>
where
S: Clone + Default,
O: IntoBoxedObserver<BoxedObserverSend<'a, Item, Err>>,
{
type Unsub = BoxedSubscriptionSend;
fn subscribe(self, context: SharedCtx<O, S>) -> Self::Unsub {
let ctx = context.transform(|o| o.into_boxed());
self.dyn_subscribe(ctx)
}
}
impl<'a, Item, Err, S, O> CoreObservable<SharedCtx<O, S>>
for BoxedCoreObservableSendClone<'a, Item, Err, S>
where
S: Clone + Default,
O: IntoBoxedObserver<BoxedObserverSend<'a, Item, Err>>,
{
type Unsub = BoxedSubscriptionSend;
fn subscribe(self, context: SharedCtx<O, S>) -> Self::Unsub {
let ctx = context.transform(|o| o.into_boxed());
self.dyn_subscribe(ctx)
}
}
#[allow(coherence_leak_check)]
impl<'a, Item: 'a, Err, S, O> CoreObservable<LocalCtx<O, S>>
for BoxedCoreObservableMutRef<'a, Item, Err, S>
where
S: Clone + Default,
O: IntoBoxedObserver<BoxedObserverMutRef<'a, Item, Err>>,
{
type Unsub = BoxedSubscription;
fn subscribe(self, context: LocalCtx<O, S>) -> Self::Unsub {
let ctx = context.transform(|o| o.into_boxed());
self.dyn_subscribe(ctx)
}
}
#[allow(coherence_leak_check)]
impl<'a, Item: 'a, Err, S, O> CoreObservable<LocalCtx<O, S>>
for BoxedCoreObservableMutRefClone<'a, Item, Err, S>
where
S: Clone + Default,
O: IntoBoxedObserver<BoxedObserverMutRef<'a, Item, Err>>,
{
type Unsub = BoxedSubscription;
fn subscribe(self, context: LocalCtx<O, S>) -> Self::Unsub {
let ctx = context.transform(|o| o.into_boxed());
self.dyn_subscribe(ctx)
}
}
#[allow(coherence_leak_check)]
impl<'a, Item: 'a, Err, S, O> CoreObservable<SharedCtx<O, S>>
for BoxedCoreObservableMutRefSend<'a, Item, Err, S>
where
S: Clone + Default,
O: IntoBoxedObserver<BoxedObserverMutRefSend<'a, Item, Err>>,
{
type Unsub = BoxedSubscriptionSend;
fn subscribe(self, context: SharedCtx<O, S>) -> Self::Unsub {
let ctx = context.transform(|o| o.into_boxed());
self.dyn_subscribe(ctx)
}
}
#[allow(coherence_leak_check)]
impl<'a, Item: 'a, Err, S, O> CoreObservable<SharedCtx<O, S>>
for BoxedCoreObservableMutRefSendClone<'a, Item, Err, S>
where
S: Clone + Default,
O: IntoBoxedObserver<BoxedObserverMutRefSend<'a, Item, Err>>,
{
type Unsub = BoxedSubscriptionSend;
fn subscribe(self, context: SharedCtx<O, S>) -> Self::Unsub {
let ctx = context.transform(|o| o.into_boxed());
self.dyn_subscribe(ctx)
}
}
#[cfg(feature = "scheduler")]
use crate::scheduler::{LocalScheduler, SharedScheduler};
#[cfg(feature = "scheduler")]
pub type LocalBoxedObservable<'a, Item, Err = ()> =
crate::context::Local<BoxedCoreObservable<'a, Item, Err, LocalScheduler>>;
#[cfg(feature = "scheduler")]
pub type SharedBoxedObservable<'a, Item, Err = ()> =
crate::context::Shared<BoxedCoreObservableSend<'a, Item, Err, SharedScheduler>>;
#[cfg(feature = "scheduler")]
pub type LocalBoxedObservableMutRef<'a, Item, Err = ()> =
crate::context::Local<BoxedCoreObservableMutRef<'a, Item, Err, LocalScheduler>>;
#[cfg(feature = "scheduler")]
pub type SharedBoxedObservableMutRef<'a, Item, Err = ()> =
crate::context::Shared<BoxedCoreObservableMutRefSend<'a, Item, Err, SharedScheduler>>;
#[cfg(feature = "scheduler")]
pub type LocalBoxedObservableClone<'a, Item, Err = ()> =
crate::context::Local<BoxedCoreObservableClone<'a, Item, Err, LocalScheduler>>;
#[cfg(feature = "scheduler")]
pub type SharedBoxedObservableClone<'a, Item, Err = ()> =
crate::context::Shared<BoxedCoreObservableSendClone<'a, Item, Err, SharedScheduler>>;
#[cfg(feature = "scheduler")]
pub type LocalBoxedObservableMutRefClone<'a, Item, Err = ()> =
crate::context::Local<BoxedCoreObservableMutRefClone<'a, Item, Err, LocalScheduler>>;
#[cfg(feature = "scheduler")]
pub type SharedBoxedObservableMutRefClone<'a, Item, Err = ()> =
crate::context::Shared<BoxedCoreObservableMutRefSendClone<'a, Item, Err, SharedScheduler>>;