use num_traits::ToPrimitive;
use crate::Stepper;
pub trait Agent<T: ToPrimitive> {
fn action(&self) -> usize;
fn arms(&self) -> usize;
fn current_estimate(&self, arm: usize) -> f64;
fn reset(&mut self, q_init: &[f64]);
fn step(&mut self, arm: usize, reward: T);
}
pub(crate) fn update<T: ToPrimitive>(
stepper: &mut Box<dyn Stepper>,
q_star: &[f64],
arm: usize,
reward: T,
) -> f64 {
stepper.step(arm) * (reward.to_f64().unwrap() - q_star[arm])
}