use crate::action::ActionDescriptor;
use crate::grid::Grid2D;
use crate::params::{ParamDescriptor, ParamValue};
use crate::topology::NeighborhoodKind;
use crate::view::{StatDescriptor, StatValue};
pub trait GridModel: Send + Sync + 'static {
const NAME: &'static str;
const ID: &'static str;
const DESCRIPTION: &'static str;
const PALETTE: &'static [[u8; 4]];
const NEIGHBORHOOD: NeighborhoodKind;
const STATS: &'static [StatDescriptor];
const ACTIONS: &'static [ActionDescriptor] = &[];
type Params: Send + Sync;
fn param_descriptors() -> Vec<ParamDescriptor>;
fn from_params(params: &[ParamValue]) -> Self::Params;
fn init(grid: &mut Grid2D<u8>, params: &[ParamValue], rng: &mut u64);
fn step_cell(cell: u8, neighbors: &[u8], params: &Self::Params, rng: &mut u64) -> u8;
fn act(_action: usize, _grid: &mut Grid2D<u8>, _params: &[ParamValue], _rng: &mut u64) {}
fn stats(grid: &Grid2D<u8>) -> Vec<StatValue>;
}