freya_core/
event_handler.rs

1use std::{
2    cell::RefCell,
3    rc::Rc,
4};
5
6pub struct Callback<A, R>(Rc<RefCell<dyn FnMut(A) -> R>>);
7
8impl<A, R> Callback<A, R> {
9    pub fn new(callback: impl FnMut(A) -> R + 'static) -> Self {
10        Self(Rc::new(RefCell::new(callback)))
11    }
12
13    pub fn call(&self, data: A) -> R {
14        (self.0.borrow_mut())(data)
15    }
16}
17
18impl<A, R> Clone for Callback<A, R> {
19    fn clone(&self) -> Self {
20        Self(self.0.clone())
21    }
22}
23
24impl<A, R> PartialEq for Callback<A, R> {
25    fn eq(&self, _other: &Self) -> bool {
26        true
27    }
28}
29
30impl<A, R, H: FnMut(A) -> R + 'static> From<H> for Callback<A, R> {
31    fn from(value: H) -> Self {
32        Callback::new(value)
33    }
34}
35
36pub struct NoArgCallback<R>(Rc<RefCell<dyn FnMut() -> R>>);
37
38impl<R> NoArgCallback<R> {
39    pub fn new(callback: impl FnMut() -> R + 'static) -> Self {
40        Self(Rc::new(RefCell::new(callback)))
41    }
42
43    pub fn call(&self) -> R {
44        (self.0.borrow_mut())()
45    }
46}
47
48impl<R> Clone for NoArgCallback<R> {
49    fn clone(&self) -> Self {
50        Self(self.0.clone())
51    }
52}
53
54impl<R> PartialEq for NoArgCallback<R> {
55    fn eq(&self, _other: &Self) -> bool {
56        true
57    }
58}
59
60impl<R, H: FnMut() -> R + 'static> From<H> for NoArgCallback<R> {
61    fn from(value: H) -> Self {
62        NoArgCallback::new(value)
63    }
64}
65
66pub struct EventHandler<T>(Rc<RefCell<dyn FnMut(T)>>);
67
68impl<T> EventHandler<T> {
69    pub fn new(handler: impl FnMut(T) + 'static) -> Self {
70        Self(Rc::new(RefCell::new(handler)))
71    }
72
73    pub fn call(&self, data: T) {
74        (self.0.borrow_mut())(data);
75    }
76}
77
78impl<T> Clone for EventHandler<T> {
79    fn clone(&self) -> Self {
80        Self(self.0.clone())
81    }
82}
83
84impl<T> PartialEq for EventHandler<T> {
85    fn eq(&self, _other: &Self) -> bool {
86        // TODO: Decide whether event handlers should be captured or not.
87        false
88    }
89}
90
91impl<H: FnMut(D) + 'static, D> From<H> for EventHandler<D> {
92    fn from(value: H) -> Self {
93        EventHandler::new(value)
94    }
95}