psyche_utils/bucket_strainer/
bucket.rs1use crate::bucket_strainer::{Layer, Rule};
2use crate::Scalar;
3use std::mem;
4
5#[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}