/// Defines a single state which can use the current context to get the next data.
pub trait State: Sized {
    fn get_value(&self, at_idx: usize) -> f64;
    /// Updates the impact of the factor.
    /// For example, if data[0] has been accessed, we increase the index so data[1] is accessed next (in classification).
    /// In RL, we act on the environment and internally update the termination state, and hold the new state.
    fn execute_action(&mut self, action: usize) -> f64;

    /// We take a mutable reference and return self.
    fn get(&mut self) -> Option<&mut Self>;
}

pub trait RlState: State {
    /// Returns true if episode count > MAX or terminal_signal sent from environment.
    fn is_terminal(&mut self) -> bool;

    // Returns the initial state.
    fn get_initial_state(&self) -> Vec<f64>;
}
