Files
clojure-tui/examples/counter.clj
2026-02-03 13:01:10 -05:00

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))))