rust_fuzzylogic/
term.rs

1use crate::membership::MembershipFn;
2
3//Type: Term holding a boxed membership function.
4pub type BoxedMembershipFn = Box<dyn MembershipFn + Send + Sync + 'static>;
5
6pub struct Term {
7    name: String,
8    mf: BoxedMembershipFn,
9}
10
11impl Term {
12    ///Creates a new term label wrapper.
13    pub fn new<S, M>(name: S, m: M) -> Self
14    where
15        S: Into<String>,
16        M: MembershipFn + Send + Sync + 'static,
17    {
18        Self {
19            name: name.into(),
20            mf: Box::new(m),
21        }
22    }
23
24    ///Returns the labeled name.
25    pub fn name(&self) -> &str {
26        &self.name
27    }
28}
29
30impl crate::membership::MembershipFn for Term {
31    ///Evaluates the membership degree of input against the wrapped membership.
32    fn eval(&self, x: crate::Float) -> crate::Float {
33        self.mf.eval(x)
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use crate::term::*;
40
41    #[test]
42    fn test_term() {
43        // TEST for Term + label functionality.
44        // Expect a Term wrapper that carries a string label and delegates eval to the inner membership fn.
45        let mf = crate::membership::triangular::Triangular::new(-1.0, 0.0, 1.0).unwrap();
46        let term = crate::term::Term::new("cold", mf);
47
48        // The term should expose its name/label and evaluate via the wrapped membership function.
49        assert_eq!(term.name(), "cold");
50        let x: crate::Float = 0.25;
51        let y = term.eval(x);
52        assert!(y >= 0.0 && y <= 1.0);
53    }
54}