Skip to content

Instantly share code, notes, and snippets.

@sonnym
Created December 13, 2014 00:28
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sonnym/5d0314f6cb18fae0aa71 to your computer and use it in GitHub Desktop.
Save sonnym/5d0314f6cb18fae0aa71 to your computer and use it in GitHub Desktop.
Crash elm
import Signal ((<~), Signal)
import Signal
import List ((::))
import List
import Time
import Random
import Color (rgb)
import Graphics.Element (Element, flow, right, down, container, topLeft, spacer, color)
cellSize = 5
(columns, rows) = (35, 35)
main : Signal Element
main = renderGrid <~ (seededGrid <~ initialSeed)
initialSeed : Signal Random.Seed
initialSeed = (\(time, _) -> Random.initialSeed (round time)) <~ Time.timestamp (Signal.constant ())
seededGrid : Random.Seed -> List (List Bool)
seededGrid seed =
let (lst, _) = Random.generate (Random.list (columns * rows) (Random.int 0 1)) seed
in generateGrid lst
generateGrid : List Int -> List (List Bool)
generateGrid seeds = List.map generateRow (groupInto rows seeds)
generateRow : List Int -> List Bool
generateRow seeds = List.map (\n -> n == 1) seeds
renderGrid : List (List Bool) -> Element
renderGrid grid =
grid
|> List.map renderRow
|> List.map (flow right)
|> flow down
|> container (cellSize * columns) (cellSize * rows) topLeft
renderRow : List Bool -> List Element
renderRow row = List.map renderCell row
renderCell : Bool -> Element
renderCell on =
spacer cellSize cellSize
|> color (if on then (rgb 0 0 0) else (rgb 255 255 255))
groupInto : Int -> List a -> List (List a)
groupInto groups initial =
let
len = List.length initial
n = len // groups
in
List.repeat groups []
|> List.indexedMap (\i _ ->
List.take n (List.drop (n * i) initial))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment