psyche_utils/bucket_strainer/rules/
mod.rs

1mod bucket_limit_rule;
2mod closure_rule;
3mod fixed_score_rule;
4mod mul_rule;
5mod sum_rule;
6
7use crate::bucket_strainer::Bucket;
8use crate::Scalar;
9pub use bucket_limit_rule::*;
10pub use closure_rule::*;
11pub use fixed_score_rule::*;
12pub use mul_rule::*;
13pub use sum_rule::*;
14
15/// Trait used to tell how much successfuly bucket has to get incoming item.
16///
17/// # Example
18/// ```
19/// use psyche_utils::bucket_strainer::{Bucket, Rule};
20/// use psyche_utils::Scalar;
21///
22/// #[derive(Clone)]
23/// struct SuccessRule;
24///
25/// impl<T> Rule<T> for SuccessRule
26/// where
27///     T: Clone,
28/// {
29///     fn score(&self, _: &T, _: &Bucket<T>) -> Scalar {
30///         1.0
31///     }
32///
33///     fn box_clone(&self) -> Box<dyn Rule<T>> {
34///         Box::new((*self).clone())
35///     }
36/// }
37/// ```
38pub trait Rule<T>
39where
40    T: Clone,
41{
42    /// Score incoming item.
43    ///
44    /// # Arguments
45    /// * `item` - Incoming item.
46    /// * `bucket` - Bucket that tests incoming item.
47    ///
48    /// # Return
49    /// Score for given item that tell how lucky it is to fall into given bucket.
50    fn score(&self, item: &T, bucket: &Bucket<T>) -> Scalar;
51
52    /// Create boxed clone for this rule.
53    fn box_clone(&self) -> Box<dyn Rule<T>>;
54}
55
56impl<T> Clone for Box<Rule<T>>
57where
58    T: Clone,
59{
60    fn clone(&self) -> Box<Rule<T>> {
61        self.box_clone()
62    }
63}