freya_core/
event_handler.rs1use 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 false
28 }
29}
30
31impl<A, R, H: FnMut(A) -> R + 'static> From<H> for Callback<A, R> {
32 fn from(value: H) -> Self {
33 Callback::new(value)
34 }
35}
36
37pub struct NoArgCallback<R>(Rc<RefCell<dyn FnMut() -> R>>);
38
39impl<R> NoArgCallback<R> {
40 pub fn new(callback: impl FnMut() -> R + 'static) -> Self {
41 Self(Rc::new(RefCell::new(callback)))
42 }
43
44 pub fn call(&self) -> R {
45 (self.0.borrow_mut())()
46 }
47}
48
49impl<R> Clone for NoArgCallback<R> {
50 fn clone(&self) -> Self {
51 Self(self.0.clone())
52 }
53}
54
55impl<R> PartialEq for NoArgCallback<R> {
56 fn eq(&self, _other: &Self) -> bool {
57 true
58 }
59}
60
61impl<R, H: FnMut() -> R + 'static> From<H> for NoArgCallback<R> {
62 fn from(value: H) -> Self {
63 NoArgCallback::new(value)
64 }
65}
66
67pub struct EventHandler<T>(Rc<RefCell<dyn FnMut(T)>>);
68
69impl<T> EventHandler<T> {
70 pub fn new(handler: impl FnMut(T) + 'static) -> Self {
71 Self(Rc::new(RefCell::new(handler)))
72 }
73
74 pub fn call(&self, data: T) {
75 (self.0.borrow_mut())(data);
76 }
77}
78
79impl<T> Clone for EventHandler<T> {
80 fn clone(&self) -> Self {
81 Self(self.0.clone())
82 }
83}
84
85impl<T> PartialEq for EventHandler<T> {
86 fn eq(&self, _other: &Self) -> bool {
87 false
89 }
90}
91
92impl<H: FnMut(D) + 'static, D> From<H> for EventHandler<D> {
93 fn from(value: H) -> Self {
94 EventHandler::new(value)
95 }
96}