another_rxrust/observables/
timer.rs1use 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}