respo/node/component/effect/
base.rs1use std::{any::Any, fmt::Debug};
4
5pub trait AsRespoEffectBase {
8 fn as_base(&self) -> &dyn RespoEffectDynEq;
9}
10
11impl<T: RespoEffectDynEq> AsRespoEffectBase for T {
12 fn as_base(&self) -> &dyn RespoEffectDynEq {
13 self
14 }
15}
16
17pub trait RespoEffectDynEq
18where
19 Self: Debug + Any + 'static,
20{
21 fn as_any(&self) -> &dyn Any;
22 fn do_eq(&self, rhs: &dyn RespoEffectDynEq) -> Option<bool>;
23}
24
25impl<T> RespoEffectDynEq for T
26where
27 T: PartialEq + Debug + 'static,
28{
29 fn as_any(&self) -> &dyn Any {
30 self
31 }
32
33 fn do_eq(&self, rhs: &dyn RespoEffectDynEq) -> Option<bool> {
34 if let Some(rhs_concrete) = rhs.as_any().downcast_ref::<Self>() {
35 Some(self == rhs_concrete)
36 } else {
37 Some(false)
38 }
39 }
40}
41
42impl PartialEq for dyn RespoEffectDynEq {
43 fn eq(&self, rhs: &Self) -> bool {
44 self.do_eq(rhs) == Some(true)
45 }
46}