1use crate::membership::MembershipFn;
2
3pub type BoxedMembershipFn = Box<dyn MembershipFn + Send + Sync + 'static>;
5
6pub struct Term {
7 name: String,
8 mf: BoxedMembershipFn,
9}
10
11impl Term {
12 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 pub fn name(&self) -> &str {
26 &self.name
27 }
28}
29
30impl crate::membership::MembershipFn for Term {
31 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 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 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}