Skip to content

Commit

Permalink
feat: Implement local subject for 'BehaviorSubject'
Browse files Browse the repository at this point in the history
  • Loading branch information
utilForever committed Sep 3, 2021
1 parent 897b1f7 commit 63f6e06
Showing 1 changed file with 59 additions and 0 deletions.
59 changes: 59 additions & 0 deletions src/subject/local_subject.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ use std::rc::Rc;

type RcPublishers<P> = Rc<RefCell<Vec<Box<P>>>>;
type _LocalSubject<P> = Subject<RcPublishers<P>, LocalSubscription>;
type _LocalBehaviorSubject<P, Item> = BehaviorSubject<RcPublishers<P>, LocalSubscription, Item>;

pub type LocalSubject<'a, Item, Err> =
_LocalSubject<dyn Publisher<Item = Item, Err = Err> + 'a>;
Expand All @@ -17,6 +18,18 @@ pub type LocalSubjectErrRef<'a, Item, Err> =
pub type LocalSubjectRefAll<'a, Item, Err> =
_LocalSubject<dyn Publisher<Item = &'a Item, Err = &'a Err> + 'a>;

pub type LocalBehaviorSubject<'a, Item, Err> =
_LocalBehaviorSubject<dyn Publisher<Item = Item, Err = Err> + 'a, Item>;

pub type LocalBehaviorSubjectRef<'a, Item, Err> =
_LocalBehaviorSubject<dyn Publisher<Item = &'a Item, Err = Err> + 'a, Item>;

pub type LocalBehaviorSubjectErrRef<'a, Item, Err> =
_LocalBehaviorSubject<dyn Publisher<Item = Item, Err = &'a Err> + 'a, Item>;

pub type LocalBehaviorSubjectRefAll<'a, Item, Err> =
_LocalBehaviorSubject<dyn Publisher<Item = &'a Item, Err = &'a Err> + 'a, Item>;

impl<'a, Item, Err> LocalSubject<'a, Item, Err> {
#[inline]
pub fn new() -> Self
Expand Down Expand Up @@ -53,6 +66,52 @@ impl<'a, Item, Err> LocalObservable<'a> for LocalSubject<'a, Item, Err> {
}
}

impl<'a, Item, Err> LocalBehaviorSubject<'a, Item, Err> {
#[inline]
pub fn new(value: Item) -> Self
where
Self: Default,
{
LocalBehaviorSubject {
observers: Default::default(),
subscription: Default::default(),
value,
}
}
#[inline]
pub fn subscribed_size(&self) -> usize {
self.observers.observers.borrow().len()
}
}

impl<'a, Item, Err> Observable for LocalBehaviorSubject<'a, Item, Err> {
type Item = Item;
type Err = Err;
}

impl<'a, Item, Err> LocalObservable<'a> for LocalBehaviorSubject<'a, Item, Err> {
type Unsub = LocalSubscription;
fn actual_subscribe<O: Observer<Item = Self::Item, Err = Self::Err> + 'a>(
self,
subscriber: Subscriber<O, LocalSubscription>,
) -> LocalSubscription {
let subscription = subscriber.subscription.clone();
self.subscription.add(subscription.clone());

self
.observers
.observers
.borrow_mut()
.push(Box::new(subscriber));

if !subscription.is_closed() {
self.observers.observers.borrow_mut().last_mut().unwrap().next(self.value);
}

subscription
}
}

#[cfg(test)]
mod test {
use crate::prelude::*;
Expand Down

0 comments on commit 63f6e06

Please sign in to comment.