|  | @@ -7,8 +7,12 @@ import Html.Attributes exposing (id, class, classList, style)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import Array
 | 
	
		
			
				|  |  |  import Random
 | 
	
		
			
				|  |  | +import Window
 | 
	
		
			
				|  |  | +import Task
 | 
	
		
			
				|  |  |  import Time exposing (Time, second)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +cellSize : Int
 | 
	
		
			
				|  |  | +cellSize = 10 + 2
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  type Cell
 | 
	
		
			
				|  |  |      = Alive
 | 
	
	
		
			
				|  | @@ -20,6 +24,7 @@ type alias Rule = Int -> Cell -> Cell
 | 
	
		
			
				|  |  |  type alias Model =
 | 
	
		
			
				|  |  |      { board : Board
 | 
	
		
			
				|  |  |      , rule : Rule
 | 
	
		
			
				|  |  | +    , info : String
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  initModel : Model
 | 
	
	
		
			
				|  | @@ -38,6 +43,7 @@ initModel =
 | 
	
		
			
				|  |  |                      Alive
 | 
	
		
			
				|  |  |                  else
 | 
	
		
			
				|  |  |                      Dead)
 | 
	
		
			
				|  |  | +    , info = ""
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -45,6 +51,7 @@ type Msg
 | 
	
		
			
				|  |  |      = NoOp
 | 
	
		
			
				|  |  |      | Step
 | 
	
		
			
				|  |  |      | SetBoard Board
 | 
	
		
			
				|  |  | +    | InitializeBoard Window.Size
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  viewRow row =
 | 
	
	
		
			
				|  | @@ -68,12 +75,21 @@ viewRow row =
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  viewBoard : Board -> Html Msg
 | 
	
		
			
				|  |  |  viewBoard board =
 | 
	
		
			
				|  |  | -    table
 | 
	
		
			
				|  |  | -        []
 | 
	
		
			
				|  |  | -        <|
 | 
	
		
			
				|  |  | -        Array.toList
 | 
	
		
			
				|  |  | -        <|
 | 
	
		
			
				|  |  | -        Array.map (\r -> viewRow r) board
 | 
	
		
			
				|  |  | +    let
 | 
	
		
			
				|  |  | +        numCols =
 | 
	
		
			
				|  |  | +            Array.length <| Maybe.withDefault Array.empty <| Array.get 0 board
 | 
	
		
			
				|  |  | +        calculatedWidth = numCols * cellSize
 | 
	
		
			
				|  |  | +        tableWidth = (toString calculatedWidth) ++ "px"
 | 
	
		
			
				|  |  | +    in
 | 
	
		
			
				|  |  | +        table
 | 
	
		
			
				|  |  | +            [ style
 | 
	
		
			
				|  |  | +                [ ("width", tableWidth)
 | 
	
		
			
				|  |  | +                ]
 | 
	
		
			
				|  |  | +            ]
 | 
	
		
			
				|  |  | +            <|
 | 
	
		
			
				|  |  | +            Array.toList
 | 
	
		
			
				|  |  | +            <|
 | 
	
		
			
				|  |  | +            Array.map (\r -> viewRow r) board
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  view : Model -> Html Msg
 | 
	
		
			
				|  |  |  view model =
 | 
	
	
		
			
				|  | @@ -81,6 +97,9 @@ view model =
 | 
	
		
			
				|  |  |          [ onClick Step
 | 
	
		
			
				|  |  |          ]
 | 
	
		
			
				|  |  |          [ viewBoard model.board
 | 
	
		
			
				|  |  | +        , div
 | 
	
		
			
				|  |  | +            []
 | 
	
		
			
				|  |  | +            [ text model.info ]
 | 
	
		
			
				|  |  |          ]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  modify : Int -> Int -> Cell -> Board -> Board
 | 
	
	
		
			
				|  | @@ -142,6 +161,12 @@ update msg model =
 | 
	
		
			
				|  |  |              ( { model | board = step model.rule model.board }, Cmd.none )
 | 
	
		
			
				|  |  |          SetBoard board ->
 | 
	
		
			
				|  |  |              ( { model | board = board }, Cmd.none )
 | 
	
		
			
				|  |  | +        InitializeBoard size ->
 | 
	
		
			
				|  |  | +            let
 | 
	
		
			
				|  |  | +                numRows = size.height // cellSize
 | 
	
		
			
				|  |  | +                numCols = size.width // cellSize
 | 
	
		
			
				|  |  | +            in
 | 
	
		
			
				|  |  | +                ( model, Random.generate SetBoard (generateRandom numRows numCols) )
 | 
	
		
			
				|  |  |          _ ->
 | 
	
		
			
				|  |  |              ( model, Cmd.none )
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -152,12 +177,13 @@ generateRandom nr nc =
 | 
	
		
			
				|  |  |  subscriptions : Model -> Sub Msg
 | 
	
		
			
				|  |  |  subscriptions model =
 | 
	
		
			
				|  |  |      Sub.batch
 | 
	
		
			
				|  |  | -        [ Time.every (second*3) (\_ -> Step)
 | 
	
		
			
				|  |  | +        [ Time.every (second/3) (\_ -> Step)
 | 
	
		
			
				|  |  | +        , Window.resizes InitializeBoard
 | 
	
		
			
				|  |  |          ]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  main =
 | 
	
		
			
				|  |  |      Html.program
 | 
	
		
			
				|  |  | -        { init = (initModel, Random.generate SetBoard (generateRandom 50 100))
 | 
	
		
			
				|  |  | +        { init = (initModel, Task.perform InitializeBoard Window.size)
 | 
	
		
			
				|  |  |          , view = view
 | 
	
		
			
				|  |  |          , update = update
 | 
	
		
			
				|  |  |          , subscriptions = subscriptions
 |