rsconnect/
connect_interface.rs

1use std::{cell::RefCell, rc::Rc};
2
3use crate::{
4	comparable_value::{ComparableValue, NonComparableValue},
5	connect_dependencies::ConnectDependencies,
6	connect_node_update::NodeUpdate,
7	connect_structs::Connect,
8	node_structs::{
9		Computed, ConnectComputed, ConnectComputedAny, ConnectEffected,
10		ConnectEffectedAny, ConnectObserved, ConnectObservedAny, Effected, Observed,
11	},
12	node_traits::{ComputedNode, DynComputedNode},
13};
14
15pub trait ConnectInterface {
16	fn observed<T: PartialEq + 'static>(&mut self, value: T) -> ConnectObserved<T>;
17
18	fn observed_any<T: 'static>(&mut self, value: T) -> ConnectObservedAny<T>;
19
20	fn computed<T: PartialEq + 'static, F: Fn(&mut Connect) -> T + 'static>(
21		&mut self,
22		comp_fun: F,
23	) -> ConnectComputed<T, F>;
24
25	fn computed_any<T: 'static, F: Fn(&mut Connect) -> T + 'static>(
26		&mut self,
27		comp_fun: F,
28	) -> ConnectComputedAny<T, F>;
29
30	fn effected<
31		T: PartialEq + 'static,
32		F: Fn(&mut Connect) -> T + 'static,
33		E: FnMut(&T) + 'static,
34	>(
35		&mut self,
36		comp_fun: F,
37		effect: E,
38	) -> ConnectEffected<T, F, E>;
39
40	fn effected_any<
41		T: 'static,
42		F: Fn(&mut Connect) -> T + 'static,
43		E: FnMut(&T) + 'static,
44	>(
45		&mut self,
46		comp_fun: F,
47		effect: E,
48	) -> ConnectEffectedAny<T, F, E>;
49}
50
51impl ConnectInterface for Connect {
52	fn observed<T: PartialEq + 'static>(&mut self, value: T) -> ConnectObserved<T> {
53		Rc::new(RefCell::new(Observed::<T, ComparableValue<T>>::new(value)))
54	}
55
56	fn observed_any<T: 'static>(&mut self, value: T) -> ConnectObservedAny<T> {
57		Rc::new(RefCell::new(Observed::<T, NonComparableValue<T>>::new(
58			value,
59		)))
60	}
61
62	fn computed<T: PartialEq + 'static, F: Fn(&mut Connect) -> T + 'static>(
63		&mut self,
64		comp_fun: F,
65	) -> ConnectComputed<T, F> {
66		let (value, dependencies) = self.get_computed_value(&comp_fun);
67		let computed = Rc::new(RefCell::new(Computed::<T, ComparableValue<T>, F>::new(
68			comp_fun,
69			value,
70			dependencies,
71		)));
72		let computed_clone = computed.clone() as DynComputedNode;
73		self.add_computed_to_derived_lists(&computed_clone);
74		computed
75	}
76
77	fn computed_any<T: 'static, F: Fn(&mut Connect) -> T + 'static>(
78		&mut self,
79		comp_fun: F,
80	) -> ConnectComputedAny<T, F> {
81		let (value, dependencies) = self.get_computed_value(&comp_fun);
82		let computed = Rc::new(RefCell::new(
83			Computed::<T, NonComparableValue<T>, F>::new(comp_fun, value, dependencies),
84		));
85		let computed_clone = computed.clone() as DynComputedNode;
86		self.add_computed_to_derived_lists(&computed_clone);
87		computed
88	}
89
90	fn effected<
91		T: PartialEq + 'static,
92		F: Fn(&mut Connect) -> T + 'static,
93		E: FnMut(&T) + 'static,
94	>(
95		&mut self,
96		comp_fun: F,
97		effect: E,
98	) -> ConnectEffected<T, F, E> {
99		let (value, dependencies) = self.get_computed_value(&comp_fun);
100		let effected =
101			Rc::new(RefCell::new(Effected::<T, ComparableValue<T>, F, E>::new(
102				comp_fun,
103				value,
104				effect,
105				dependencies,
106			)));
107		effected.borrow_mut().run_effect();
108		let effected_clone = effected.clone() as DynComputedNode;
109		self.add_computed_to_derived_lists(&effected_clone);
110		effected
111	}
112
113	fn effected_any<
114		T: 'static,
115		F: Fn(&mut Connect) -> T + 'static,
116		E: FnMut(&T) + 'static,
117	>(
118		&mut self,
119		comp_fun: F,
120		effect: E,
121	) -> ConnectEffectedAny<T, F, E> {
122		let (value, dependencies) = self.get_computed_value(&comp_fun);
123		let effected = Rc::new(RefCell::new(
124			Effected::<T, NonComparableValue<T>, F, E>::new(
125				comp_fun,
126				value,
127				effect,
128				dependencies,
129			),
130		));
131		effected.borrow_mut().run_effect();
132		let effected_clone = effected.clone() as DynComputedNode;
133		self.add_computed_to_derived_lists(&effected_clone);
134		effected
135	}
136}