use std::{collections::BTreeMap, sync::Arc};
use crate::{
config::EvalId,
graph::{Evaluation, Evidence, Graph},
store::Request,
};
#[derive(Default)]
pub(super) struct Evaluated<'a> {
evaluation: Option<(Key, Arc<Evaluation<'a>>)>,
order: Option<(Gathered, Arc<[usize]>)>,
}
type Gathered = BTreeMap<EvalId, Evidence>;
type Key = (Gathered, bool);
impl<'a> Evaluated<'a> {
pub(super) fn evaluation(
&mut self,
graph: &'a Graph<'_>,
evidence: &BTreeMap<EvalId, Evidence>,
errors_block: bool,
) -> Arc<Evaluation<'a>> {
match &self.evaluation {
Some(((kept, blocks), evaluation)) if kept == evidence && *blocks == errors_block => {
evaluation.clone()
}
_ => {
let evaluation = Arc::new(graph.evaluate_for_run(evidence, errors_block));
self.evaluation = Some(((evidence.clone(), errors_block), evaluation.clone()));
evaluation
}
}
}
pub(super) fn order(
&mut self,
graph: &Graph<'_>,
requests: &[Request],
evidence: &BTreeMap<EvalId, Evidence>,
) -> Arc<[usize]> {
match &self.order {
Some((kept, order)) if kept == evidence => order.clone(),
_ => {
let order: Arc<[usize]> = super::modes::order(graph, requests, evidence).into();
self.order = Some((evidence.clone(), order.clone()));
order
}
}
}
}