aboutsummaryrefslogtreecommitdiff
path: root/src/Views.elm
blob: b56a945777b928fbc6d8d8f7c4b36a893ea0a6df (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
module Views exposing (..)

import Array exposing (..)
import Base exposing (..)
import Css exposing (..)
import Html
import Html.Styled exposing (..)
import Html.Styled.Events exposing (onClick)
import Styles exposing (styledListItem, styledUnorderedList)
import Time exposing (Posix, toHour, toMinute, toSecond, utc)
import Utils exposing (diffDuration, wordCountWith)


viewTime : Posix -> String
viewTime t =
    let
        hh =
            toHour utc t

        mm =
            toMinute utc t

        ss =
            toSecond utc t
    in
    String.join ":" (List.map String.fromInt [ hh, mm, ss ])


viewWpm : Model -> String
viewWpm model =
    let
        t1 =
            model.begin

        t2 =
            model.end

        duration =
            Maybe.map2 diffDuration t1 t2

        correctWords =
            wordCountWith model.words ((==) Correct)

        wpm =
            Maybe.map (String.fromInt << truncate << (*) 60 << (/) (toFloat correctWords)) duration
    in
    Maybe.withDefault "XX" wpm


viewProgress : Model -> String
viewProgress model =
    let
        soFar =
            model.currentWord + 1

        total =
            model.config.length
    in
    String.fromInt soFar ++ ":" ++ String.fromInt total


viewAccuracy : Array Word -> String
viewAccuracy words =
    let
        wordsAttempted =
            toFloat <| wordCountWith words ((/=) Todo)

        correctCount =
            toFloat <| wordCountWith words ((==) Correct)

        accuracy =
            if wordsAttempted == 0.0 then
                Nothing

            else
                Just <| correctCount / wordsAttempted * 100
    in
    case accuracy of
        Nothing ->
            "XX"

        Just a ->
            String.fromInt <| truncate a


viewWordLengthOptions : Html Msg
viewWordLengthOptions =
    let
        wl =
            [ 10, 25, 50, 100 ]
    in
    styledUnorderedList []
        (List.map
            (\len ->
                styledListItem
                    [ onClick (Base.WordLengthChanged len) ]
                    [ text <| String.fromInt len ]
            )
            wl
        )


viewStats : Model -> Html Msg
viewStats model =
    styledUnorderedList []
        [ styledListItem [] [ text ("WPM " ++ viewWpm model) ]
        , styledListItem [] [ text ("ACC " ++ viewAccuracy model.words) ]
        , styledListItem [] [ text ("POS " ++ viewProgress model) ]
        ]