another_rxrust/observables/
timer.rs

1use crate::prelude::*;
2use scheduler::IScheduler;
3use std::{thread, time::Duration};
4
5pub fn timer<'a, Scheduler, SchedulerCreator>(
6  dur: Duration,
7  scheduler_ctor: SchedulerCreator,
8) -> Observable<'a, ()>
9where
10  Scheduler: IScheduler<'a> + Clone + Send + Sync + 'a,
11  SchedulerCreator: Fn() -> Scheduler + Send + Sync + 'a,
12{
13  Observable::create(move |s| {
14    let scheduler = scheduler_ctor();
15    let scheduler_in_post = scheduler.clone();
16    scheduler.post(move || {
17      thread::sleep(dur);
18      s.next(());
19      s.complete();
20      scheduler_in_post.abort();
21    })
22  })
23}
24
25#[cfg(all(test, not(feature = "web")))]
26mod test {
27  use crate::prelude::*;
28  use std::{thread, time};
29
30  #[test]
31  fn basic() {
32    observables::timer(
33      time::Duration::from_millis(1000),
34      schedulers::default_scheduler(),
35    )
36    .subscribe(
37      print_next!(),
38      print_error!(),
39      print_complete!(),
40    );
41  }
42
43  #[test]
44  fn thread() {
45    observables::timer(
46      time::Duration::from_millis(1000),
47      schedulers::new_thread_scheduler(),
48    )
49    .subscribe(
50      print_next!(),
51      print_error!(),
52      print_complete!(),
53    );
54    thread::sleep(time::Duration::from_millis(1500));
55  }
56}