another-rxrust 0.0.46

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

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

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

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

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

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