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}