package model;

import datastruct.Coordinate;
import datastruct.MatrixInitializer;

import java.util.ArrayList;
import java.util.List;

public class NextGenerationInitializer<S extends State<S>> implements MatrixInitializer<S> {

    private final CellGrid<S> grid;

    public NextGenerationInitializer(CellGrid<S> grid) {
        this.grid = grid;
    }

    @Override
    public S initialValueAt(Coordinate coordinate) {
        List<State<S>> neighbours = new ArrayList<>();
        for (Coordinate neighbourCoord : coordinate.orthodiagonalNeighbours()) {
            neighbours.add(this.grid.cellAtWrapped(neighbourCoord).getState());
        }
        S state = this.grid.cellAt(coordinate).getState();
        return state.update(neighbours);
    }
}