another-rxrust 0.0.46

A different implementation than `rxRust` for easier use of `ReactiveX` in `Rust`.
Documentation
use crate::prelude::*;

pub fn defer<'a, Item, F>(f: F) -> Observable<'a, Item>
where
  Item: Clone + Send + Sync,
  F: Fn() -> Observable<'a, Item> + Send + Sync + 'a,
{
  Observable::create(move |s| {
    f().inner_subscribe(s);
  })
}

#[cfg(test)]
mod test {
  use std::sync::{Arc, RwLock};

  use crate::prelude::*;

  #[test]
  fn basic() {
    let n = Arc::new(RwLock::new(0));
    let f = move || {
      let x = *n.read().unwrap();
      *n.write().unwrap() += 1;
      observables::just(x)
    };

    observables::defer(f.clone()).subscribe(
      print_next_fmt!("{}"),
      print_error!(),
      print_complete!(),
    );

    observables::defer(f.clone()).subscribe(
      print_next_fmt!("{}"),
      print_error!(),
      print_complete!(),
    );
  }
}