@@ -7,7 +7,7 @@ import gleam/order
7
7
import lustre
8
8
import lustre/attribute . { type Attribute }
9
9
import lustre/effect . { type Effect }
10
- import lustre/element
10
+ import lustre/element . { type Element }
11
11
import lustre/element/html
12
12
import lustre/event
13
13
@@ -158,7 +158,7 @@ fn update(model: Model, msg: Msg) -> #(Model, Effect(Msg)) {
158
158
159
159
// VIEW -----------------------------------------------------------------------
160
160
161
- fn view ( model : Model ) {
161
+ fn view ( model : Model ) -> Element ( Msg ) {
162
162
html . div ( [ ] , [
163
163
html . div ( [ attribute . class ( "todoapp" ) ] , [
164
164
header ( model ) ,
@@ -169,14 +169,14 @@ fn view(model: Model) {
169
169
] )
170
170
}
171
171
172
- fn header ( model : Model ) {
172
+ fn header ( model : Model ) -> Element ( Msg ) {
173
173
html . header ( [ attribute . class ( "header" ) ] , [
174
174
html . h1 ( [ ] , [ html . text ( "todos" ) ] ) ,
175
175
new_todo ( model ) ,
176
176
] )
177
177
}
178
178
179
- fn main_content ( model : Model ) {
179
+ fn main_content ( model : Model ) -> Element ( Msg ) {
180
180
let visible_todos = case model . filter {
181
181
All ->
182
182
dict . values ( model . todos )
@@ -197,7 +197,7 @@ fn main_content(model: Model) {
197
197
] )
198
198
}
199
199
200
- fn footer ( model : Model ) {
200
+ fn footer ( model : Model ) -> Element ( Msg ) {
201
201
let active_count =
202
202
dict . values ( model . todos )
203
203
|> list . count ( fn ( i ) { ! i . completed } )
@@ -208,7 +208,7 @@ fn footer(model: Model) {
208
208
] )
209
209
}
210
210
211
- fn new_todo ( model : Model ) {
211
+ fn new_todo ( model : Model ) -> Element ( Msg ) {
212
212
html . div ( [ attribute . class ( "view" ) ] , [
213
213
input (
214
214
on_enter : on_enter ( UserAddedTodo ) ,
@@ -222,7 +222,7 @@ fn new_todo(model: Model) {
222
222
] )
223
223
}
224
224
225
- fn toggle ( visible_todos : List ( Todo ) ) {
225
+ fn toggle ( visible_todos : List ( Todo ) ) -> Element ( Msg ) {
226
226
use <- bool . guard ( list . is_empty ( visible_todos ) , element . none ( ) )
227
227
228
228
html . div ( [ attribute . class ( "toggle-all-container" ) ] , [
@@ -239,12 +239,12 @@ fn toggle(visible_todos: List(Todo)) {
239
239
] )
240
240
}
241
241
242
- fn todo_list ( visible_todos : List ( Todo ) , model : Model ) {
242
+ fn todo_list ( visible_todos : List ( Todo ) , model : Model ) -> Element ( Msg ) {
243
243
let items = list . map ( visible_todos , todo_item ( _, model ) )
244
244
html . ul ( [ attribute . class ( "todo-list" ) ] , items )
245
245
}
246
246
247
- fn todo_item ( item : Todo , model : Model ) {
247
+ fn todo_item ( item : Todo , model : Model ) -> Element ( Msg ) {
248
248
let cn = case item . completed {
249
249
True -> "completed"
250
250
False -> ""
@@ -258,7 +258,7 @@ fn todo_item(item: Todo, model: Model) {
258
258
html . li ( [ attribute . class ( cn ) ] , [ el ] )
259
259
}
260
260
261
- fn todo_item_edit ( item : Todo , model : Model ) {
261
+ fn todo_item_edit ( item : Todo , model : Model ) -> Element ( Msg ) {
262
262
html . div ( [ attribute . class ( "view" ) ] , [
263
263
input (
264
264
on_enter : on_enter ( UserEditedTodo ( item . id ) ) ,
@@ -272,7 +272,7 @@ fn todo_item_edit(item: Todo, model: Model) {
272
272
] )
273
273
}
274
274
275
- fn todo_item_not_edit ( item : Todo ) {
275
+ fn todo_item_not_edit ( item : Todo ) -> Element ( Msg ) {
276
276
html . div ( [ attribute . class ( "view" ) ] , [
277
277
html . input ( [
278
278
attribute . class ( "toggle" ) ,
@@ -291,21 +291,21 @@ fn todo_item_not_edit(item: Todo) {
291
291
] )
292
292
}
293
293
294
- fn todo_count ( count : Int ) {
294
+ fn todo_count ( count : Int ) -> Element ( c ) {
295
295
let text = case count {
296
296
1 -> "1 item left!"
297
297
n -> int . to_string ( n ) <> " items left!"
298
298
}
299
299
html . span ( [ attribute . class ( "todo-count" ) ] , [ html . text ( text ) ] )
300
300
}
301
301
302
- fn filters ( current : Filter ) {
302
+ fn filters ( current : Filter ) -> Element ( Msg ) {
303
303
[ All , Active , Completed ]
304
304
|> list . map ( filter_item ( _, current ) )
305
305
|> html . ul ( [ attribute . class ( "filters" ) ] , _)
306
306
}
307
307
308
- fn filter_item ( item : Filter , current : Filter ) {
308
+ fn filter_item ( item : Filter , current : Filter ) -> Element ( Msg ) {
309
309
let cn = case item == current {
310
310
True -> "selected"
311
311
False -> ""
@@ -323,7 +323,7 @@ fn filter_item(item: Filter, current: Filter) {
323
323
] )
324
324
}
325
325
326
- fn clear_completed ( model : Model ) {
326
+ fn clear_completed ( model : Model ) -> Element ( Msg ) {
327
327
let disabled = dict . is_empty ( model . todos )
328
328
html . button (
329
329
[
@@ -343,7 +343,7 @@ fn input(
343
343
autofocus autofocus : Bool ,
344
344
label label : String ,
345
345
value value : String ,
346
- ) {
346
+ ) -> Element ( Msg ) {
347
347
html . div ( [ attribute . class ( "input-container" ) ] , [
348
348
html . input ( [
349
349
attribute . class ( "new-todo" ) ,
@@ -363,18 +363,18 @@ fn input(
363
363
] )
364
364
}
365
365
366
- fn edit_message ( ) {
366
+ fn edit_message ( ) -> Element ( b ) {
367
367
html . footer ( [ attribute . class ( "info" ) ] , [
368
368
html . p ( [ ] , [ html . text ( "Double-click to edit a todo" ) ] ) ,
369
369
] )
370
370
}
371
371
372
- fn delete_todo ( id : Int ) {
372
+ fn delete_todo ( id : Int ) -> Effect ( Msg ) {
373
373
use dispatch <- effect . from
374
374
dispatch ( UserDeletedTodo ( id ) )
375
375
}
376
376
377
- fn on_double_click ( msg : Msg ) {
377
+ fn on_double_click ( msg : Msg ) -> Attribute ( Msg ) {
378
378
use _ <- event . on ( "dblclick" )
379
379
Ok ( msg )
380
380
}
0 commit comments