-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMain.gren
104 lines (84 loc) · 2.18 KB
/
Main.gren
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
module Main exposing (main)
import Ansi
import Init
import Math
import Node
import Time
import Stream exposing (Stream)
import Task
import Tui
import UI
import UI.Attribute
main : Tui.Program Model Msg
main =
Tui.defineProgram
{ init = init
, update = update
, view = view
, subscriptions = subscriptions
, onInput = GotInput
}
type alias Model =
{ progress : Int
, stdout : Stream
}
init : Tui.Environment -> Init.Task { model : Model, command : Cmd Msg }
init env =
Node.startProgram
{ model =
{ progress = 0
, stdout = env.stdout
}
, command =
Tui.hideCursor env.stdout
|> Task.execute
}
type Msg
= Tick Time.Posix
| GotInput Tui.Input
update : Msg -> Model -> { model : Model, command : Cmd Msg }
update msg model =
case msg of
Tick _ ->
{ model = { model | progress = model.progress + 1 }
, command =
if model.progress > 99 then
Tui.exit model.stdout
|> Task.execute
else
Cmd.none
}
GotInput input ->
{ model = model
, command =
case input of
Tui.Escape ->
Tui.exit model.stdout
|> Task.execute
_ ->
Cmd.none
}
view : Model -> UI.Element
view model =
let
barLength =
model.progress // 2
bar =
String.repeat barLength "█"
progress =
if model.progress < 100 then
model.progress
|> String.fromInt
|> String.padLeft 2 '0'
|> String.append "%"
else
"Done!"
in
UI.column []
[ UI.text [] <| "Progress: " ++ progress
, UI.text [ UI.Attribute.color Ansi.Magenta ] bar
, UI.text [ UI.Attribute.color Ansi.Yellow ] "Press Esc to quit."
]
subscriptions : Model -> Sub Msg
subscriptions model =
Time.every 40 Tick