another-rxrust 0.0.46

A different implementation than `rxRust` for easier use of `ReactiveX` in `Rust`.
Documentation
#[cfg(all(test, not(feature = "web")))]
mod test {
  use crate::prelude::*;
  use std::{thread, time};

  #[test]
  fn basic() {
    fn ob() -> Observable<'static, i32> {
      Observable::create(|s| {
        s.next(100);
        s.next(200);
        s.complete();
      })
    }

    observables::from_iter(1..10)
      .observe_on(schedulers::new_thread_scheduler())
      .flat_map(|x| match x {
        1 => observables::empty(),
        2 => observables::just(x),
        3 => ob().map(move |y| (y + x)),
        4 => observables::error(RxError::from_error("some error")),
        _ => observables::never(),
      })
      .map(|x| format!("{}", x))
      .on_error_resume_next(|e| {
        ob().map(move |x| {
          format!(
            "resume {:?} {}",
            e.downcast_ref::<&str>(),
            x
          )
        })
      })
      .subscribe(
        |x| println!("{}", x),
        |e| println!("{:?}", e.downcast_ref::<&str>()),
        || println!("complete"),
      );

    thread::sleep(time::Duration::from_millis(500));
  }

  #[test]
  fn outside_var() {
    #[derive(Clone)]
    struct OutsideVar {
      data: String,
    }
    let x = OutsideVar { data: "abc".to_owned() };

    let xx = x.clone();
    let xxx = x.clone();

    let jx = observables::just(x);

    jx.subscribe(
      |x| println!("{}", x.data),
      print_error!(),
      move || {
        println!("complete {}", xx.data);
      },
    );

    jx.subscribe(
      |x| println!("{}", x.data),
      print_error!(),
      move || {
        println!("complete {}", xxx.data);
      },
    );
  }
}