1#![forbid(unsafe_code)]
2
3use std::sync::Arc;
4
5pub type WakeFn = Arc<dyn Fn() + Send + Sync>;
6
7pub fn noop_wake() -> WakeFn {
8 Arc::new(|| {})
9}
10
11pub fn fn_wake(f: impl Fn() + Send + Sync + 'static) -> WakeFn {
12 Arc::new(f)
13}
14
15#[cfg(test)]
16mod tests {
17 use super::*;
18 use std::sync::atomic::{AtomicUsize, Ordering};
19
20 #[test]
21 fn noop_wake_does_nothing() {
22 noop_wake()();
23 }
24
25 #[test]
26 fn fn_wake_calls_closure() {
27 let n = Arc::new(AtomicUsize::new(0));
28 let probe = Arc::clone(&n);
29 let w = fn_wake(move || {
30 probe.fetch_add(1, Ordering::SeqCst);
31 });
32 w();
33 w();
34 assert_eq!(n.load(Ordering::SeqCst), 2);
35 }
36}