use std::convert::Infallible;
use crate::{
context::Context,
observable::{CoreObservable, ObservableType},
observer::Observer,
};
#[derive(Default, Clone, Copy)]
pub struct Empty;
impl ObservableType for Empty {
type Item<'a>
= ()
where
Self: 'a;
type Err = Infallible;
}
impl<C> CoreObservable<C> for Empty
where
C: Context,
C::Inner: Observer<(), Infallible>,
{
type Unsub = ();
fn subscribe(self, context: C) -> Self::Unsub { context.into_inner().complete(); }
}
#[derive(Default, Clone, Copy)]
pub struct Never;
impl ObservableType for Never {
type Item<'a>
= ()
where
Self: 'a;
type Err = Infallible;
}
impl<C> CoreObservable<C> for Never
where
C: Context,
C::Inner: Observer<(), Infallible>,
{
type Unsub = ();
fn subscribe(self, _context: C) -> Self::Unsub {}
}
#[derive(Clone)]
pub struct ThrowErr<E> {
pub error: E,
}
impl<E> ObservableType for ThrowErr<E> {
type Item<'a>
= ()
where
Self: 'a;
type Err = E;
}
impl<C, E> CoreObservable<C> for ThrowErr<E>
where
C: Context,
C::Inner: Observer<(), E>,
{
type Unsub = ();
fn subscribe(self, context: C) -> Self::Unsub { context.into_inner().error(self.error); }
}
#[cfg(test)]
mod tests {
use std::{cell::RefCell, rc::Rc};
use crate::prelude::*;
#[rxrust_macro::test(local)]
async fn test_empty() {
let completed = Rc::new(RefCell::new(false));
let completed_clone = completed.clone();
let hits = Rc::new(RefCell::new(0));
let hits_clone = hits.clone();
Local::empty()
.on_complete(move || *completed_clone.borrow_mut() = true)
.subscribe(move |_| *hits_clone.borrow_mut() += 1);
assert_eq!(*hits.borrow(), 0);
assert!(*completed.borrow());
}
#[rxrust_macro::test(local)]
async fn test_never() {
let completed = Rc::new(RefCell::new(false));
let completed_clone = completed.clone();
let hits = Rc::new(RefCell::new(0));
let hits_clone = hits.clone();
Local::never()
.on_complete(move || *completed_clone.borrow_mut() = true)
.subscribe(move |_| *hits_clone.borrow_mut() += 1);
assert_eq!(*hits.borrow(), 0);
assert!(!*completed.borrow());
}
#[rxrust_macro::test(local)]
async fn test_throw_err() {
let completed = Rc::new(RefCell::new(false));
let completed_clone = completed.clone();
let hits = Rc::new(RefCell::new(0));
let hits_clone = hits.clone();
let error = Rc::new(RefCell::new(String::new()));
let error_clone = error.clone();
Local::throw_err("error".to_string())
.on_complete(move || *completed_clone.borrow_mut() = true)
.on_error(move |e| *error_clone.borrow_mut() = e)
.subscribe(move |_| *hits_clone.borrow_mut() += 1);
assert_eq!(*hits.borrow(), 0);
assert!(!*completed.borrow());
assert_eq!(*error.borrow(), "error");
}
}