#![forbid(unsafe_code)]
use crate::dsfb::features::Channel;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SearchStrategy {
Narrow,
Balanced,
Broad,
}
impl SearchStrategy {
pub const fn budget(self) -> usize {
match self {
SearchStrategy::Narrow => 4,
SearchStrategy::Balanced => 12,
SearchStrategy::Broad => 32,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SearchPlan {
pub ordered_channels: Vec<Channel>,
pub strategy: SearchStrategy,
pub budget: usize,
}
impl SearchPlan {
pub fn should_evaluate(&self, channel: Channel, position: usize) -> bool {
position < self.budget && self.ordered_channels.get(position) == Some(&channel)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn plan_order_is_trust_descending() {
let plan = SearchPlan {
ordered_channels: vec![
Channel::PrevVersion,
Channel::Rans,
Channel::Raw,
Channel::Adjacent,
Channel::SharedContent,
Channel::PrevInFile,
Channel::FamilyBase,
Channel::Universe,
],
strategy: SearchStrategy::Balanced,
budget: 12,
};
assert!(plan.should_evaluate(Channel::PrevVersion, 0));
assert!(plan.should_evaluate(Channel::Rans, 1));
}
}