use crate::State;
pub trait Observer<S: State> {
type Observation;
fn measure(state: &S, params: &S::Params) -> Self::Observation;
fn every() -> usize;
fn after() -> usize;
}
pub trait DynObserver<S: State> {
type Observation;
fn measure(&self, state: &S, params: &S::Params) -> Self::Observation;
fn every(&self) -> usize;
fn after(&self) -> usize;
}
impl<O, S: State> DynObserver<S> for O
where
O: Observer<S>,
{
type Observation = O::Observation;
fn after(&self) -> usize {
O::after()
}
fn every(&self) -> usize {
O::every()
}
fn measure(&self, state: &S, params: &<S as State>::Params) -> Self::Observation {
O::measure(state, params)
}
}