packages feed

brillo-examples-2.0.0: picture/Conway/Main.hs

{-# 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)