psyche_utils/bucket_strainer/
bucket.rs

1use crate::bucket_strainer::{Layer, Rule};
2use crate::Scalar;
3use std::mem;
4
5/// Bucket strainer bucket that contains rule that scores items and collection of items that fallen
6/// into it on processing phase.
7#[derive(Clone)]
8pub struct Bucket<T>
9where
10    T: Clone,
11{
12    id: String,
13    items: Vec<T>,
14    rule: Box<dyn Rule<T>>,
15    pub acceptable_score_treshold: Scalar,
16}
17
18impl<T> Bucket<T>
19where
20    T: Clone,
21{
22    pub fn new(id: String, rule: Box<dyn Rule<T>>) -> Self {
23        Self {
24            id,
25            items: vec![],
26            rule,
27            acceptable_score_treshold: 0.0,
28        }
29    }
30
31    pub fn id(&self) -> &str {
32        &self.id
33    }
34
35    pub fn items(&self) -> &[T] {
36        &self.items
37    }
38
39    pub fn rule(&self) -> &Box<dyn Rule<T>> {
40        &self.rule
41    }
42
43    pub fn replace_rule(&mut self, rule: Box<dyn Rule<T>>) -> Box<dyn Rule<T>> {
44        mem::replace(&mut self.rule, rule)
45    }
46
47    pub(crate) fn score(&self, item: &T) -> Option<Scalar> {
48        let score = self.rule.score(item, self);
49        if score > self.acceptable_score_treshold {
50            Some(score)
51        } else {
52            None
53        }
54    }
55
56    pub(crate) fn clear(&mut self) {
57        self.items.clear();
58    }
59
60    pub(crate) fn insert(&mut self, item: T) {
61        self.items.push(item);
62    }
63}
64
65impl<T> Into<Layer<T>> for Bucket<T>
66where
67    T: Clone,
68{
69    fn into(self) -> Layer<T> {
70        Layer::new(vec![self])
71    }
72}