aboutsummaryrefslogtreecommitdiff
path: root/test/example/main.gleam
diff options
context:
space:
mode:
authorHayleigh Thompson <me@hayleigh.dev>2022-05-14 11:44:08 +0100
committerHayleigh Thompson <me@hayleigh.dev>2022-05-14 11:44:08 +0100
commit525e80d12eaee4f1a1ac26a128166ffef177c613 (patch)
treece5279f5deec21de87f8c1b7e69f5c352f7df36a /test/example/main.gleam
parentfc1b5c00e21983b3ba13c5a374baf34e4fba834f (diff)
downloadlustre-525e80d12eaee4f1a1ac26a128166ffef177c613.tar.gz
lustre-525e80d12eaee4f1a1ac26a128166ffef177c613.zip
:truck: Move examples around to support multiple apps at once.
Diffstat (limited to 'test/example/main.gleam')
-rw-r--r--test/example/main.gleam66
1 files changed, 45 insertions, 21 deletions
diff --git a/test/example/main.gleam b/test/example/main.gleam
index cd9a71e..f08997a 100644
--- a/test/example/main.gleam
+++ b/test/example/main.gleam
@@ -1,35 +1,59 @@
-import gleam/int
-import lustre
-import lustre/attribute.{ style }
-import lustre/element.{ button, div, p, text }
-import lustre/event.{ dispatch, on_click }
+// IMPORTS ---------------------------------------------------------------------
-pub fn main () {
+import lustre.{ Element }
+import lustre/element
+
+import example/application/counter
+
+// MAIN ------------------------------------------------------------------------
+
+pub fn main () -> Nil {
let selector = "[data-lustre-container]"
- let program = lustre.application(0, update, render)
+ let program = lustre.application(init(), update, render)
+
+ // `lustre.start` can return an `Error` if no DOM element is found that matches
+ // the selector. This is a fatal error for our examples, so we panic if that
+ // happens.
+ assert Ok(_) = lustre.start(program, selector)
+
+ Nil
+}
- lustre.start(program, selector)
+// STATE -----------------------------------------------------------------------
+
+type State {
+ State(
+ counter: counter.State
+ )
+}
+
+fn init () -> State {
+ State(
+ counter: counter.init()
+ )
}
+// UPDATE ----------------------------------------------------------------------
+
type Action {
- Incr
- Decr
+ Counter(counter.Action)
}
-fn update (state, action) {
+fn update (state: State, action: Action) -> State {
case action {
- Incr ->
- state + 1
-
- Decr ->
- state - 1
+ Counter(counter_action) ->
+ State(counter: counter.update(state.counter, counter_action))
}
}
-fn render (state) {
- div([ style([ #("display", "flex") ]) ], [
- button([ on_click(dispatch(Decr)) ], [ text("-") ]),
- p([], [ int.to_string(state) |> text ]),
- button([ on_click(dispatch(Incr)) ], [ text("+") ])
+// RENDER ----------------------------------------------------------------------
+
+fn render (state: State) -> Element(Action) {
+ element.div([], [
+ element.details([], [
+ element.summary([], [ element.text("Counter") ]),
+ counter.render(state.counter)
+ |> element.map(Counter)
+ ])
])
}