module NotSoRandom0 exposing (main) import Browser import Browser.Events import Json.Decode as Decode import Html exposing (Html) import Html.Attributes as Attr import Random exposing (Seed) -- MODEL type alias Model = { seed : Seed , randomNumbers : List Int } initModel = { seed = Random.initialSeed 17 , randomNumbers = [] } -- UPDATE type Msg = Noop | Reset | MouseClick update : Msg -> Model -> (Model, Cmd Msg) update msg model = case msg of Noop -> (model, Cmd.none) Reset -> (initModel, Cmd.none) MouseClick -> let (i, newSeed) = Random.step (Random.int 1 10) model.seed in let randomNumbers = i :: model.randomNumbers in ({ seed = newSeed, randomNumbers = randomNumbers }, Cmd.none) -- VIEW view : Model -> Html Msg view model = let styles = [ ("position", "fixed") , ("top", "50%") , ("left", "50%") , ("transform", "translate(-50%, -50%)") ] display = Html.text <| "Random Numbers: " ++ Debug.toString (List.reverse model.randomNumbers) in Html.div (List.map (\(k, v) -> Attr.style k v) styles) [display] -- SUBSCRIPTIONS -- https://github.com/elm/browser/blob/1.0.0/notes/keyboard.md keyDecoder : Decode.Decoder String keyDecoder = Decode.field "key" Decode.string subscriptions : Model -> Sub Msg subscriptions model = Sub.batch [ Browser.Events.onMouseDown (Decode.succeed MouseClick) , Browser.Events.onKeyDown (Decode.map (\key -> if key == "Escape" then Reset else Noop) keyDecoder) ] -- MAIN type alias Flags = () init : Flags -> (Model, Cmd Msg) init () = (initModel, Cmd.none) main : Program Flags Model Msg main = Browser.element { init = init , view = view , update = update , subscriptions = subscriptions }