port module MoreRandomWithMemory0 exposing (main) import Browser import Browser.Events import Json.Decode as Decode import Html exposing (Html) import Html.Attributes as Attr import Random -- MODEL type alias Model = { randomNumbers : List Int } initModel = { randomNumbers = [] } -- UPDATE type Msg = Noop | Reset | MouseClick | RandomNumber Int | ReceiveNumbers (List Int) update : Msg -> Model -> (Model, Cmd Msg) update msg model = case msg of Noop -> (model, Cmd.none) Reset -> (initModel, clearNumbers ()) MouseClick -> (model, Random.generate RandomNumber (Random.int 1 10)) RandomNumber i -> let nums = i :: model.randomNumbers in ({ randomNumbers = nums }, saveNumbers nums) ReceiveNumbers nums -> ({ randomNumbers = nums }, 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) , receiveNumbers ReceiveNumbers ] -- MAIN type alias Flags = () init : Flags -> (Model, Cmd Msg) init () = (initModel, requestNumbers ()) main : Program Flags Model Msg main = Browser.element { init = init , view = view , update = update , subscriptions = subscriptions } -- PORTS for loading/clearing/saving numbers in local storage -------- port requestNumbers : () -> Cmd msg port receiveNumbers : (List Int -> msg) -> Sub msg port clearNumbers : () -> Cmd msg port saveNumbers : List Int -> Cmd msg