psyche_utils/bucket_strainer/rules/
closure_rule.rs

1use crate::bucket_strainer::{Bucket, Rule};
2use crate::Scalar;
3
4/// Bucket rule that applies score based on closure result.
5#[derive(Clone)]
6pub struct ClosureRule<T>
7where
8    T: Clone,
9{
10    /// Closure that will calculate item score.
11    pub closure: fn(&T, &Bucket<T>) -> Scalar,
12}
13
14impl<T> ClosureRule<T>
15where
16    T: Clone,
17{
18    pub fn new(closure: fn(&T, &Bucket<T>) -> Scalar) -> Self {
19        Self { closure }
20    }
21}
22
23impl<T> Rule<T> for ClosureRule<T>
24where
25    T: Clone + 'static,
26{
27    fn score(&self, item: &T, bucket: &Bucket<T>) -> Scalar {
28        (self.closure)(item, bucket)
29    }
30
31    fn box_clone(&self) -> Box<dyn Rule<T>> {
32        Box::new((*self).clone())
33    }
34}