Skip to main content

module_util/evaluator/metrics/
mod.rs

1//! [`Evaluator`] adapter for collecting metrics.
2
3use std::collections::HashSet;
4use std::hash::Hash;
5
6use super::{Evaluator, Imports};
7
8///////////////////////////////////////////////////////////////////////////////
9
10/// An [`Evaluator`] adapter that collects metrics during evaluation.
11#[derive(Debug, Clone)]
12pub struct Metrics<E>
13where
14    E: Evaluator,
15{
16    evaluator: E,
17
18    /// Set of all evaluated modules.
19    pub modules: HashSet<E::Id>,
20}
21
22impl<E> Metrics<E>
23where
24    E: Evaluator,
25{
26    /// Create a new [`Metrics`] adapter.
27    pub fn new(evaluator: E) -> Self {
28        Self {
29            evaluator,
30            modules: HashSet::new(),
31        }
32    }
33}
34
35impl<E> Default for Metrics<E>
36where
37    E: Evaluator + Default,
38{
39    fn default() -> Self {
40        Self::new(Default::default())
41    }
42}
43
44impl<E> Metrics<E>
45where
46    E: Evaluator + Default,
47{
48    /// Get a reference to the inner evaluator.
49    pub fn get(&self) -> &E {
50        &self.evaluator
51    }
52
53    /// Get a mutable reference to the inner evaluator.
54    pub fn get_mut(&mut self) -> &mut E {
55        &mut self.evaluator
56    }
57}
58
59impl<E> Evaluator for Metrics<E>
60where
61    E: Evaluator,
62    E::Id: Clone + Eq + Hash,
63{
64    type Id = E::Id;
65    type Module = E::Module;
66    type Error = E::Error;
67
68    fn is_empty(&self) -> bool {
69        self.evaluator.is_empty()
70    }
71
72    fn next(&mut self) -> Option<Self::Id> {
73        self.evaluator.next()
74    }
75
76    fn eval(
77        &mut self,
78        id: Self::Id,
79        imports: Imports<Self::Id>,
80        module: Self::Module,
81    ) -> Result<(), Self::Error> {
82        self.modules.insert(id.clone());
83        self.evaluator.eval(id, imports, module)
84    }
85
86    fn finish(self) -> Option<Self::Module> {
87        self.evaluator.finish()
88    }
89}