58 lines
1.5 KiB
Clojure
58 lines
1.5 KiB
Clojure
(ns examples.counter
|
|
"Simple counter example - demonstrates basic Elm architecture.
|
|
Mirrors bubbletea's simple example."
|
|
(:require [tui.core :as tui]
|
|
[tui.events :as ev]))
|
|
|
|
;; === Model ===
|
|
(def initial-model
|
|
{:count 0})
|
|
|
|
;; === Update ===
|
|
(defn update-fn [{:keys [model event]}]
|
|
(cond
|
|
;; Quit on q or ctrl+c
|
|
(or (ev/key= event \q)
|
|
(ev/key= event \c #{:ctrl}))
|
|
{:model model :events [(ev/quit)]}
|
|
|
|
;; Increment on up/k
|
|
(or (ev/key= event :up)
|
|
(ev/key= event \k))
|
|
{:model (update model :count inc)}
|
|
|
|
;; Decrement on down/j
|
|
(or (ev/key= event :down)
|
|
(ev/key= event \j))
|
|
{:model (update model :count dec)}
|
|
|
|
;; Reset on r
|
|
(ev/key= event \r)
|
|
{:model (assoc model :count 0)}
|
|
|
|
:else
|
|
{:model model}))
|
|
|
|
;; === View ===
|
|
(defn view [{:keys [count]}]
|
|
[:col {:gap 1}
|
|
[:box {:border :rounded :padding [0 1]}
|
|
[:col
|
|
[:text {:bold true} "Counter"]
|
|
[:text ""]
|
|
[:text {:fg (cond
|
|
(pos? count) :green
|
|
(neg? count) :red
|
|
:else :default)}
|
|
(str "Count: " count)]]]
|
|
[:text {:fg :gray} "j/k or up/down: change value"]
|
|
[:text {:fg :gray} "r: reset q: quit"]])
|
|
|
|
;; === Main ===
|
|
(defn -main [& _args]
|
|
(println "Starting counter...")
|
|
(let [final-model (tui/run {:init initial-model
|
|
:update update-fn
|
|
:view view})]
|
|
(println "Final count:" (:count final-model))))
|