content: {-# LANGUAGE OverloadedStrings #-}
  
  module Main where
  
  import Brillo
  import Cell
  import Data.Vector qualified as Vec
  import World
  
  
  main :: IO ()
  main =
    do
      let width = 150
      let height = 100
      world <- randomWorld (width, height)
  
      simulate
        ( InWindow
            "John Conway's Game of Life"
            (windowSizeOfWorld world)
            (5, 5)
        )
        white
        10
        world
        drawWorld
        simulateWorld
  
  
  -- | Convert a world to a picture.
  drawWorld ::
    World ->
    Picture
  drawWorld world =
    let (windowWidth, windowHeight) =
          windowSizeOfWorld world
  
        offsetX = -fromIntegral windowWidth / 2
        offsetY = -fromIntegral windowHeight / 2
    in  Translate offsetX offsetY $
          Pictures $
            Vec.toList $
              Vec.imap (drawCell world) (worldCells world)
  
  
  -- | Convert a cell at a particular coordinate to a picture.
  drawCell :: World -> Index -> Cell -> Picture
  drawCell world index cell =
    let cs = fromIntegral (worldCellSize world)
        cp = fromIntegral (worldCellSpace world)
  
        (x, y) = coordOfIndex world index
        fx = fromIntegral x * (cs + cp) + 1
        fy = fromIntegral y * (cs + cp) + 1
    in  pictureOfCell
          (worldCellOldAge world)
          (worldCellSize world)
          fx
          fy
          cell
  
  
  -- | Get the size of the window needed to display a world.
  windowSizeOfWorld :: World -> (Int, Int)
  windowSizeOfWorld world =
    let cellSize = worldCellSize world
        cellSpace = worldCellSpace world
        cellPad = cellSize + cellSpace
        height = cellPad * (worldHeight world) + cellSpace
        width = cellPad * (worldWidth world) + cellSpace
    in  (width, height)
  