use crate::{
error::EvaluationFailure,
ufc::{Allocation, Assignment, Condition, Flag, RuleWire, Shard, Split},
AttributeValue, Configuration, Str,
};
use super::{eval_assignment::AllocationNonMatchReason, eval_bandits::BanditResult};
pub(super) trait EvalBanditVisitor {
type AssignmentVisitor<'a>: EvalAssignmentVisitor + 'a
where
Self: 'a;
fn on_configuration(&mut self, configuration: &Configuration);
fn visit_assignment<'a>(&'a mut self) -> Self::AssignmentVisitor<'a>;
fn on_bandit_key(&mut self, key: &Str);
fn on_result(&mut self, failure: Result<(), EvaluationFailure>, result: &BanditResult);
}
pub(super) trait EvalAssignmentVisitor {
type AllocationVisitor<'a>: EvalAllocationVisitor + 'a
where
Self: 'a;
fn on_configuration(&mut self, configuration: &Configuration);
fn on_flag_configuration(&mut self, flag: &Flag);
fn visit_allocation<'a>(&'a mut self, allocation: &Allocation) -> Self::AllocationVisitor<'a>;
fn on_result(&mut self, result: &Result<Assignment, EvaluationFailure>);
}
pub(super) trait EvalAllocationVisitor {
type RuleVisitor<'a>: EvalRuleVisitor + 'a
where
Self: 'a;
type SplitVisitor<'a>: EvalSplitVisitor + 'a
where
Self: 'a;
fn visit_rule<'a>(&'a mut self, rule: &RuleWire) -> Self::RuleVisitor<'a>;
fn visit_split<'a>(&'a mut self, split: &Split) -> Self::SplitVisitor<'a>;
fn on_result(&mut self, result: Result<&Split, AllocationNonMatchReason>);
}
pub(super) trait EvalRuleVisitor {
fn on_condition_eval(
&mut self,
condition: &Condition,
attribute_value: Option<&AttributeValue>,
result: bool,
);
fn on_result(&mut self, result: bool);
}
pub(super) trait EvalSplitVisitor {
fn on_shard_eval(&mut self, shard: &Shard, shard_value: u32, matches: bool);
fn on_result(&mut self, matches: bool);
}
pub(super) struct NoopEvalVisitor;
impl EvalBanditVisitor for NoopEvalVisitor {
type AssignmentVisitor<'a> = NoopEvalVisitor;
#[inline]
fn on_configuration(&mut self, _configuration: &Configuration) {}
#[inline]
fn on_bandit_key(&mut self, _key: &Str) {}
#[inline]
fn visit_assignment<'a>(&'a mut self) -> NoopEvalVisitor {
NoopEvalVisitor
}
#[inline]
fn on_result(&mut self, _failure: Result<(), EvaluationFailure>, _result: &BanditResult) {}
}
impl EvalAssignmentVisitor for NoopEvalVisitor {
type AllocationVisitor<'a> = NoopEvalVisitor;
#[inline]
fn visit_allocation<'a>(&'a mut self, _allocation: &Allocation) -> Self::AllocationVisitor<'a> {
NoopEvalVisitor
}
#[inline]
fn on_configuration(&mut self, _configuration: &Configuration) {}
#[inline]
fn on_flag_configuration(&mut self, _flag: &Flag) {}
#[inline]
fn on_result(&mut self, _result: &Result<Assignment, EvaluationFailure>) {}
}
impl EvalAllocationVisitor for NoopEvalVisitor {
type RuleVisitor<'a> = NoopEvalVisitor;
type SplitVisitor<'a> = NoopEvalVisitor;
#[inline]
fn visit_rule<'a>(&'a mut self, _rule: &RuleWire) -> Self::RuleVisitor<'a> {
NoopEvalVisitor
}
#[inline]
fn visit_split<'a>(&'a mut self, _split: &Split) -> Self::SplitVisitor<'a> {
NoopEvalVisitor
}
#[inline]
fn on_result(&mut self, _result: Result<&Split, AllocationNonMatchReason>) {}
}
impl EvalRuleVisitor for NoopEvalVisitor {
#[inline]
fn on_condition_eval(
&mut self,
_condition: &Condition,
_attribute_value: Option<&AttributeValue>,
_result: bool,
) {
}
#[inline]
fn on_result(&mut self, _result: bool) {}
}
impl EvalSplitVisitor for NoopEvalVisitor {
#[inline]
fn on_shard_eval(&mut self, _shard: &Shard, _shard_value: u32, _matches: bool) {}
#[inline]
fn on_result(&mut self, _matches: bool) {}
}