1use core::ops::{Deref, DerefMut};
15
16pub struct Handler<'a, T, V = ()>(bool, Box<dyn FnMut(T) -> V + Send + Sync + 'a>);
17
18impl<T, V> Handler<'_, T, V>
19where
20 V: Default,
21{
22 pub fn is_default(&self) -> bool {
23 self.0
24 }
25
26 pub fn take(&mut self) -> Self {
27 core::mem::take(self)
28 }
29}
30
31impl<'a, T, V> Default for Handler<'a, T, V>
32where
33 V: Default,
34{
35 fn default() -> Self {
36 Self(true, Box::new(|_| V::default()))
37 }
38}
39
40impl<'a, F, T, V> From<F> for Handler<'a, T, V>
41where
42 F: FnMut(T) -> V + Send + Sync + 'a,
43{
44 fn from(f: F) -> Self {
45 Self(false, Box::new(f))
46 }
47}
48
49impl<'a, T, V> Deref for Handler<'a, T, V> {
50 type Target = Box<dyn FnMut(T) -> V + Send + Sync + 'a>;
51
52 fn deref(&self) -> &Self::Target {
53 &self.1
54 }
55}
56
57impl<'a, T, V> DerefMut for Handler<'a, T, V> {
58 fn deref_mut(&mut self) -> &mut Self::Target {
59 &mut self.1
60 }
61}