{-# LANGUAGE CPP #-} -- -- A cellular automata simulation -- -- friends import Config import Monitoring import ParseArgs import SmoothLife import Gloss.Draw import Random.Array import Random.Splat -- system import Prelude as P import Data.Array.Accelerate as A import Data.Label import Control.Exception import System.Environment import Graphics.Gloss import Criterion.Main ( defaultMainWith, bench, whnf ) main :: IO () main = do beginMonitoring argv <- getArgs (conf, cconf, nops) <- parseArgs configHelp configBackend options defaults header footer argv let -- visualisation configuration n = get configWindowSize conf zoom = get configWindowZoom conf fps = get configFramerate conf (ra,rb) = get configDiscRadius conf dish = Z :. n :. n width = n * zoom height = n * zoom backend = get configBackend conf scheme = get configColourScheme conf render = draw conf . run1 backend (colourise scheme) advance = run1 backend (smoothlife conf) -- initialise with patches of random data dots <- randomCircles dish ra rb agar <- randomArrayWithSystemRandom (splat dots) dish world <- evaluate (advance agar) -- Rise minions! if get configBenchmark conf then withArgs nops $ defaultMainWith cconf (return ()) [ bench "smoothlife" $ whnf advance world ] #ifndef ACCELERATE_ENABLE_GUI else return () #else else play (InWindow "Smooth Life" (width, height) (10, 20)) black fps world render (\_ -> id) (\_ -> advance) #endif