|
@@ -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
|