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}