reactive_state/
listener.rs1use std::rc::{Rc, Weak};
2
3pub trait AsListener<State, Event> {
6 fn as_listener(&self) -> Listener<State, Event>;
8}
9
10#[derive(Clone)]
17pub struct Listener<State, Event>(Weak<dyn Fn(Rc<State>, Option<Event>)>);
18
19impl<State, Event> Listener<State, Event> {
20 pub fn as_callback(&self) -> Option<Callback<State, Event>> {
23 match self.0.upgrade() {
24 Some(listener_rc) => Some(Callback(listener_rc)),
25 None => None,
26 }
27 }
28}
29
30impl<State, Event> AsListener<State, Event> for Listener<State, Event> {
31 fn as_listener(&self) -> Listener<State, Event> {
32 Listener(self.0.clone())
33 }
34}
35
36#[derive(Clone)]
72pub struct Callback<State, Event>(Rc<dyn Fn(Rc<State>, Option<Event>)>);
73
74impl<State, Event> AsListener<State, Event> for &Callback<State, Event> {
75 fn as_listener(&self) -> Listener<State, Event> {
76 Listener(Rc::downgrade(&self.0))
77 }
78}
79
80impl<State, Event> Callback<State, Event> {
81 pub fn new<C: Fn(Rc<State>, Option<Event>) + 'static>(closure: C) -> Self {
82 Callback(Rc::new(closure))
83 }
84 pub fn emit(&self, state: Rc<State>, event: Option<Event>) {
85 (self.0)(state, event)
86 }
87}
88
89impl<C, State, Event> From<C> for Callback<State, Event>
90where
91 C: Fn(Rc<State>, Option<Event>) + 'static,
92{
93 fn from(closure: C) -> Self {
94 Callback(Rc::new(closure))
95 }
96}
97
98#[cfg(feature = "yew")]
99#[cfg_attr(docsrs, doc(cfg(feature = "yew")))]
100impl<State, Event> From<yew::Callback<Rc<State>>> for Callback<State, Event>
101where
102 State: 'static,
103 Event: 'static,
104{
105 fn from(yew_callback: yew::Callback<Rc<State>>) -> Self {
106 Callback(Rc::new(move |state, _| {
107 yew_callback.emit(state);
108 }))
109 }
110}
111
112#[cfg(feature = "yew")]
113#[cfg_attr(docsrs, doc(cfg(feature = "yew")))]
114impl<State, Event> From<yew::Callback<(Rc<State>, Option<Event>)>> for Callback<State, Event>
115where
116 State: 'static,
117 Event: 'static,
118{
119 fn from(yew_callback: yew::Callback<(Rc<State>, Option<Event>)>) -> Self {
120 Callback(Rc::new(move |state, event| {
121 yew_callback.emit((state, event));
122 }))
123 }
124}
125
126#[cfg(feature = "yew")]
127#[cfg_attr(docsrs, doc(cfg(feature = "yew")))]
128impl<State, Event> From<yew::Callback<()>> for Callback<State, Event>
129where
130 State: 'static,
131 Event: 'static,
132{
133 fn from(yew_callback: yew::Callback<()>) -> Self {
134 Callback(Rc::new(move |_, _| {
135 yew_callback.emit(());
136 }))
137 }
138}