113 lines
1.7 KiB
Elm
113 lines
1.7 KiB
Elm
module Main exposing (..)
|
|
|
|
import Browser
|
|
import Html exposing (Html, div, pre, text)
|
|
import Html.Events exposing (onClick)
|
|
import Time
|
|
|
|
|
|
message : String
|
|
message =
|
|
"Hello World! "
|
|
|
|
|
|
main : Program () Model Msg
|
|
main =
|
|
Browser.element
|
|
{ init = init
|
|
, update = update
|
|
, subscriptions = subscriptions
|
|
, view = view
|
|
}
|
|
|
|
|
|
|
|
-- MODEL
|
|
|
|
|
|
type Direction
|
|
= Forwards
|
|
| Backwards
|
|
|
|
|
|
type alias Model =
|
|
{ time : Int
|
|
, direction : Direction
|
|
}
|
|
|
|
|
|
init : () -> ( Model, Cmd Msg )
|
|
init _ =
|
|
( { time = 0, direction = Forwards }, Cmd.none )
|
|
|
|
|
|
|
|
-- UPDATE
|
|
|
|
|
|
type Msg
|
|
= Tick
|
|
| SwitchDirection
|
|
|
|
|
|
switchDirection : Direction -> Direction
|
|
switchDirection d =
|
|
case d of
|
|
Forwards ->
|
|
Backwards
|
|
|
|
Backwards ->
|
|
Forwards
|
|
|
|
|
|
update : Msg -> Model -> ( Model, Cmd Msg )
|
|
update msg model =
|
|
let
|
|
nextTime =
|
|
case model.direction of
|
|
Forwards ->
|
|
model.time - 1
|
|
|
|
Backwards ->
|
|
model.time + 1
|
|
in
|
|
case msg of
|
|
Tick ->
|
|
( { model | time = modBy (String.length message) nextTime }, Cmd.none )
|
|
|
|
SwitchDirection ->
|
|
( { model | direction = switchDirection model.direction }, Cmd.none )
|
|
|
|
|
|
|
|
-- SUBSCRIPTIONS
|
|
|
|
|
|
subscriptions : Model -> Sub Msg
|
|
subscriptions _ =
|
|
Time.every 200 (\_ -> Tick)
|
|
|
|
|
|
|
|
-- VIEW
|
|
|
|
|
|
rotate : String -> Int -> String
|
|
rotate m x =
|
|
let
|
|
end =
|
|
String.slice x (String.length m) m
|
|
|
|
beginning =
|
|
String.slice 0 x m
|
|
in
|
|
end ++ beginning
|
|
|
|
|
|
view : Model -> Html Msg
|
|
view model =
|
|
div []
|
|
[ pre [ onClick SwitchDirection ]
|
|
[ text <| rotate message model.time ]
|
|
]
|